From d1b90db6d746137ff1e522d92154e212ff1875d4 Mon Sep 17 00:00:00 2001 From: Teddy Middleton-Smith Date: Wed, 15 Jan 2025 23:52:09 +0000 Subject: [PATCH] New website focusing on ERP services. --- app.py | 18 - business_objects/{store => }/access_level.py | 12 +- business_objects/store/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 210 -> 0 bytes .../__pycache__/access_level.cpython-312.pyc | Bin 6730 -> 0 bytes .../store/__pycache__/basket.cpython-312.pyc | Bin 10000 -> 0 bytes .../__pycache__/currency.cpython-312.pyc | Bin 6555 -> 0 bytes .../delivery_option.cpython-312.pyc | Bin 4224 -> 0 bytes .../delivery_region.cpython-312.pyc | Bin 4560 -> 0 bytes .../__pycache__/discount.cpython-312.pyc | Bin 4601 -> 0 bytes .../store/__pycache__/image.cpython-312.pyc | Bin 6072 -> 0 bytes .../store/__pycache__/order.cpython-312.pyc | Bin 4041 -> 0 bytes .../store/__pycache__/product.cpython-312.pyc | Bin 29972 -> 0 bytes .../product_category.cpython-312.pyc | Bin 31453 -> 0 bytes .../product_permutation.cpython-312.pyc | Bin 41762 -> 0 bytes .../__pycache__/product_price.cpython-312.pyc | Bin 5638 -> 0 bytes .../product_variation.cpython-312.pyc | Bin 11523 -> 0 bytes .../product_variation_tree.cpython-312.pyc | Bin 9128 -> 0 bytes .../product_variation_type.cpython-312.pyc | Bin 10054 -> 0 bytes .../__pycache__/stock_item.cpython-312.pyc | Bin 18280 -> 0 bytes .../__pycache__/store_base.cpython-312.pyc | Bin 6404 -> 0 bytes business_objects/store/basket.py | 184 - business_objects/store/delivery_option.py | 98 - business_objects/store/discount.py | 75 - business_objects/store/image.py | 131 - .../store/manufacturing_purchase_order.py | 354 - business_objects/store/order.py | 89 - business_objects/store/plant.py | 93 - business_objects/store/product.py | 917 -- business_objects/store/product_category.py | 529 -- business_objects/store/product_permutation.py | 617 -- business_objects/store/product_price.py | 106 - business_objects/store/product_variation.py | 217 - .../store/product_variation_tree.py | 161 - .../store/product_variation_type.py | 169 - business_objects/store/stock_item.py | 303 - business_objects/store/storage_location.py | 88 - business_objects/store/store_base.py | 129 - business_objects/store/stripe.py | 161 - business_objects/store/supplier.py | 200 - business_objects/store/supplier_address.py | 146 - .../store/supplier_purchase_order.py | 343 - controllers/core.py | 37 +- controllers/store/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 205 -> 0 bytes .../store/__pycache__/product.cpython-312.pyc | Bin 5200 -> 0 bytes .../product_category.cpython-312.pyc | Bin 5424 -> 0 bytes .../product_permutation.cpython-312.pyc | Bin 5446 -> 0 bytes .../__pycache__/stock_item.cpython-312.pyc | Bin 5194 -> 0 bytes .../store/__pycache__/store.cpython-312.pyc | Bin 2029 -> 0 bytes .../__pycache__/supplier.cpython-312.pyc | Bin 5257 -> 0 bytes .../store/manufacturing_purchase_order.py | 82 - controllers/store/pay_stripe.py | 167 - controllers/store/product.py | 86 - controllers/store/product_category.py | 104 - controllers/store/product_permutation.py | 90 - controllers/store/product_variation.py | 87 - controllers/store/stock_item.py | 107 - controllers/store/supplier.py | 83 - controllers/store/supplier_purchase_order.py | 82 - datastores/datastore_base.py | 13 +- datastores/datastore_store_basket.py | 143 - ...tore_store_manufacturing_purchase_order.py | 137 - datastores/datastore_store_product.py | 139 - .../datastore_store_product_category.py | 103 - .../datastore_store_product_permutation.py | 106 - .../datastore_store_product_variation.py | 77 - datastores/datastore_store_stock_item.py | 146 - datastores/datastore_store_supplier.py | 143 - ...datastore_store_supplier_purchase_order.py | 143 - datastores/datastore_user.py | 6 +- forms/contact.py | 33 + forms/store/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 199 -> 0 bytes .../store/__pycache__/product.cpython-312.pyc | Bin 2623 -> 0 bytes .../product_category.cpython-312.pyc | Bin 2527 -> 0 bytes .../product_permutation.cpython-312.pyc | Bin 4256 -> 0 bytes forms/store/manufacturing_purchase_order.py | 40 - forms/store/product.py | 43 - forms/store/product_category.py | 47 - forms/store/product_permutation.py | 68 - forms/store/product_variation.py | 38 - forms/store/stock_item.py | 76 - forms/store/supplier.py | 34 - forms/store/supplier_purchase_order.py | 40 - forms/unit_measurement.py | 6 +- .../model_view_base.cpython-38.pyc | Bin 15760 -> 15447 bytes .../model_view_contact.cpython-38.pyc | Bin 1439 -> 1571 bytes models/model_view_admin.py | 26 - models/model_view_admin_home.py | 27 - models/model_view_base.py | 44 +- models/model_view_contact.py | 19 +- models/model_view_services.py | 27 - models/model_view_store.py | 515 -- models/model_view_store_basket.py | 89 - models/model_view_store_checkout.py | 71 - models/model_view_store_checkout_success.py | 49 - models/model_view_store_home.py | 59 - ...view_store_manufacturing_purchase_order.py | 61 - models/model_view_store_product.py | 88 - models/model_view_store_product_category.py | 58 - .../model_view_store_product_permutation.py | 86 - models/model_view_store_product_variation.py | 54 - models/model_view_store_stock_item.py | 98 - models/model_view_store_supplier.py | 63 - ...odel_view_store_supplier_purchase_order.py | 62 - models/model_view_user.py | 7 +- package-lock.json | 2789 +++---- package.json | 3 + static/css/components/button.css | 45 +- static/css/components/card.css | 0 static/css/components/dialog.css | 0 static/css/components/form.css | 0 static/css/components/image.css | 4 - static/css/components/label.css | 26 - static/css/components/modal.css | 0 static/css/components/navigation.css | 0 static/css/components/overlay.css | 86 - static/css/components/table.css | 66 - static/css/layouts/footer.css | 68 +- static/css/layouts/header.css | 119 +- static/css/layouts/table-main.css | 41 - static/css/lib/utils.css | 22 + static/css/main.css | 283 +- static/css/pages/core/admin_home.css | 7 - static/css/pages/core/contact.css | 180 +- static/css/pages/core/home.css | 139 +- static/css/pages/core/services.css | 29 - static/css/pages/store/home.css | 0 .../store/manufacturing_purchase_order.css | 94 - static/css/pages/store/product_categories.css | 62 - .../css/pages/store/product_permutations.css | 120 - static/css/pages/store/product_variations.css | 46 - static/css/pages/store/products.css | 56 - static/css/pages/store/stock_items.css | 87 - static/css/pages/store/supplier.css | 59 - .../pages/store/supplier_purchase_order.css | 101 - static/css/sections/store.css | 56 - static/css/themes/light.css | 46 +- static/dist/css/core_contact.bundle.css | 180 +- static/dist/css/core_home.bundle.css | 144 +- static/dist/css/main.bundle.css | 802 +- static/dist/js/core_admin_home.bundle.js | 10 +- static/dist/js/core_contact.bundle.js | 10 +- static/dist/js/core_home.bundle.js | 10 +- static/dist/js/core_services.bundle.js | 10 +- .../legal_accessibility_statement.bundle.js | 10 +- static/dist/js/legal_license.bundle.js | 10 +- static/dist/js/legal_privacy_policy.bundle.js | 10 +- .../js/legal_retention_schedule.bundle.js | 10 +- static/dist/js/main.bundle.js | 7345 +++-------------- static/dist/js/store_home.bundle.js | 4 +- .../js/store_product_categories.bundle.js | 4 +- .../js/store_product_permutations.bundle.js | 4 +- static/dist/js/store_stock_items.bundle.js | 4 +- static/js/DEPRECATED/init.js | 3 - static/js/DEPRECATED/main.js | 65 - static/js/DEPRECATED/routing.js | 111 - static/js/app.js | 22 - static/js/dom.js | 1 + static/js/pages/base.js | 121 +- static/js/pages/core/admin_home.js | 46 - static/js/pages/core/contact.js | 7 + static/js/pages/core/home.js | 41 + static/js/pages/core/services.js | 19 - static/js/pages/store/basket.js | 198 - static/js/pages/store/home.js | 20 - .../store/manufacturing_purchase_orders.js | 509 -- static/js/pages/store/mixin.js | 452 - static/js/pages/store/mixin_table.js | 25 - static/js/pages/store/product_categories.js | 132 - static/js/pages/store/product_permutations.js | 361 - static/js/pages/store/product_variations.js | 240 - static/js/pages/store/products.js | 143 - static/js/pages/store/stock_items.js | 355 - .../pages/store/supplier_purchase_orders.js | 509 -- static/js/pages/store/suppliers.js | 381 - static/js/router.js | 182 +- static/js/sections/store.js | 0 .../DEPRECATED_block_store_product.html | 24 - .../DEPRECATED_block_store_product_price.html | 16 - .../DEPRECATED/DEPRECATED_page_home.html | 26 - .../DEPRECATED/DEPRECATEDlayout_store.html | 140 - .../_block_select_access_level.html | 5 - templates/DEPRECATED/_block_slider.html | 1 - .../_block_store_product_category_card.html | 9 - templates/DEPRECATED/layout - stripe.html | 66 - templates/layouts/layout.html | 298 +- templates/pages/core/_admin_home.html | 66 - templates/pages/core/_contact.html | 269 +- templates/pages/core/_home.html | 133 +- templates/pages/core/_services.html | 120 - templates/pages/legal/_privacy_policy.html | 2 +- templates/pages/store/_basket.html | 69 - templates/pages/store/_checkout_success.html | 46 - templates/pages/store/_home.html | 11 - .../store/_manufacturing_purchase_orders.html | 87 - .../pages/store/_product_categories.html | 71 - .../pages/store/_product_permutations.html | 137 - .../pages/store/_product_variations.html | 65 - templates/pages/store/_products.html | 83 - templates/pages/store/_stock_items.html | 133 - templates/pages/store/_supplier.html | 117 - .../store/_supplier_purchase_orders.html | 81 - templates/pages/store/_suppliers.html | 69 - todo.txt | 2 + webpack.config.js | 55 - 207 files changed, 3827 insertions(+), 24667 deletions(-) rename business_objects/{store => }/access_level.py (91%) delete mode 100644 business_objects/store/__init__.py delete mode 100644 business_objects/store/__pycache__/__init__.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/access_level.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/basket.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/currency.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/delivery_option.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/delivery_region.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/discount.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/image.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/order.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_category.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_permutation.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_price.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_variation.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_variation_tree.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/product_variation_type.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/stock_item.cpython-312.pyc delete mode 100644 business_objects/store/__pycache__/store_base.cpython-312.pyc delete mode 100644 business_objects/store/basket.py delete mode 100644 business_objects/store/delivery_option.py delete mode 100644 business_objects/store/discount.py delete mode 100644 business_objects/store/image.py delete mode 100644 business_objects/store/manufacturing_purchase_order.py delete mode 100644 business_objects/store/order.py delete mode 100644 business_objects/store/plant.py delete mode 100644 business_objects/store/product.py delete mode 100644 business_objects/store/product_category.py delete mode 100644 business_objects/store/product_permutation.py delete mode 100644 business_objects/store/product_price.py delete mode 100644 business_objects/store/product_variation.py delete mode 100644 business_objects/store/product_variation_tree.py delete mode 100644 business_objects/store/product_variation_type.py delete mode 100644 business_objects/store/stock_item.py delete mode 100644 business_objects/store/storage_location.py delete mode 100644 business_objects/store/store_base.py delete mode 100644 business_objects/store/stripe.py delete mode 100644 business_objects/store/supplier.py delete mode 100644 business_objects/store/supplier_address.py delete mode 100644 business_objects/store/supplier_purchase_order.py delete mode 100644 controllers/store/__init__.py delete mode 100644 controllers/store/__pycache__/__init__.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/product.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/product_category.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/product_permutation.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/stock_item.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/store.cpython-312.pyc delete mode 100644 controllers/store/__pycache__/supplier.cpython-312.pyc delete mode 100644 controllers/store/manufacturing_purchase_order.py delete mode 100644 controllers/store/pay_stripe.py delete mode 100644 controllers/store/product.py delete mode 100644 controllers/store/product_category.py delete mode 100644 controllers/store/product_permutation.py delete mode 100644 controllers/store/product_variation.py delete mode 100644 controllers/store/stock_item.py delete mode 100644 controllers/store/supplier.py delete mode 100644 controllers/store/supplier_purchase_order.py delete mode 100644 datastores/datastore_store_basket.py delete mode 100644 datastores/datastore_store_manufacturing_purchase_order.py delete mode 100644 datastores/datastore_store_product.py delete mode 100644 datastores/datastore_store_product_category.py delete mode 100644 datastores/datastore_store_product_permutation.py delete mode 100644 datastores/datastore_store_product_variation.py delete mode 100644 datastores/datastore_store_stock_item.py delete mode 100644 datastores/datastore_store_supplier.py delete mode 100644 datastores/datastore_store_supplier_purchase_order.py create mode 100644 forms/contact.py delete mode 100644 forms/store/__init__.py delete mode 100644 forms/store/__pycache__/__init__.cpython-312.pyc delete mode 100644 forms/store/__pycache__/product.cpython-312.pyc delete mode 100644 forms/store/__pycache__/product_category.cpython-312.pyc delete mode 100644 forms/store/__pycache__/product_permutation.cpython-312.pyc delete mode 100644 forms/store/manufacturing_purchase_order.py delete mode 100644 forms/store/product.py delete mode 100644 forms/store/product_category.py delete mode 100644 forms/store/product_permutation.py delete mode 100644 forms/store/product_variation.py delete mode 100644 forms/store/stock_item.py delete mode 100644 forms/store/supplier.py delete mode 100644 forms/store/supplier_purchase_order.py delete mode 100644 models/model_view_admin.py delete mode 100644 models/model_view_admin_home.py delete mode 100644 models/model_view_services.py delete mode 100644 models/model_view_store.py delete mode 100644 models/model_view_store_basket.py delete mode 100644 models/model_view_store_checkout.py delete mode 100644 models/model_view_store_checkout_success.py delete mode 100644 models/model_view_store_home.py delete mode 100644 models/model_view_store_manufacturing_purchase_order.py delete mode 100644 models/model_view_store_product.py delete mode 100644 models/model_view_store_product_category.py delete mode 100644 models/model_view_store_product_permutation.py delete mode 100644 models/model_view_store_product_variation.py delete mode 100644 models/model_view_store_stock_item.py delete mode 100644 models/model_view_store_supplier.py delete mode 100644 models/model_view_store_supplier_purchase_order.py delete mode 100644 static/css/components/card.css delete mode 100644 static/css/components/dialog.css delete mode 100644 static/css/components/form.css delete mode 100644 static/css/components/image.css delete mode 100644 static/css/components/label.css delete mode 100644 static/css/components/modal.css delete mode 100644 static/css/components/navigation.css delete mode 100644 static/css/components/overlay.css delete mode 100644 static/css/components/table.css delete mode 100644 static/css/layouts/table-main.css delete mode 100644 static/css/pages/core/admin_home.css delete mode 100644 static/css/pages/core/services.css delete mode 100644 static/css/pages/store/home.css delete mode 100644 static/css/pages/store/manufacturing_purchase_order.css delete mode 100644 static/css/pages/store/product_categories.css delete mode 100644 static/css/pages/store/product_permutations.css delete mode 100644 static/css/pages/store/product_variations.css delete mode 100644 static/css/pages/store/products.css delete mode 100644 static/css/pages/store/stock_items.css delete mode 100644 static/css/pages/store/supplier.css delete mode 100644 static/css/pages/store/supplier_purchase_order.css delete mode 100644 static/css/sections/store.css delete mode 100644 static/js/DEPRECATED/init.js delete mode 100644 static/js/DEPRECATED/main.js delete mode 100644 static/js/DEPRECATED/routing.js delete mode 100644 static/js/pages/core/admin_home.js delete mode 100644 static/js/pages/core/services.js delete mode 100644 static/js/pages/store/basket.js delete mode 100644 static/js/pages/store/home.js delete mode 100644 static/js/pages/store/manufacturing_purchase_orders.js delete mode 100644 static/js/pages/store/mixin.js delete mode 100644 static/js/pages/store/mixin_table.js delete mode 100644 static/js/pages/store/product_categories.js delete mode 100644 static/js/pages/store/product_permutations.js delete mode 100644 static/js/pages/store/product_variations.js delete mode 100644 static/js/pages/store/products.js delete mode 100644 static/js/pages/store/stock_items.js delete mode 100644 static/js/pages/store/supplier_purchase_orders.js delete mode 100644 static/js/pages/store/suppliers.js delete mode 100644 static/js/sections/store.js delete mode 100644 templates/DEPRECATED/DEPRECATED_block_store_product.html delete mode 100644 templates/DEPRECATED/DEPRECATED_block_store_product_price.html delete mode 100644 templates/DEPRECATED/DEPRECATED_page_home.html delete mode 100644 templates/DEPRECATED/DEPRECATEDlayout_store.html delete mode 100644 templates/DEPRECATED/_block_select_access_level.html delete mode 100644 templates/DEPRECATED/_block_slider.html delete mode 100644 templates/DEPRECATED/_block_store_product_category_card.html delete mode 100644 templates/DEPRECATED/layout - stripe.html delete mode 100644 templates/pages/core/_admin_home.html delete mode 100644 templates/pages/core/_services.html delete mode 100644 templates/pages/store/_basket.html delete mode 100644 templates/pages/store/_checkout_success.html delete mode 100644 templates/pages/store/_home.html delete mode 100644 templates/pages/store/_manufacturing_purchase_orders.html delete mode 100644 templates/pages/store/_product_categories.html delete mode 100644 templates/pages/store/_product_permutations.html delete mode 100644 templates/pages/store/_product_variations.html delete mode 100644 templates/pages/store/_products.html delete mode 100644 templates/pages/store/_stock_items.html delete mode 100644 templates/pages/store/_supplier.html delete mode 100644 templates/pages/store/_supplier_purchase_orders.html delete mode 100644 templates/pages/store/_suppliers.html create mode 100644 todo.txt diff --git a/app.py b/app.py index 410246ac..f38b97c2 100644 --- a/app.py +++ b/app.py @@ -19,15 +19,6 @@ Initializes the Flask application, sets the configuration based on the environme from config import app_config, Config from controllers.core import routes_core from controllers.legal import routes_legal -from controllers.store.store import routes_store -from controllers.store.manufacturing_purchase_order import routes_store_manufacturing_purchase_order -from controllers.store.product import routes_store_product -from controllers.store.product_category import routes_store_product_category -from controllers.store.product_permutation import routes_store_product_permutation -from controllers.store.product_variation import routes_store_product_variation -from controllers.store.stock_item import routes_store_stock_item -from controllers.store.supplier import routes_store_supplier -from controllers.store.supplier_purchase_order import routes_store_supplier_purchase_order from controllers.user import routes_user from extensions import db, csrf, cors, mail, oauth from helpers.helper_app import Helper_App @@ -116,15 +107,6 @@ with app.app_context(): app.register_blueprint(routes_core) app.register_blueprint(routes_legal) -app.register_blueprint(routes_store) -app.register_blueprint(routes_store_manufacturing_purchase_order) -app.register_blueprint(routes_store_product) -app.register_blueprint(routes_store_product_category) -app.register_blueprint(routes_store_product_permutation) -app.register_blueprint(routes_store_product_variation) -app.register_blueprint(routes_store_stock_item) -app.register_blueprint(routes_store_supplier) -app.register_blueprint(routes_store_supplier_purchase_order) app.register_blueprint(routes_user) diff --git a/business_objects/store/access_level.py b/business_objects/access_level.py similarity index 91% rename from business_objects/store/access_level.py rename to business_objects/access_level.py index 12def267..7d5fdc95 100644 --- a/business_objects/store/access_level.py +++ b/business_objects/access_level.py @@ -12,7 +12,7 @@ Business object for product # internal import lib.argument_validation as av -from business_objects.store.store_base import Store_Base +from business_objects.base import Base from extensions import db from helpers.helper_app import Helper_App # external @@ -20,9 +20,9 @@ from pydantic import BaseModel from typing import ClassVar -class Access_Level(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_ACCESS_LEVEL - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME +class Access_Level(db.Model, Base): + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_ACCESS_LEVEL + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME __tablename__ = 'Shop_Access_Level_Temp' id_access_level = db.Column(db.Integer, primary_key=True) code = db.Column(db.String(50)) @@ -35,7 +35,7 @@ class Access_Level(db.Model, Store_Base): created_by = db.Column(db.Integer) def __init__(self): super().__init__() - Store_Base.__init__(self) + Base.__init__(self) @classmethod def from_DB_access_level(cls, query_row): access_level = cls() @@ -83,4 +83,4 @@ class Access_Level(db.Model, Store_Base): access_level.description = json[cls.FLAG_DESCRIPTION], access_level.display_order = json[cls.FLAG_DISPLAY_ORDER] access_level.active = json[cls.FLAG_ACTIVE] - return access_level + return access_level \ No newline at end of file diff --git a/business_objects/store/__init__.py b/business_objects/store/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/business_objects/store/__pycache__/__init__.cpython-312.pyc b/business_objects/store/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 1a9c3397179cbf760c7594b3de55d3303e19b8dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 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 Zs`@7H6kR=gaQ@ibu?63^6ck8{{{xpPbRYl# diff --git a/business_objects/store/__pycache__/basket.cpython-312.pyc b/business_objects/store/__pycache__/basket.cpython-312.pyc deleted file mode 100644 index 30df352baa043b838b0a31d232d02e38f5bbfef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10000 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 diff --git a/business_objects/store/__pycache__/currency.cpython-312.pyc b/business_objects/store/__pycache__/currency.cpython-312.pyc deleted file mode 100644 index 5066849f921b5641070f3665e497cdcbab03b534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6555 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 diff --git a/business_objects/store/__pycache__/delivery_option.cpython-312.pyc b/business_objects/store/__pycache__/delivery_option.cpython-312.pyc deleted file mode 100644 index 178a1e924b6ec2b67b1ba2f706e9753c012ad81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4224 zcmb_f&2Jmm5r0dO6uA^B>dO{MeXM2278P4{bZITPK`g5Y?AWp^xh+JnU97mz(yAm^ ze!FZ;!2x*iK?Mp_LJkxW6jE;v+ycGiujoYvU3jtRsXg&fK#iMAPMz5=Eh))GgucUY z-tYHjc6Q#IdCR}X<2-@!uRrsvO9?{$i4%8(9Odmtpwx*>azy6jK#?m2asiG+Nq~Gp zMW_6&ioT{Y zix7Sye16_{d?v%JTumP_HW$^_Z-#_W=s(Q|SxF11P#x|Hzl2}#zHLbR0 zAb^$(LfP*nq~O$t6&2PP_O`eEAnIh5JR_n-pr}H9FMzY8Tl*rTtI$2PuQ)TP(c)tb zT?yYky*-=%nMRqGr`YZC56X0&LA%M%tA$F5mUS%;&2p7VrIJ!!&Hr4{DpFBc(krr} z3NzPdX7X156rq3SrHzgJiqp|VyZvZ+O;;Jsdr{aOXnLb+Mnq95E4nCd4tFGB+GRe1 z5H(C|jTpkjR`73;(YG)=B@Hw1Ms=clDSC-ZVSLU#gDWEi+A~h{Sik}f<}@qd;UaM` z=hCpSpo0Z1cj$-6AqR6?CSqX+^DZI4x*e?BXB%-aucgAesDnj)>v#wA4i>D7IatiM zuE)W8d|2GU;yx_lU~t9S;~BR^vb_ro6VSrUv@8wZy@fB^!nbST>$EWb76#nH2wNCZ z3u9>ELtFTiY%jy*W>k?ydzVcf)D8OM?&LKB@(33ZdLO~U%_{rQuGcGIIMp3GY zDw8S82F&P_3S6xsQ$I7qcGMc?KoA(dlR5F2sU>lKPF$tBSdz+B_kA#S2`=~w-JIz> zzW>{14t#50gQ$_e_X*9uiLJ1axwQY&#?7tp>&UP%^4`AGxQBYm5V9{W{ILi1QDgM- z{*y)?^|Wzre4pDXZiRmr^Q-<9etqo93$6jHUq>=VhaPB@JlxYEn#IPC5g#_jCtvh8 zK1Y4T=pEXMGw4L^HJAawYDGD#24$$Yb$~j@mr!%SV1hdaFkQfS6?Q}e69mSqsWv7A zj8{c%Oc)riZrYe`V7y9cV@T8LL(|`*`=;6Mq$XR@h8+K<*g@D&0xBB?sI<8;2Eh48)>3=EYZ^r*qO% z;4*Db@K^6U$P+C6wSCOeU+O>(w>{IVd|*b}n6^d$Y`l%l#@QI`0~<$i0mVfW6DTgB zcn<}BDX=RjCQ)QjOrdxm1-3`~mbH5cTzHIbu#+!5n^{7We}Jfw!vHtfXY>u#$9BdJ zlENY3E~Jdq=-zl^{9rf>)2XzP9($9XdX=6!NWBlh)d6GReEr7GjcuHbwa<<%J_clr z%=nwk)mNFT2kC3zVEPQeurWNcmuMso&R+o!lOx86@MdKC)yVWg<_7>=j~`|d$>bqP zM3Yt%S;(gFI{>#(6ir?fOYoPchs4D=XRN)kBh3L`*sZ*0Gmc}9mH3}iqqOa>w2@q2f%2zq18PnMl!V> zs7H6AyAyj;jj6v}dY$}X?T*ox-tMobc2c`Dd$Wz%X5Z!7U1Ml$d$GQ}v%JgpHXEDG zp{d$}(Vy9#sAqSwyK{SY8+V)iS8AUcvB9mG-{1J{jqPQ3{TIJ%#xB<8k2BgAziP%V z0dta{ldyr2?HN2GyNi3dMy@$9S-WSv6I+Ir%Z=rI{Y$YqaLvE^7~{*tWMi_Kya;(1 z9NnI)-`TmdyRx_5SZ@wyYxlniaG{Ie1e2k2Zzp;~_BpV!x{wW--J&R~1w0G%DSQRs zKWok2{m^~rMMZlLeuUeDmyoqD-$icP$L2$J6EOUa(QwlbyEu;fcYx=D-=+zdK8%cU W!T)^t0hiofsjuy;Ky!;nu5P=5( diff --git a/business_objects/store/__pycache__/delivery_region.cpython-312.pyc b/business_objects/store/__pycache__/delivery_region.cpython-312.pyc deleted file mode 100644 index 0cc1259e3425ad724686b1fab0d51d458be48084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4560 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 U{~Nr{wm>A7pDusLK+|&YKO(KjaR2}S diff --git a/business_objects/store/__pycache__/image.cpython-312.pyc b/business_objects/store/__pycache__/image.cpython-312.pyc deleted file mode 100644 index d934ebbdb257b2f0f6bdea6129f1db6d9bdc601f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6072 zcmbUlTTmOtLC2wqa-yeN7c>%w9&4y(0JgoJf*}` zS?EfuGbus`0=?4p2$2FqF-eNcYAShrJP}i81e{c8qePCzlvpYm=t@d~FFP&!Y%^azsrN**F+UN$IE> z7)V5><#JX*=#iBuiOs37d8bfZC`A_vTuqU{oH;*+^Myw!f*`94<7$e?Vs}K5p=Xh% zkk&89=VT&w&CLx%m+MWY6Y$Sph({FVHTWV!d&yQt>pNS{#(G$#D@kBdDN9xbh>4p}wPqjR0qm zfWMt%09F_kpwVWLTGq16J#+3jbC(?sT8I-kbbrOI#gP1#dKW%gk>ghtoEP{id7*Q1 zLXn9wDWeHYjwIzC61yf(_N1cegq&2BNwA=45=kUt$?3`0VoEv^4~(m6DV7SHI(h2U zBsD4#jA}A6H#a$Ds#!F&qf9EOgGs8Gj=7A^sc?q*%IE9Au@*R%QVU>#`OMq4y*ofI6&89W71n2ffUt^!oHhLbXB1kNdaP=C4Z{@thh?(NE_Jrx>4jI@dpNv0vxJ^Cv5sT}MSK zHO2t05&;0p=7n3{Mei!V-oDXs>Hc8kK0l?oYVS85+iEx@==K=ah!Z|c}; zI+bra^{MBSR(r5OIh}7h{i)})R@?S8<@4HRQU|+K_OoBYNQs|SFr8T&FqO4?X1|Ad zy`Ev-VY6%{)5%gLD(ubLEE|PHG0t#%eY%1XjWeVQmJZqsJ-9?MAt$E5MMY7!gPzi| zqI1beLMG@d;PU7#y4_^L!v_LXDY|c3R?W%cR7Rw(cch{=I-ce{4ht#g0f25Aj&3!a z%{QFgYIr%{@bYHED~}nA^FXdo^VZ*bd-3g6Y17-PHMac9vuy+V6FXCVXv-VSdxIN% zkV<|yDCoQ>;;G>)1o$Kf_;JMDqWC6+6k~+!hy6%10{k|DX^(y$wJ*{J-Mb83(6BlT zc2r7@fGCFn++eionuP&Pa4lTWT<(P)3LbN;t&e?dciCEY{G6@bSORB9;a6-0CGY$N z;>d2ipMba#w#uArYXVl;E?HiJe~A8$Jv0t!7Dnc0(I3hhP|^O%nq>RHUd-37Z#K6O z_QURPInVPg=RsXk`5P&{LY*Qx3TG|+hoN4nyarHP%Y+2o;ymBi%&Q>Z;=EcXt*^p$ zk`uCXy#!TNxFO>Tx^)|^ICN{8#P#~&uAyGBD-;?NM@B;fBg0~-_Xi=Jk4Yj;UwXq+ z46k(!PV|PLesIkZ;2|0D4LS4Z-*D!VP=h{6v()>5K<&uB!|rCPLKu0+0{O{;7M8V$ z#XJTyt4S+{C7^L8tymHOjanznE#^0%*-gHJWkaTu944)p=YYnWGzV-?Th=np1f9e4 zN2q{0u98$j?CBP1n201ZqFHf?kdh)${H0}D*AUEg#DxH}*&{s4Bi#EDZWiQ8JNyxh zEV=+(8w<=WI8t zwEb=Cudcn6v)$+SY0n(FQ?r&uyjg2Lv>sU-M7&9>Ygvsf1Afz~H3rsemVxD_TRZUV z9d<2_9Q!qIUC#Y<(n8TvOZqt=Xh~US7O?X6Td*V;DO$|#IE+9QGh4Kgk`bs|Dy1-( z1C`2bg;WJ2_TRa{QXIqcHA3O0fd4V6Gcey&Mk**AhWzD21%1PquVf5d6KKsPv=S?T zQBTPzWKJ|O@?8XH5ugo`7Z6kf*i*M)QX=vk5ykl`!_o`=*OBo@02Y{S3tLyC)zq)F zEVnFqw;49jq&2nNerD~NjeSArw)-{zfh~V~-rv5_bQB23e44Le<;e1pB|r3Ksf2ycG;_|w;8*$`fF6o(eTkgYo_u)I-pFDRx8g>JDcVNBkk0*YAf_8&>cks^h zTSs5aAAJ!Bw}uvnR-eCpZtWZ$J(zbNTn}v>I-5Uq_6rZJxXn160yVPXU?VvMyAv#v z$g>FWhDk8w>sCc2x>pn<$z;k1!cc7zy!H~bA>DofZnBA_?ifhI6+|X`9PA7-p_l3Q zanMC_+K`r`JC%ydkt8{XS?Jel{7b%-rsby9 zQ@1{<4=jzXTv@)dN^Z}u&2QGXFAQtG{Y$MY!R6p;_w7q-mo|ORE_`1T zYICi(f{VeWfu-)1f#reK=)1$4!a=AdJq@|BTUQpZERmJ@<@rrd>p~wyag%H6_Uzj1 zW?gV$XxrkmagPtXZ1s=#Ic(KC)x6CRKTUm6_^M(nz9h52VTRnT-Nphw|mFlGh^=# zur9W&1#-+cn_-pgPt7QXHno_ovdk~wcCZ^Rjcnx~jli3RjM5QJnRUSZM7|E0z#GNK zpg=LSkWn}w6nVlmF+!$AH3PK@)&XP;>2`v(lkPBX(5lWOG6lx3+mtkL>JD>#-C=G3 zcW!GmuFz$77a}j>k|A8nDT?$6qNt#E8hLfWxbj>9!hB0bH5Wc04J^uK0ADUJpL>Ei zi&lR)C*TEJSQM5zSF?ABAr`Y$#=PrV z%Y+f+NDa&`qbj&3O2a7ZAa{e&s-Uq0|4kmo_>WZ z3yZ*V|L`;H3lEv5hfMGx)Ao0!{vosfiQUh(ul77);O|N23#^dqzSY0jzcl-VfzH3) OVtwp$j~M_|YX1R3;z;NK diff --git a/business_objects/store/__pycache__/order.cpython-312.pyc b/business_objects/store/__pycache__/order.cpython-312.pyc deleted file mode 100644 index 2f778f4a70a06dcbd3d59baed48f38af4720a9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 zcma)9TWlOx89p<+vpYN9i*xZMZeq5?2`t1W7fUpzAmX@n68RF<2}sL|!+7V|9y2?$ zoSAi5Yb{x75w0MRAdnrkD0!*mC`c3uiSk4rk$CaSjl3FMsp2BhH{&#@$`k)NGqc{^ zY!K(+pZ}cmpWFX`|7HG?NGJ%}-)@QXQU^kRXPux)KJ$1Mn02I~EYbu`G=zef4GD}7 z8R3GIl{gtwoY|M$*u(UwZAvO#0ho*47=OTq-#W7UdJ^SG3nvs--7&O*4pNnS(P0-C0oB zqM%);B(K}LWu`BgTKY9&6P4x{(l`UV!?AU$W%w8hpbpRgxSWdt`0 zkJUC2Hf@L{L@$ zGl@4536ZcSybR++0#4*y1h^3AqQHeYCj%!jZVk-|TI5YR8)L@FDw+(mLyG~8YYNbW z)&VrB#et^Q&<}-d=M2guT#2j0mGi1Y<}F%wqebssuKa_NYC5`8c4fOX>sXFzxG61o zsl{KK4|{LnGzyeG>hZsT{7L}K2`g~<70D6!Jdi~(;10eOKw>3ak$w|?=c$zPo3^8xc|w^&-Q--!FfbdRGc46{nE!|yAP!`O~|tSTSd_~QL*?}_h??+jn54qw^2i66<|+f5z)<#+C% ztfq!G?d{ZsE&0M@I0ZF9nSqW&`4_;fql!>Lm}+Ot+7FB?W5Ay7V7#0R%;ELF0<-qlfq*%B(`(_MCTczX@QK&F-fr)S4eg$B z*VyU5Sna>~{@9-;|2SFgzxwBM+r5)ad{2zT;`DQ{L%yyq=+vWz3mqOaM2H!oh6vCo z4Kl3pm;q*Jr?|y>T<~PMdZB>Pvq@6`_Ajcv=J414lNew2eg8@ty znOc6K!9#~iMGZnO4m_E5!tOjC&_j%S5lBX+M;PDD2#*&%jAQqqpJxPO5%O(I2kKMD z8OOZ4#k8rGBbU283%3k28{0R5tfE@tO9y_}V15vMXC zSMjql)-_k+&h6z6$?cnmm~StrlxUbeAJ?;v%`xLDx`zGL9$+|rGVrhlExJ+1;>!a~ z`rUCR_6m?yv?ofPN-cSKCplP64sL4O$qRcS82Y%c|K6FqXLkC|Rr}7>x{j^q?&Nm5 z&Q`n5)_RZMOWaND$3SWiNipSrnBZq{Mx*iDso4P;ueDS7L9lG90oo{BW09jxAl6uv zV1R%IikGHbv@D*|Za_UJ&qH7>Laxh5Zp5(iszKbCO&p(%OkBp7CMMhj6p95E>;Z}2 zoae4dTQ!}sN=~r^GJa7NxM9oiG+e@FK^HJACwJuDs@(fd_q`K$Pi%@G%3t11b?u}e ziJiPZwmI@(!y+ua9=O)_HsX3|6K!Dzl3Y8T!%P@v z+UOW&q+iECixBsEnri!?(i}-IcQ;M=AcgVf1wn{>W+KoaOeC6i%7j~zTzgAEuA`(# z8*`o4p8?(2SAj6p3rBluJuj@U+*!G8?IGcGcdff`-MC}i{x0+en&+B(i9JAmCqsTG zw@T&^ORuI{AQ-y}#s&C+Fc=@lEDsp|Oo&y1DU4Oqgrb}Mkl1ihWl)Y&4}2PlO2hky<5GP8xFk&p`$<7Mu^)*@%6_LPT@n5x zMP{!gc1p_#9!rFP?>8Hp(&s(=$}mo=z_WI(mS(DY@pJ$}f8+{06-S^DK4PXMpU5 t1VQ+>s0iUFeMmU4}1bzQ3Zxr}3`|oom;gAo%dz{tN6Sjn@DG diff --git a/business_objects/store/__pycache__/product.cpython-312.pyc b/business_objects/store/__pycache__/product.cpython-312.pyc deleted file mode 100644 index 45216788d8335f2c1f29aaea4841ce4f35bee99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29972 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 CJssiz diff --git a/business_objects/store/__pycache__/product_category.cpython-312.pyc b/business_objects/store/__pycache__/product_category.cpython-312.pyc deleted file mode 100644 index 1632b355879c1215d07a03492c68bf434f5b9928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31453 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 G6#oaT<+if` diff --git a/business_objects/store/__pycache__/product_permutation.cpython-312.pyc b/business_objects/store/__pycache__/product_permutation.cpython-312.pyc deleted file mode 100644 index ab59f4ea968b8f52b2543b4f9d704d2d3aab8daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41762 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 diff --git a/business_objects/store/__pycache__/product_price.cpython-312.pyc b/business_objects/store/__pycache__/product_price.cpython-312.pyc deleted file mode 100644 index e976231d7948d670549890616d806ccede66fef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5638 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 klXj(=`<_wo+*w;e=Yo&YybcN diff --git a/business_objects/store/__pycache__/product_variation_tree.cpython-312.pyc b/business_objects/store/__pycache__/product_variation_tree.cpython-312.pyc deleted file mode 100644 index caf47456fb1b9b45e0f030705a75aaaeb89192ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9128 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 0: - ids_permutation += ',' - quantities_permutation += ',' - ids_permutation += str(product.get_id_permutation()) - quantities_permutation += str(basket_item.quantity) - Helper_App.console_log(f'ids_permutation_basket = {ids_permutation}') - Helper_App.console_log(f'quantities_permutation_basket = {quantities_permutation}') - return ids_permutation, quantities_permutation - def to_json_list(self): - json_list = [] - for item in self.items: - json_list.append(item.to_json()) - return json_list - def to_json(self): - return { - **self.get_shared_json_attributes(self), - Basket.KEY_ITEMS: self.to_json_list(), - Basket.KEY_IS_INCLUDED_VAT: self.is_included_VAT, - Basket.KEY_ID_CURRENCY: self.id_currency, - Basket.KEY_ID_REGION_DELIVERY: self.id_region_delivery - } - def output_total(self): - sum = 0 - for b_i in self.items: - sum += b_i.get_subtotal() - symbol = self.items[0].output_currency() if len(self.items) > 0 else '' - - return f'{symbol} {locale.format_string("%d", sum, grouping=True)}' - def len(self): - return len(self.items) - """ - def get_key_product_index_from_ids_product_permutation(id_product, id_permutation): - return f'{id_product},{"" if id_permutation is None else id_permutation}' - """ - def __repr__(self): - repr = f'Basket:' - for basket_item in self.items: - Helper_App.console_log(f'{basket_item}') - repr = f'{repr}\n{basket_item}' - return repr - - def get_ids_permutation_unavailable(self): - ids_permutation = [] - for item in self.items: - permutation = item.product.get_permutation_selected() - if not permutation.is_available: - ids_permutation.append(permutation.id_permutation) - return ids_permutation \ No newline at end of file diff --git a/business_objects/store/delivery_option.py b/business_objects/store/delivery_option.py deleted file mode 100644 index 2dd7ab6c..00000000 --- a/business_objects/store/delivery_option.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Delivery Option Business Object - -Description: -Business object for delivery option -""" - -# internal -from extensions import db - - -# CLASSES -""" -class Delivery_Option(): - name: str - delay_min: int # days - delay_max: int - quantity_min: float - quantity_max: float - regions: list # [Enum_Region] - cost: float - - def __new__(cls, name, delay_min, delay_max, quantity_min, quantity_max, regions, cost): - _m = 'Delivery_Option.__new__' - v_arg_type = 'class attribute' - av.val_str(name, 'name', _m, v_arg_type = v_arg_type) - av.val_int(delay_min, 'delay_min', _m, 0, v_arg_type = v_arg_type) - av.val_int(delay_max, 'delay_max', _m, 0, v_arg_type = v_arg_type) - av.val_float(quantity_min, 'quantity_min', _m, 0, v_arg_type = v_arg_type) - av.val_float(quantity_max, 'quantity_max', _m, 0, v_arg_type = v_arg_type) - av.val_list_instances(regions, 'regions', _m, Enum_Region, v_arg_type = v_arg_type) - av.val_float(cost, 'cost', _m, 0, v_arg_type = v_arg_type) - return super(Delivery_Option, cls).__new__(cls) - - def __init__(self, name, delay_min, delay_max, quantity_min, quantity_max, regions, cost): - self.name = name - self.delay_min = delay_min - self.delay_max = delay_max - self.quantity_min = quantity_min - self.quantity_max = quantity_max - self.regions = regions - self.cost = cost -""" -class Delivery_Option(db.Model): - id_option = db.Column(db.Integer, primary_key=True) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - id_category = db.Column(db.Integer) - code = db.Column(db.String(50)) - name = db.Column(db.String(100)) - latency_min = db.Column(db.Integer) - latency_max = db.Column(db.Integer) - quantity_min = db.Column(db.Integer) - quantity_max = db.Column(db.Integer) - codes_region = db.Column(db.String(4000)) - names_region = db.Column(db.String(4000)) - price_GBP = db.Column(db.Float) - display_order = db.Column(db.Integer) - def __init__(self): - self.delivery_regions = [] - def from_DB_get_many_product_catalogue(query_row): - option = Delivery_Option() - option.id_option = query_row[0] - option.id_product = query_row[1] - option.id_permutation = query_row[2] - option.id_category = query_row[3] - option.code = query_row[4] - option.name = query_row[5] - option.latency_min = query_row[6] - option.latency_max = query_row[7] - option.quantity_min = query_row[8] - option.quantity_max = query_row[9] - option.codes_region = query_row[10] - option.names_region = query_row[11] - option.price_GBP = query_row[12] - option.display_order = query_row[13] - return option - def __repr__(self): - return f''' - id: {self.id_option} - id_product: {self.id_product} - id_category: {self.id_category} - name: {self.name} - code: {self.code} - latency_min: {self.latency_min} - latency_max: {self.latency_max} - quantity_min: {self.quantity_min} - quantity_max: {self.quantity_max} - codes_region: {self.codes_region} - names_region: {self.names_region} - price_GBP: {self.price_GBP} - display_order: {self.display_order} - ''' diff --git a/business_objects/store/discount.py b/business_objects/store/discount.py deleted file mode 100644 index f5e5c75a..00000000 --- a/business_objects/store/discount.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Discount Business Object - -Description: -Business object for discount -""" - -# internal -from extensions import db - - -# CLASSES -class Discount(db.Model): - id_discount = db.Column(db.Integer, primary_key=True) - id_category = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - code = db.Column(db.String(50)) - name = db.Column(db.String(200)) - multiplier = db.Column(db.Float) - subtractor = db.Column(db.Float) - apply_multiplier_first = db.Column(db.Boolean) - quantity_min = db.Column(db.Integer) - quantity_max = db.Column(db.Integer) - date_start = db.Column(db.DateTime) - date_end = db.Column(db.DateTime) - codes_region = db.Column(db.String(4000)) - names_region = db.Column(db.String(4000)) - codes_currency = db.Column(db.String(4000)) - names_currency = db.Column(db.String(4000)) - display_order = db.Column(db.Integer) - - def __init__(self): - self.delivery_regions = [] - def from_DB_get_many_product_catalogue(query_row): - discount = Discount() - discount.id_discount = query_row[0] - discount.id_category = query_row[1] - discount.id_product = query_row[2] - discount.id_permutation = query_row[3] - discount.code = query_row[4] - discount.name = query_row[5] - discount.multiplier = query_row[6] - discount.subtractor = query_row[7] - discount.apply_multiplier_first = query_row[8] - discount.quantity_min = query_row[9] - discount.quantity_max = query_row[10] - discount.date_start = query_row[11] - discount.date_end = query_row[12] - discount.codes_region = query_row[13] - discount.names_region = query_row[14] - discount.codes_currency = query_row[15] - discount.names_currency = query_row[16] - discount.display_order = query_row[17] - return discount - def __repr__(self): - return f''' - id: {self.id_discount} - id_category: {self.id_category} - id_product: {self.id_product} - name: {self.name} - code: {self.code} - multiplier: {self.multiplier} - quantity_min: {self.quantity_min} - quantity_max: {self.quantity_max} - date_start: {self.date_start} - date_end: {self.date_end} - display_order: {self.display_order} - ''' - diff --git a/business_objects/store/image.py b/business_objects/store/image.py deleted file mode 100644 index 8b4d301c..00000000 --- a/business_objects/store/image.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Image Business Object - -Description: -Business object for product image -""" - -# internal -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from enum import Enum -from typing import ClassVar - - -class Resolution_Level_Enum(Enum): - THUMBNAIL = 0 - LOW = 1 - HIGH = 2 - FULL = 3 - - def text(self): - return Resolution_Level_Enum.Resolution_Level_Enum_Text(self) - - def Resolution_Level_Enum_Text(category): - av.val_instance(category, 'category', 'Resolution_Level_Enum_Text', Resolution_Level_Enum) - if category == Resolution_Level_Enum.THUMBNAIL: - return 'Thumbnail' - elif category == Resolution_Level_Enum.LOW: - return 'Low resolution' - elif category == Resolution_Level_Enum.HIGH: - return 'High resolution' - elif category == Resolution_Level_Enum.FULL: - return 'Full resolution' - else: - return 'Unknown' - - def get_member_by_text(text): - for member in Resolution_Level_Enum.__members__.values(): - if member.name == text: - return member - return Resolution_Level_Enum.HIGH - - -class Image(db.Model, Store_Base): - NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'url' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = 'id_image' - id_image = db.Column(db.Integer, primary_key=True) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - id_category = db.Column(db.Integer) - url = db.Column(db.String(255)) - active = db.Column(db.Boolean) - display_order = db.Column(db.Integer) - """ - def __new__(cls, id, id_product, id_category, url, display_order): - _m = 'Image.__new__' - v_arg_type = 'class attribute' - av.val_int(id, 'id', _m, 0, v_arg_type=v_arg_type) - av.val_int(id_product, 'id_product', _m, 0, v_arg_type=v_arg_type) - av.val_int(id_category, 'id_category', _m, 0, v_arg_type=v_arg_type) - av.val_str(url, 'url', _m, max_len=254, v_arg_type=v_arg_type) - av.val_int(display_order, 'display_order', _m, v_arg_type=v_arg_type) - return super(Image, cls).__new__(cls) - - def __init__(self, id, id_product, id_category, url, display_order): - self.id_image = id - self.id_product = id_product - self.id_category = id_category - self.url = url - self.display_order = display_order - super().__init__() -""" - def from_DB_get_many_product_catalogue(query_row): - _m = 'Image.from_DB_get_many_product_catalogue' - # Helper_App.console_log(f'image: {query_row}') - image = Image() - image.id_image = query_row[0] - image.id_product = query_row[1] - image.id_permutation = query_row[2] - image.id_category = query_row[3] - image.url = query_row[4] - image.active = query_row[5] - image.display_order = query_row[6] - return image - def __repr__(self): - return f''' - id: {self.id_image} - id_product: {self.id_product} - id_category: {self.id_category} - url: {self.url} - display_order: {self.display_order} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_IMAGE: self.id_image, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.FLAG_URL: self.url, - self.FLAG_DISPLAY_ORDER: self.display_order - } - - -class Product_Image_Filters(): - product_id: int - get_thumbnail: bool - get_remaining_LQ: bool - - def __new__(cls, product_id, get_thumbnail, get_remaining_LQ): - # Initialiser - validation - _m = 'Parameters_Product.__new__' - v_arg_type = 'class attribute' - av.val_int(product_id, 'product_id', _m, v_arg_type=v_arg_type) - av.val_bool(get_thumbnail, 'get_thumbnail', _m, v_arg_type=v_arg_type) - av.val_bool(get_remaining_LQ, 'get_remaining_LQ', _m, v_arg_type=v_arg_type) - return super(Product, cls).__new__(cls) - - def __init__(self, product_id, get_thumbnail, get_remaining_LQ): - # Constructor - self.product_id = product_id - self.get_thumbnail = get_thumbnail - self.get_remaining_LQ = get_remaining_LQ - diff --git a/business_objects/store/manufacturing_purchase_order.py b/business_objects/store/manufacturing_purchase_order.py deleted file mode 100644 index 8e1a21e5..00000000 --- a/business_objects/store/manufacturing_purchase_order.py +++ /dev/null @@ -1,354 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Manufacturing_Purchase_Order Business Object - -Description: -Business object for manufacturing_purchase_order -""" - -# internal -import lib.argument_validation as av -from business_objects.currency import Currency -from business_objects.db_base import Get_Many_Parameters_Base -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from pydantic import BaseModel -from typing import ClassVar, Optional -from datetime import datetime - -class Manufacturing_Purchase_Order(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_MANUFACTURING_PURCHASE_ORDER - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - # __tablename__ = 'Shop_Manufacturing_Purchase_Order_Temp' - id_order = db.Column(db.Integer, primary_key=True) - id_currency = db.Column(db.Integer) - cost_total_local_VAT_excl = db.Column(db.Float) - cost_total_local_VAT_incl = db.Column(db.Float) - price_total_local_VAT_excl = db.Column(db.Float) - price_total_local_VAT_incl = db.Column(db.Float) - active = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - name = db.Column(db.String(255)) - # items: list = None - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.items = [] - self.currency = None - @classmethod - def from_DB_manufacturing_purchase_order(cls, query_row): - manufacturing_purchase_order = cls() - manufacturing_purchase_order.id_order = query_row[0] - manufacturing_purchase_order.id_currency = query_row[1] - manufacturing_purchase_order.currency = Currency.from_DB_manufacturing_purchase_order(query_row) - manufacturing_purchase_order.cost_total_local_VAT_excl = query_row[4] - manufacturing_purchase_order.cost_total_local_VAT_incl = query_row[5] - manufacturing_purchase_order.price_total_local_VAT_excl = query_row[6] - manufacturing_purchase_order.price_total_local_VAT_incl = query_row[7] - manufacturing_purchase_order.active = av.input_bool(query_row[8], 'active', f'{cls.__name__}.from_DB_manufacturing_purchase_order') - manufacturing_purchase_order.created_on = query_row[9] - manufacturing_purchase_order.name = query_row[10] - return manufacturing_purchase_order - - def __repr__(self): - return f''' -{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER}: {self.id_order}, -{self.ATTR_ID_CURRENCY}: {self.id_currency}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, -{self.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL}: {self.price_total_local_VAT_excl}, -{self.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL}: {self.price_total_local_VAT_incl}, -{self.FLAG_ACTIVE}: {self.active}, -{self.FLAG_CREATED_ON}: {self.created_on}, -{self.FLAG_NAME}: {self.name} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER: self.id_order, - self.ATTR_ID_CURRENCY: self.id_currency, - self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, - self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, - self.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL: self.price_total_local_VAT_excl, - self.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL: self.price_total_local_VAT_incl, - self.FLAG_ORDER_ITEMS: [item.to_json() for item in self.items], - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - self.FLAG_CREATED_ON: self.created_on, - self.FLAG_NAME: self.name, - } - def to_json_option(self): - return { - 'value': self.id_order, - 'text': self.name, - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - manufacturing_purchase_order = cls() - manufacturing_purchase_order.id_order = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER] - manufacturing_purchase_order.id_currency = json[cls.ATTR_ID_CURRENCY] - manufacturing_purchase_order.cost_total_local_VAT_excl = json.get(cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL, None) - manufacturing_purchase_order.cost_total_local_VAT_incl = json.get(cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL, None) - manufacturing_purchase_order.price_total_local_VAT_excl = json.get(cls.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL, None) - manufacturing_purchase_order.price_total_local_VAT_incl = json.get(cls.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL, None) - manufacturing_purchase_order.items = [Manufacturing_Purchase_Order_Product_Link.from_json(item) for item in json[cls.FLAG_ORDER_ITEMS]] - manufacturing_purchase_order.active = json[cls.FLAG_ACTIVE] - manufacturing_purchase_order.created_on = json.get(cls.FLAG_CREATED_ON, None) - manufacturing_purchase_order.name = json.get(cls.FLAG_NAME, None) - return manufacturing_purchase_order - def get_items_preview_str(self): - preview = '' - if self.items is not None: - for item in self.items: - if preview != '': - preview += '\n' - preview += f'{item.name_permutation}{f" -(x{item.quantity_used})" if item.quantity_used > 0 else ""}{f" +(x{item.quantity_produced})" if item.quantity_produced > 0 else ""}' - return preview - -class Manufacturing_Purchase_Order_Product_Link(db.Model, Store_Base): - FLAG_QUANTITY_PRODUCED: ClassVar[str] = 'quantity_produced' - FLAG_QUANTITY_USED: ClassVar[str] = 'quantity_used' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - # __tablename__ = 'Shop_Manufacturing_Purchase_Order_Temp' - id_link = db.Column(db.Integer, primary_key=True) - id_order = db.Column(db.Integer) - id_category = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - id_unit_quantity = db.Column(db.Integer) - name_permutation = db.Column(db.String(255)) - csv_id_pairs_variation = db.Column(db.String(4000)) - quantity_used = db.Column(db.Float) - quantity_produced = db.Column(db.Float) - id_unit_latency_manufacture = db.Column(db.Integer) - latency_manufacture = db.Column(db.Integer) - display_order = db.Column(db.Integer) - cost_unit_local_VAT_excl = db.Column(db.Float) - cost_unit_local_VAT_incl = db.Column(db.Float) - price_unit_local_VAT_excl = db.Column(db.Float) - price_unit_local_VAT_incl = db.Column(db.Float) - active = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - def __init__(self): - super().__init__() - Store_Base.__init__(self) - @classmethod - def from_DB_manufacturing_purchase_order(cls, query_row): - link = cls() - link.id_link = query_row[0] - link.id_order = query_row[1] - link.id_category = query_row[2] - link.id_product = query_row[3] - link.id_permutation = query_row[4] - link.name_permutation = query_row[5] - link.csv_id_pairs_variation = query_row[6] - link.id_unit_quantity = query_row[7] - link.quantity_used = query_row[8] - link.quantity_produced = query_row[9] - link.id_unit_latency_manufacture = query_row[10] - link.latency_manufacture = query_row[11] - link.display_order = query_row[12] - link.cost_unit_local_VAT_excl = query_row[13] - link.cost_unit_local_VAT_incl = query_row[14] - link.price_unit_local_VAT_excl = query_row[15] - link.price_unit_local_VAT_incl = query_row[16] - link.active = query_row[17] - return link - def __repr__(self): - return f''' -{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK}: {self.id_link}, -{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER}: {self.id_order}, -{self.ATTR_ID_PRODUCT_CATEGORY}: {self.id_category}, -{self.ATTR_ID_PRODUCT}: {self.id_product}, -{self.ATTR_ID_PRODUCT_PERMUTATION}: {self.id_permutation}, -{self.FLAG_NAME}: {self.name_permutation}, -{self.FLAG_PRODUCT_VARIATIONS}: {self.csv_id_pairs_variation}, -{self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY}: {self.id_unit_quantity}, -{self.FLAG_QUANTITY_USED}: {self.quantity_used}, -{self.FLAG_QUANTITY_PRODUCED}: {self.quantity_produced}, -{self.ATTR_ID_UNIT_MEASUREMENT_LATENCY_MANUFACTURE}: {self.id_unit_latency_manufacture}, -{self.FLAG_LATENCY_MANUFACTURE}: {self.latency_manufacture}, -{self.FLAG_DISPLAY_ORDER}: {self.display_order}, -{self.FLAG_COST_UNIT_LOCAL_VAT_EXCL}: {self.cost_unit_local_VAT_excl}, -{self.FLAG_COST_UNIT_LOCAL_VAT_INCL}: {self.cost_unit_local_VAT_incl}, -{self.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL}: {self.price_unit_local_VAT_excl}, -{self.FLAG_PRICE_UNIT_LOCAL_VAT_INCL}: {self.price_unit_local_VAT_incl}, -{self.FLAG_ACTIVE}: {self.active} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK: self.id_link, - self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER: self.id_order, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.FLAG_NAME: self.name_permutation, - self.FLAG_PRODUCT_VARIATIONS: self.csv_id_pairs_variation, - self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY: self.id_unit_quantity, - self.FLAG_QUANTITY_USED: self.quantity_used, - self.FLAG_QUANTITY_PRODUCED: self.quantity_produced, - self.ATTR_ID_UNIT_MEASUREMENT_LATENCY_MANUFACTURE: self.id_unit_latency_manufacture, - self.FLAG_LATENCY_MANUFACTURE: self.latency_manufacture, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_unit_local_VAT_excl, - self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_unit_local_VAT_incl, - self.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL: self.price_unit_local_VAT_excl, - self.FLAG_PRICE_UNIT_LOCAL_VAT_INCL: self.price_unit_local_VAT_incl, - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - } - def to_json_option(self): - return { - 'value': self.id_order, - 'text': self.name_permutation, - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - link = cls() - link.id_link = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK] - link.id_order = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER] - link.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - link.id_product = json[cls.ATTR_ID_PRODUCT] - link.id_permutation = json.get(cls.ATTR_ID_PRODUCT_PERMUTATION, None) - link.name_permutation = json.get(cls.FLAG_NAME, None) - link.csv_id_pairs_variation = json[cls.FLAG_PRODUCT_VARIATIONS] - link.id_unit_quantity = json[cls.ATTR_ID_UNIT_MEASUREMENT_QUANTITY] - link.quantity_used = json[cls.FLAG_QUANTITY_USED] - link.quantity_produced = json[cls.FLAG_QUANTITY_PRODUCED] - link.id_unit_latency_manufacture = json[cls.ATTR_ID_UNIT_MEASUREMENT_LATENCY_MANUFACTURE] - link.latency_manufacture = json[cls.FLAG_LATENCY_MANUFACTURE] - link.display_order = json[cls.FLAG_DISPLAY_ORDER] - link.cost_unit_local_VAT_excl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL, None) - link.cost_unit_local_VAT_incl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_INCL, None) - link.active = json[cls.FLAG_ACTIVE] - return link - -class Parameters_Manufacturing_Purchase_Order(Get_Many_Parameters_Base): - a_get_all_order: bool - a_get_inactive_order: bool - a_ids_order: str - a_ids_permutation: str - a_date_from: Optional[datetime] - a_date_to: Optional[datetime] - def __init__(self, **kwargs): - super().__init__(**kwargs) - @classmethod - def get_default(cls): - return cls( - a_get_all_order = True, - a_get_inactive_order = False, - a_ids_order = '', - a_ids_permutation = '', - a_date_from = None, - a_date_to = None - ) - @classmethod - def from_filters_manufacturing_purchase_order(cls, form): - parameters = cls.get_default() - parameters.a_get_inactive_order = form.active.data - parameters.a_date_from = form.date_from.data - parameters.a_date_to = form.date_to.data - return parameters - -class Manufacturing_Purchase_Order_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Manufacturing_Purchase_Order_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_order: int = db.Column(db.Integer) - id_currency: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_manufacturing_purchase_order(cls, manufacturing_purchase_order): - row = cls() - row.id_order = manufacturing_purchase_order.id_order - row.id_currency = manufacturing_purchase_order.id_currency - row.active = 1 if manufacturing_purchase_order.active else 0 - return row - def __repr__(self): - return f''' -id_order: {self.id_order} -id_currency: {self.id_currency} -active: {self.active} -guid: {self.guid} - ''' - -class Manufacturing_Purchase_Order_Product_Link_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Manufacturing_Purchase_Order_Product_Link_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_link: int = db.Column(db.Integer) - id_order: int = db.Column(db.Integer) - # id_category: int = db.Column(db.Integer) - id_product: int = db.Column(db.Integer) - id_permutation: int = db.Column(db.Integer) - csv_list_variations: str = db.Column(db.String) - id_unit_quantity: int = db.Column(db.Integer) - quantity_used: float = db.Column(db.Float) - quantity_produced: float = db.Column(db.Float) - id_unit_latency_manufacture = db.Column(db.Integer) - latency_manufacture: int = db.Column(db.Integer) - display_order: int = db.Column(db.Integer) - """ - cost_unit_local_VAT_excl: float = db.Column(db.Float) - cost_unit_local_VAT_incl: float = db.Column(db.Float) - price_unit_local_VAT_excl: float = db.Column(db.Float) - price_unit_local_VAT_incl: float = db.Column(db.Float) - """ - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_manufacturing_purchase_order_product_link(cls, manufacturing_purchase_order_product_link): - row = cls() - row.id_link = manufacturing_purchase_order_product_link.id_link - row.id_order = manufacturing_purchase_order_product_link.id_order - # row.id_category = manufacturing_purchase_order_product_link.id_category - row.id_product = manufacturing_purchase_order_product_link.id_product - row.id_permutation = manufacturing_purchase_order_product_link.id_permutation - row.csv_list_variations = manufacturing_purchase_order_product_link.csv_id_pairs_variation - row.id_unit_quantity = manufacturing_purchase_order_product_link.id_unit_quantity - row.quantity_used = manufacturing_purchase_order_product_link.quantity_used - row.quantity_produced = manufacturing_purchase_order_product_link.quantity_produced - row.id_unit_latency_manufacture = manufacturing_purchase_order_product_link.id_unit_latency_manufacture - row.latency_manufacture = manufacturing_purchase_order_product_link.latency_manufacture - row.display_order = manufacturing_purchase_order_product_link.display_order - """ - row.cost_unit_local_VAT_excl = manufacturing_purchase_order_product_link.cost_unit_local_VAT_excl - row.cost_unit_local_VAT_incl = manufacturing_purchase_order_product_link.cost_unit_local_VAT_incl - row.price_unit_local_VAT_excl = manufacturing_purchase_order_product_link.price_unit_local_VAT_excl - row.price_unit_local_VAT_incl = manufacturing_purchase_order_product_link.price_unit_local_VAT_incl - """ - row.active = 1 if manufacturing_purchase_order_product_link.active else 0 - return row - def __repr__(self): - return f''' -id_link: {self.id_link} -id_order: {self.id_order} -id_product: {self.id_product} -id_permutation: {self.id_permutation} -csv_list_variations: {self.csv_list_variations} -id_unit_quantity: {self.id_unit_quantity} -quantity_used: {self.quantity_used} -quantity_produced: {self.quantity_produced} -{self.ATTR_ID_UNIT_MEASUREMENT_LATENCY_MANUFACTURE}: {self.id_unit_latency_manufacture} -latency_manufacture: {self.latency_manufacture} -display_order: {self.display_order} -active: {self.active} -guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/order.py b/business_objects/store/order.py deleted file mode 100644 index 12e02bb8..00000000 --- a/business_objects/store/order.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Order Business Object - -Description: -Business object for order -""" - -# internal -import lib.argument_validation as av -# from lib import data_types -from business_objects.store.product import Product -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.store_base import Store_Base -# from forms import Form_Product -# from models.model_view_store import Model_View_Store # circular -# external -# from enum import Enum -from flask import jsonify -import locale - - -# VARIABLE INSTANTIATION - -# CLASSES -class Order(Store_Base): - category: str - product: Product - quantity: int - subtotal: float - delivery_option: Delivery_Option - # form: Form_Product - - def __new__(cls, category, product, quantity): - # Initialiser - validation - _m = 'Product.__new__' - v_arg_type = 'class attribute' - av.val_str(category, 'category', _m, v_arg_type=v_arg_type) - av.val_instance(product, 'product', _m, Product, v_arg_type=v_arg_type) - av.full_val_float(quantity, 'quantity', _m, product.quantity_min, v_arg_type=v_arg_type) - return super(Basket_Item, cls).__new__(cls) - - def __init__(self, category, product, quantity): - # Constructor - self.category = category - self.product = product - self.quantity = quantity - self.subtotal = round(self.product.price_GBP_full * self.quantity, 2) - """ - self.form = Form_Product() - if self.form.validate_on_submit(): - # Handle form submission - - pass - """ - - def update_quantity(self, quantity): - _m = 'Basket_Item.update_quantity' - v_arg_type = 'class attribute' - av.full_val_float(quantity, 'quantity', _m, self.product.quantity_min, v_arg_type=v_arg_type) - self.quantity = quantity - self.subtotal = round(self.product.price_GBP_full * self.quantity, 2) - - def jsonify(self): - return jsonify(self) - - def to_json(self): - return { - **self.get_shared_json_attributes(self), - 'product_id': self.product.id_product, - 'price': self.product.price_GBP_full, - 'quantity': self.quantity - } - - def output_subtotal(self): - locale.setlocale(locale.LC_ALL, '') - return locale.format_string("%d", self.subtotal, grouping=True) - - def __repr__(self): - return f''' - category: {self.category} - product: {self.product} - quantity: {self.quantity} - subtotal: {self.subtotal} - ''' \ No newline at end of file diff --git a/business_objects/store/plant.py b/business_objects/store/plant.py deleted file mode 100644 index 17d506f9..00000000 --- a/business_objects/store/plant.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Plant Business Object - -Description: -Business object for plant -""" - -# internal -import lib.argument_validation as av -from business_objects.address import Address -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from typing import ClassVar - - -class Plant(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PLANT - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - __tablename__ = 'Shop_Plant' - id_plant = db.Column(db.Integer, primary_key=True) - code = db.Column(db.String(50)) - name = db.Column(db.String(255)) - id_address = db.Column(db.Integer) - id_user_manager = db.Column(db.Integer) - active = db.Column(db.Boolean) - - # address = None - - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.address = None - @classmethod - def from_DB_storage_location(cls, query_row): - plant = cls() - plant.id_plant = query_row[1] - plant.id_address = query_row[2] - plant.address = Address.from_DB_storage_location(query_row) - return plant - @classmethod - def from_DB_plant(cls, query_row): - plant = cls() - plant.id_plant = query_row[0] - plant.id_address = query_row[1] - plant.address = Address.from_DB_plant(query_row) - plant.code = query_row[4] - plant.name = query_row[5] - plant.active = query_row[6] - return plant - @classmethod - def from_DB_stock_item(cls, query_row): - plant = cls() - plant.id_plant = query_row[5] - plant.code = query_row[10] - plant.name = query_row[11] - return plant - def __repr__(self): - return f''' - {self.ATTR_ID_PLANT}: {self.id_plant} - {self.FLAG_CODE}: {self.code} - {self.FLAG_NAME}: {self.name} - {self.FLAG_ADDRESS}: {self.address} - {self.ATTR_ID_USER_MANAGER}: {self.id_user_manager} - {self.FLAG_ACTIVE}: {self.active} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PLANT: self.id_plant, - self.FLAG_CODE: self.code, - self.FLAG_NAME: self.name, - self.FLAG_ADDRESS: None if self.address is None else self.address.to_json(), - self.ATTR_ID_USER_MANAGER: self.id_user_manager, - self.FLAG_ACTIVE: 1 if av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0 - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - plant = cls() - plant.id_plant = json[cls.ATTR_ID_PLANT], - plant.code = json[cls.FLAG_CODE], - plant.name = json[cls.FLAG_NAME], - plant.address = Address.from_json(json[cls.FLAG_ADDRESS]), - plant.id_user_manager = json[cls.ATTR_ID_USER_MANAGER], - plant.active = json[cls.FLAG_ACTIVE] - return plant diff --git a/business_objects/store/product.py b/business_objects/store/product.py deleted file mode 100644 index 4888216d..00000000 --- a/business_objects/store/product.py +++ /dev/null @@ -1,917 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Business Object - -Description: -Business object for product -""" - -# internal -import lib.argument_validation as av -from lib import data_types -from forms.forms import Form_Basket_Add, Form_Basket_Edit -from forms.store.product_permutation import Filters_Product_Permutation -from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.discount import Discount -from business_objects.store.image import Image -from business_objects.store.product_permutation import Product_Permutation -from business_objects.store.product_price import Product_Price -from business_objects.store.store_base import Store_Base -from business_objects.store.stock_item import Stock_Item -from business_objects.store.product_variation import Product_Variation -from business_objects.store.product_variation_tree import Product_Variation_Tree -from extensions import db -from forms.base import Form_Base -from forms.store.product import Filters_Product -from helpers.helper_app import Helper_App -# external -from dataclasses import dataclass -from typing import ClassVar, List -""" -class Enum_Status_Stock(Enum): - OUT = 0 - LOW = 1 - IN = 99 - - def text(self): - return Enum_Status_Stock.Enum_Status_Stock_Text(self) - - def Enum_Status_Stock_Text(status): - av.val_instance(status, 'category', 'Enum_Status_Stock_Text', Enum_Status_Stock) - if status == Enum_Status_Stock.OUT: - return 'Out of stock' - elif status == Enum_Status_Stock.LOW: - return 'Low on stock' - else: - return 'Fully stocked' - - def get_member_by_text(text): - return data_types.get_enum_member_by_text(Enum_Status_Stock, text.upper()) - -""" -class Product(SQLAlchemy_ABC, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - # FLAG_HAS_VARIATIONS: ClassVar[str] = 'has-variations-product' - FLAG_INDEX_PERMUTATION_SELECTED: ClassVar[str] = 'index-permutation-selected' - FLAG_PRODUCT_VARIATION_TREES: ClassVar[str] = 'variation-trees' - - id_product = db.Column(db.Integer, primary_key=True) - id_category = db.Column(db.Integer) - name = db.Column(db.String(255)) - id_access_level_required = db.Column(db.Integer) - active = db.Column(db.Boolean) - display_order = db.Column(db.Integer) - can_view = db.Column(db.Boolean) - can_edit = db.Column(db.Boolean) - can_admin = db.Column(db.Boolean) - # form_basket_add: Form_Basket_Add - # form_basket_edit: Form_Basket_Edit - # has_variations: bool - # index_permutation_selected: int - - """ - permutations: list = None - permutation_index: dict = None - variation_trees: list = None - """ - - def __init__(self): - self.permutations = [] - self.permutation_index = {} - self.variation_trees = [] - self.index_permutation_selected = None - self.has_variations = False - super().__init__() - Store_Base.__init__(self) - self.form_basket_add = Form_Basket_Add() - self.form_basket_edit = Form_Basket_Edit() - self.name_access_level_required = None - - def from_DB_get_many_product_catalogue(query_row): - _m = 'Product.from_DB_get_many_product_catalogue' - v_arg_type = 'class attribute' - product = Product() - product.id_product = query_row[0] - product.id_category = query_row[1] - product.name = query_row[2] - product.has_variations = av.input_bool(query_row[3], "has_variations", _m, v_arg_type=v_arg_type) - product.id_access_level_required = query_row[4] - product.name_access_level_required = query_row[5] - product.active = av.input_bool(query_row[6], "active", _m, v_arg_type=v_arg_type) - product.display_order = query_row[7] - product.can_view = av.input_bool(query_row[8], "can_view", _m, v_arg_type=v_arg_type) - product.can_edit = av.input_bool(query_row[9], "can_edit", _m, v_arg_type=v_arg_type) - product.can_admin = av.input_bool(query_row[10], "can_admin", _m, v_arg_type=v_arg_type) - return product - """ - def from_permutation(permutation, has_variations = False): - _m = 'Product.from_permutation' - v_arg_type = 'class attribute' - av.val_instance(permutation, 'permutation', _m, Product_Permutation, v_arg_type=v_arg_type) - product = Product() - product.has_variations = has_variations - product.index_permutation_selected = 0 - product.id_product = permutation.id_product - product.id_category = permutation.id_category - product.display_order = permutation.display_order - product.can_view = permutation.can_view - product.can_edit = permutation.can_edit - product.can_admin = permutation.can_admin - product.permutations.append(permutation) - # product.get_variation_trees() - return product - """ - def add_product_permutation(self, permutation): - _m = 'Product.add_product_permutation' - av.val_instance(permutation, 'permutation', _m, Product_Permutation) - try: - self.permutation_index[permutation.id_permutation] - raise ValueError(f"{av.error_msg_str(permutation, 'permutation', _m, Product_Permutation)}\nPermutation ID already in product") - except KeyError: - self.permutation_index[permutation.id_permutation] = len(self.permutations) - self.permutations.append(permutation) - """ - if self.has_variations: - self.has_variations = False - """ - if self.index_permutation_selected is None: - self.index_permutation_selected = self.permutation_index[permutation.id_permutation] - Helper_App.console_log(f'setting selected permutation for product {self.id_product} to {self.index_permutation_selected}') # :\n{self.permutations[self.index_permutation_selected]} - """ - def from_permutations(permutations): - _m = 'Product.from_permutations' - v_arg_type = 'class attribute' - if len(permutations) == 0: - raise ValueError(av.error_msg_str(permutations, 'permutations', _m, list, v_arg_type=v_arg_type)) - product = Product() - product.has_variations = True - product.index_permutation_selected = 0 - product.id_product = permutations[0].id_product - product.id_category = permutations[0].id_category - product.display_order = permutations[0].display_order - product.can_view = True - product.can_edit = True - product.can_admin = True - for permutation in permutations: - product.can_view &= permutation.can_view - product.can_edit &= permutation.can_edit - product.can_admin &= permutation.can_admin - product.permutations.append(permutations) - product.get_variation_trees() - return product - """ - def get_variation_trees(self): - self.variation_trees = [] - for index_permutation in range(len(self.permutations)): - permutation = self.permutations[index_permutation] - variation_tree = permutation.variation_tree # Product_Variation_Tree.from_product_permutation(permutation) - found_variation_tree_match = False - for index_tree in range(len(self.variation_trees)): - if self.variation_trees[index_tree].is_equal(variation_tree): - found_variation_tree_match = True - break - if not found_variation_tree_match and variation_tree is not None: - self.variation_trees.append(variation_tree) - def from_DB_Stripe_product(query_row): - permutation = Product_Permutation.from_DB_Stripe_product(query_row) - product = Product.from_permutation(permutation) - return product - def from_DB_Stripe_price(query_row): - permutation = Product_Permutation.from_DB_Stripe_price(query_row) - product = Product.from_permutation(permutation) - return product - """ - def from_json(json_basket_item, key_id_product, key_id_permutation): - permutation = Product_Permutation.from_json(json_basket_item, key_id_product, key_id_permutation) - product = Product.from_permutation(permutation) - return product - """ - @classmethod - def from_json(cls, json): - product = cls() - product.id_product = json[cls.ATTR_ID_PRODUCT] - product.display_order = json[cls.FLAG_DISPLAY_ORDER] - product.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - product.name = json[cls.FLAG_NAME] - product.has_variations = av.input_bool(json.get(cls.FLAG_HAS_VARIATIONS, None), cls.FLAG_HAS_VARIATIONS, f'{cls.__name__}.from_json') - product.id_access_level_required = json.get(cls.ATTR_ID_ACCESS_LEVEL, None) - product.active = 1 if av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, f'{cls.__name__}.from_json') else 0 - product.can_view = json.get(cls.FLAG_CAN_VIEW, None) - product.can_edit = json.get(cls.FLAG_CAN_EDIT, None) - product.can_admin = json.get(cls.FLAG_CAN_ADMIN, None) - return product - def get_permutation_selected(self): - try: - return self.permutations[self.index_permutation_selected] - except: - raise ValueError(f'list index {self.index_permutation_selected} out of range') - def output_lead_time(self): - return self.get_permutation_selected().output_lead_time() - def output_delivery_date(self): - return self.get_permutation_selected().output_delivery_date() - def output_price(self, is_included_VAT): - return self.get_permutation_selected().output_price(is_included_VAT) - def output_price_VAT_incl(self): - return self.get_permutation_selected().output_price(True) - def output_price_VAT_excl(self): - return self.get_permutation_selected().output_price(False) - def get_price_local(self, is_included_VAT): - if is_included_VAT: - return self.get_price_local_VAT_incl() - else: - return self.get_price_local_VAT_excl() - def get_price_local_VAT_incl(self): - return self.get_permutation_selected().get_price_local_VAT_incl() - def get_price_local_VAT_excl(self): - return self.get_permutation_selected().get_price_local_VAT_excl() - def get_quantity_min(self): - return self.get_permutation_selected().quantity_min - def get_id_permutation(self): - return self.get_permutation_selected().id_permutation - def get_image_from_index(self, index_image): - return self.get_permutation_selected().images[index_image] - def get_name(self): - return self.get_permutation_selected().name - def get_description(self): - return self.get_permutation_selected().description - def output_currency(self): - return self.get_permutation_selected().get_price().symbol_currency - """ - def add_form_basket_add(self): - self.form_basket_add = None - - def add_form_basket_edit(self): - self.form_basket_edit = None - """ - def __repr__(self): - return f'''Product - id_product: {self.id_product} - id_category: {self.id_category} - name: {self.name} - display_order: {self.display_order} - can_view: {self.can_view} - can_edit: {self.can_edit} - can_admin: {self.can_admin} - has_variations: {self.has_variations} - permutations: {self.permutations} - variation trees: {self.variation_trees} - active: {self.active} - ''' - """ - def get_index_permutation_from_id(self, id_permutation): - if id_permutation is None and not self.has_variations: - return 0 - for index_permutation in range(len(self.permutations)): - permutation = self.permutations[index_permutation] - if permutation.id_permutation == id_permutation: - return index_permutation - raise ValueError(f"{av.error_msg_str(id_permutation, 'id_permutation', 'Product.get_index_permutation_from_id', int)}\nPermutation ID not found.") - """ - """ - def add_product_variation(self, variation): - av.val_instance(variation, 'variation', 'Product.add_product_variation', Product_Variation) - # Helper_App.console_log(f'variation: {variation}') - index_permutation = self.permutation_index[variation.id_permutation] # self.get_index_permutation_from_id(variation.id_permutation) - self.permutations[index_permutation].add_product_variation(variation) - """ - def add_product_variation_type(self, variation_type): - variation = variation_type.variations[0] - index_permutation = self.permutation_index[variation.id_permutation] - self.permutations[index_permutation].add_product_variation_type(variation_type) - def add_product_price(self, price): - av.val_instance(price, 'price', 'Product.add_product_price', Product_Price) - index_permutation = self.permutation_index[price.id_permutation] # self.get_index_permutation_from_id(price.id_permutation) - self.permutations[index_permutation].add_product_price(price) - def add_product_image(self, image): - av.val_instance(image, 'image', 'Product.add_product_image', Image) - index_permutation = self.permutation_index[image.id_permutation] # self.get_index_permutation_from_id(image.id_permutation) - self.permutations[index_permutation].add_product_image(image) - def add_delivery_option(self, delivery_option): - av.val_instance(delivery_option, 'delivery_option', 'Product.add_delivery_option', Delivery_Option) - index_permutation = self.permutation_index[delivery_option.id_permutation] # self.get_index_permutation_from_id(delivery_option.id_permutation) - self.permutations[index_permutation].add_delivery_option(delivery_option) - def add_product_price_discount(self, discount): - av.val_instance(discount, 'discount', 'Product.add_product_price_discount', Discount) - index_permutation = self.permutation_index[discount.id_permutation] # self.get_index_permutation_from_id(discount.id_permutation) - self.permutations[index_permutation].add_product_price_discount(discount) - def add_stock_item(self, stock_item): - av.val_instance(stock_item, 'stock_item', 'Product.add_stock_item', Stock_Item) - index_permutation = self.permutation_index[stock_item.id_permutation] - self.permutations[index_permutation].add_stock_item(stock_item) - def has_permutations(self): - return len(self.permutations) > 0 - def is_available(self): - if len(self.permutations) == 0: - return False - for permutation in self.permutations: - if permutation.is_available(): - return True - return False - def to_permutation_row_list(self): - list_rows = [] - for permutation in self.permutations: - list_rows.append(permutation.to_row_permutation()) - return list_rows - """ - @classmethod - def from_json(cls, json): - product = cls() - product.id_product = json[cls.ATTR_ID_PRODUCT] - product.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - product.name = json[cls.FLAG_NAME] - product.display_order = json[cls.FLAG_DISPLAY_ORDER] - product.can_view = json[cls.FLAG_CAN_VIEW] - product.can_edit = json[cls.FLAG_CAN_EDIT] - product.can_admin = json[cls.FLAG_CAN_ADMIN] - product.has_variations = json[cls.FLAG_HAS_VARIATIONS] - product.index_permutation_selected = json[cls.FLAG_INDEX_PERMUTATION_SELECTED] - product.permutations = [] - for json_permutation in json[cls.ATTR_ID_PRODUCT_PERMUTATION]: - product.permutations.append(Product_Permutation.from_json(json_permutation)) - product.variation_trees = [] - for json_tree in json[cls.FLAG_PRODUCT_VARIATION_TREES]: - product.variation_trees.append(Product_Variation_Tree.from_json(json_tree)) - return product - """ - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.FLAG_NAME: self.name, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_CAN_VIEW: self.can_view, - self.FLAG_CAN_EDIT: self.can_edit, - self.FLAG_CAN_ADMIN: self.can_admin, - self.FLAG_HAS_VARIATIONS: self.has_variations, - self.FLAG_INDEX_PERMUTATION_SELECTED: self.index_permutation_selected, - self.ATTR_ID_PRODUCT_PERMUTATION: [permutation.to_json() for permutation in self.permutations], - self.FLAG_PRODUCT_VARIATION_TREES: [tree.to_json() for tree in self.variation_trees] - } - def to_json_option(self): - return { - 'value': self.id_product, - 'text': self.name - } - def get_variation_types_unique(self): - list_types = [] - for tree in self.variation_trees: - for type in tree.get_types_unique(): - if type not in list_types: - list_types.append(type) - return list_types - """ - def get_json_str_types_variation_trees(self): - json_str = '' - for tree in self.variation_trees: - if json_str != '': - json_str += '\n' - json_str += tree.get_json_str_types() - return json_str - def get_text_input_variation_types(self): - text_input = '' - for tree in self.variation_trees: - if text_input != '': - text_input += '\n' - text_input += tree.get_text_input_types() - return text_input - """ - def get_csv_ids_permutation(self): - csv = '' - for permutation in self.permutations: - if csv != '': - csv += ',' - csv += str(permutation.id_permutation) - return csv - - -class Parameters_Product(Get_Many_Parameters_Base): - # id_user: str - get_all_product_category: bool - get_inactive_product_category: bool - # get_first_product_category_only: bool - ids_product_category: str - get_all_product: bool - get_inactive_product: bool - # get_first_product_only: bool - ids_product: str - get_all_permutation: bool - get_inactive_permutation: bool - # get_first_permutation_only: bool - ids_permutation: str - get_all_image: bool - get_inactive_image: bool - # get_first_image_only: bool - ids_image: str - """ - get_all_region: bool - get_inactive_region: bool - get_first_region_only: bool - ids_region: str - get_all_currency: bool - get_inactive_currency: bool - get_first_currency_only: bool - ids_currency: str - get_all_discount: bool - get_inactive_discount: bool - ids_discount: str - """ - get_products_quantity_stock_below_min: bool - - def to_json(self): - return { - # 'a_id_user': None, - 'a_get_all_product_category': self.get_all_product_category, - 'a_get_inactive_product_category': self.get_inactive_product_category, - # 'a_get_first_product_category_only': self.get_first_product_category_only, - 'a_ids_product_category': self.ids_product_category, - 'a_get_all_product': self.get_all_product, - 'a_get_inactive_product': self.get_inactive_product, - # 'a_get_first_product_only': self.get_first_product_only, - 'a_ids_product': self.ids_product, - 'a_get_all_permutation': self.get_all_permutation, - 'a_get_inactive_permutation': self.get_inactive_permutation, - # 'a_get_first_permutation_only': self.get_first_permutation_only, - 'a_ids_permutation': self.ids_permutation, - 'a_get_all_image': self.get_all_image, - 'a_get_inactive_image': self.get_inactive_image, - # 'a_get_first_image_only': self.get_first_image_only, - 'a_ids_image': self.ids_image, - # 'a_get_all_delivery_region': self.get_all_region, - # 'a_get_inactive_delivery_region': self.get_inactive_region, - # 'a_get_first_delivery_region_only': self.get_first_region_only, - # 'a_ids_delivery_region': self.ids_region, - # 'a_get_all_currency': self.get_all_currency, - # 'a_get_inactive_currency': self.get_inactive_currency, - # 'a_get_first_currency_only': self.get_first_currency_only, - # 'a_ids_currency': self.ids_currency, - # 'a_get_all_discount': self.get_all_discount, - # 'a_get_inactive_discount': self.get_inactive_discount, - # 'a_ids_discount': self.ids_discount, - 'a_get_products_quantity_stock_below_min': self.get_products_quantity_stock_below_min - } - - @staticmethod - def from_form_filters_product(form): - # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') - av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product) - has_filter_category = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None) - is_not_empty = av.input_bool(form.is_not_empty.data, "is_not_empty", "Parameters_Product.from_form_filters_product") - active = av.input_bool(form.active.data, "active", "Parameters_Product.from_form_filters_product") - return Parameters_Product( - get_all_product_category = not has_filter_category, - get_inactive_product_category = not active, - # get_first_product_category_only = False, - ids_product_category = form.id_category.data if form.id_category.data is not None else '', - get_all_product = True, - get_inactive_product = not active, - # get_first_product_only = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = not active, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = False, - # get_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = False, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = False, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = False - ) - @staticmethod - def from_form_filters_product_permutation(form): - # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') - # av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product_Permutation) - has_category_filter = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None) - has_product_filter = not (form.id_product.data == '0' or form.id_product.data == '' or form.id_product.data is None) - get_permutations_stock_below_min = av.input_bool(form.is_out_of_stock.data, "is_out_of_stock", "Parameters_Product.from_form_filters_product_permutation") - get_inactive = not av.input_bool(form.active.data, "active", "Parameters_Product.from_form_filters_product_permutation") - Helper_App.console_log(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\nform question: {type(form.active)}\nget_inactive:{get_inactive}\ntype form: {type(form)}') - return Parameters_Product( - get_all_product_category = not has_category_filter, - get_inactive_product_category = get_inactive, - # get_first_product_category_only = False, - ids_product_category = form.id_category.data if form.id_category.data is not None else '', - get_all_product = not has_product_filter, - get_inactive_product = get_inactive, - # get_first_product_only = False, - ids_product = form.id_product.data if form.id_product.data is not None else '', - get_all_permutation = not get_permutations_stock_below_min, - get_inactive_permutation = get_inactive, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = False, - # get_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = False, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = False, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = get_permutations_stock_below_min - ) - - @staticmethod - def get_default(): - return Parameters_Product( - get_all_product_category = True, - get_inactive_product_category = False, - # get_first_product_category_only = False, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - # get_first_product_only = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = True, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = True, - # et_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = True, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = True, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = True - ) - - @classmethod - def from_json(cls, json): - return cls( - get_all_product_category = json.get('a_get_all_product_category', False), - get_inactive_product_category = json.get('a_get_inactive_product_category', False), - # get_first_product_category_only = json.get('a_get_first_product_category_only', False), - ids_product_category = json.get('a_ids_product_category', ''), - get_all_product = json.get('a_get_all_product', False), - get_inactive_product = json.get('a_get_inactive_product', False), - # get_first_product_only = json.get('a_get_first_product_only', False), - ids_product = json.get('a_ids_product', ''), - get_all_permutation = json.get('a_get_all_permutation', False), - get_inactive_permutation = json.get('a_get_inactive_permutation', False), - # get_first_permutation_only = json.get('a_get_first_permutation_only', False), - ids_permutation = json.get('a_ids_permutation', ''), - get_all_image = json.get('a_get_all_image', False), - get_inactive_image = json.get('a_get_inactive_image', False), - # get_first_image_only = json.get('a_get_first_image_only', False), - ids_image = json.get('a_ids_image', ''), - # get_all_region = json.get('a_get_all_region', False), - # get_inactive_region = json.get('a_get_inactive_region', False), - # get_first_region_only = json.get('a_get_first_region_only', False), - # ids_region = json.get('a_ids_region', ''), - # get_all_currency = json.get('a_get_all_currency', False), - # get_inactive_currency = json.get('a_get_inactive_currency', False), - # get_first_currency_only = json.get('a_get_first_currency_only', False), - # ids_currency = json.get('a_ids_currency', ''), - # get_all_discount = json.get('a_get_all_discount', False), - # get_inactive_discount = json.get('a_get_inactive_discount', False), - # ids_discount = json.get('a_ids_discount', ''), - get_products_quantity_stock_below_min = json.get('a_get_products_quantity_stock_below_min', False) - ) - - @classmethod - def from_filters_product_category(cls, filters_category): - return cls( - get_all_product_category = True, - get_inactive_product_category = not filters_category.active.data, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - ids_image = '', - get_products_quantity_stock_below_min = False - ) - @classmethod - def from_filters_stock_item(cls, filters_stock_item): - return cls.from_form_filters_product_permutation(filters_stock_item) - -""" -class Parameters_Product(Get_Many_Parameters_Base): - # id_user: str - get_all_product_category: bool - get_inactive_product_category: bool - # get_first_product_category_only: bool - ids_product_category: str - get_all_product: bool - get_inactive_product: bool - # get_first_product_only: bool - ids_product: str - get_all_permutation: bool - get_inactive_permutation: bool - # get_first_permutation_only: bool - ids_permutation: str - get_all_image: bool - get_inactive_image: bool - # get_first_image_only: bool - ids_image: str - "" - get_all_region: bool - get_inactive_region: bool - get_first_region_only: bool - ids_region: str - get_all_currency: bool - get_inactive_currency: bool - get_first_currency_only: bool - ids_currency: str - get_all_discount: bool - get_inactive_discount: bool - ids_discount: str - "" - get_products_quantity_stock_below_min: bool - - def __init__(self, a_id_user, **kwargs): - super().__init__(a_id_user, **kwargs) - - def to_json(self): - return { - 'a_id_user': self.a_id_user, - 'a_get_all_product_category': self.get_all_product_category, - 'a_get_inactive_product_category': self.get_inactive_product_category, - # 'a_get_first_product_category_only': self.get_first_product_category_only, - 'a_ids_product_category': self.ids_product_category, - 'a_get_all_product': self.get_all_product, - 'a_get_inactive_product': self.get_inactive_product, - # 'a_get_first_product_only': self.get_first_product_only, - 'a_ids_product': self.ids_product, - 'a_get_all_permutation': self.get_all_permutation, - 'a_get_inactive_permutation': self.get_inactive_permutation, - # 'a_get_first_permutation_only': self.get_first_permutation_only, - 'a_ids_permutation': self.ids_permutation, - 'a_get_all_image': self.get_all_image, - 'a_get_inactive_image': self.get_inactive_image, - # 'a_get_first_image_only': self.get_first_image_only, - 'a_ids_image': self.ids_image, - # 'a_get_all_delivery_region': self.get_all_region, - # 'a_get_inactive_delivery_region': self.get_inactive_region, - # 'a_get_first_delivery_region_only': self.get_first_region_only, - # 'a_ids_delivery_region': self.ids_region, - # 'a_get_all_currency': self.get_all_currency, - # 'a_get_inactive_currency': self.get_inactive_currency, - # 'a_get_first_currency_only': self.get_first_currency_only, - # 'a_ids_currency': self.ids_currency, - # 'a_get_all_discount': self.get_all_discount, - # 'a_get_inactive_discount': self.get_inactive_discount, - # 'a_ids_discount': self.ids_discount, - 'a_get_products_quantity_stock_below_min': self.get_products_quantity_stock_below_min - } - - @staticmethod - def from_form_filters_product(form, id_user): - # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') - av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product) - has_filter_category = not (form.id_category.data == '0' or form.id_category.data == '') - is_not_empty = av.input_bool(form.is_not_empty.data, "is_not_empty", "Parameters_Product.from_form_filters_product") - active = av.input_bool(form.active.data, "active", "Parameters_Product.from_form_filters_product") - return Parameters_Product( - a_id_user = id_user, - get_all_product_category = not has_filter_category, - get_inactive_product_category = not active, - # get_first_product_category_only = False, - ids_product_category = str(form.id_category.data), - get_all_product = True, - get_inactive_product = not active, - # get_first_product_only = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = not active, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = False, - # get_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = False, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = False, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = False - ) - @staticmethod - def from_form_filters_product_permutation(form): - # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') - # av.val_instance(form, 'form', 'Parameters_Product.from_form', Form_Base) - has_category_filter = not (form.id_category.data is None or form.id_category.data == '0' or form.id_category.data == '') - has_product_filter = not (form.id_product.data is None or form.id_product.data == '0' or form.id_product.data == '') - get_permutations_stock_below_min = av.input_bool(form.is_out_of_stock.data, "is_out_of_stock", "Parameters_Product.from_form") - Helper_App.console_log(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\type form: {type(form)}') - return Parameters_Product( - get_all_product_category = not has_category_filter, - get_inactive_product_category = False, - # get_first_product_category_only = False, - ids_product_category = str(form.id_category.data) if has_category_filter else '', - get_all_product = not has_product_filter, - get_inactive_product = False, - # get_first_product_only = False, - ids_product = str(form.id_product.data) if has_product_filter else '', - get_all_permutation = not get_permutations_stock_below_min, - get_inactive_permutation = False, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = False, - # get_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = False, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = False, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = get_permutations_stock_below_min - ) - - @classmethod - def get_default(cls, id_user): - return cls( - a_id_user = id_user, - get_all_product_category = True, - get_inactive_product_category = False, - # get_first_product_category_only = False, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - # get_first_product_only = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - # get_first_permutation_only = False, - ids_permutation = '', - get_all_image = True, - get_inactive_image = False, - # get_first_image_only = False, - ids_image = '', - # get_all_region = True, - # et_inactive_region = False, - # get_first_region_only = False, - # ids_region = '', - # get_all_currency = True, - # get_inactive_currency = False, - # get_first_currency_only = False, - # ids_currency = '', - # get_all_discount = True, - # get_inactive_discount = False, - # ids_discount = '', - get_products_quantity_stock_below_min = True - ) - - @classmethod - def from_json(cls, json): - return cls( - get_all_product_category = json.get('a_get_all_product_category', False), - get_inactive_product_category = json.get('a_get_inactive_product_category', False), - # get_first_product_category_only = json.get('a_get_first_product_category_only', False), - ids_product_category = json.get('a_ids_product_category', ''), - get_all_product = json.get('a_get_all_product', False), - get_inactive_product = json.get('a_get_inactive_product', False), - # get_first_product_only = json.get('a_get_first_product_only', False), - ids_product = json.get('a_ids_product', ''), - get_all_permutation = json.get('a_get_all_permutation', False), - get_inactive_permutation = json.get('a_get_inactive_permutation', False), - # get_first_permutation_only = json.get('a_get_first_permutation_only', False), - ids_permutation = json.get('a_ids_permutation', ''), - get_all_image = json.get('a_get_all_image', False), - get_inactive_image = json.get('a_get_inactive_image', False), - # get_first_image_only = json.get('a_get_first_image_only', False), - ids_image = json.get('a_ids_image', ''), - # get_all_region = json.get('a_get_all_region', False), - # get_inactive_region = json.get('a_get_inactive_region', False), - # get_first_region_only = json.get('a_get_first_region_only', False), - # ids_region = json.get('a_ids_region', ''), - # get_all_currency = json.get('a_get_all_currency', False), - # get_inactive_currency = json.get('a_get_inactive_currency', False), - # get_first_currency_only = json.get('a_get_first_currency_only', False), - # ids_currency = json.get('a_ids_currency', ''), - # get_all_discount = json.get('a_get_all_discount', False), - # get_inactive_discount = json.get('a_get_inactive_discount', False), - # ids_discount = json.get('a_ids_discount', ''), - get_products_quantity_stock_below_min = json.get('a_get_products_quantity_stock_below_min', False) - ) - - @classmethod - def from_filters_product_category(cls, filters_category): - return cls( - get_all_product_category = True, - get_inactive_product_category = filters_category.active.data, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - ids_image = '', - get_products_quantity_stock_below_min = False - ) - @classmethod - def from_filters_stock_item(cls, filters_stock_item): - return cls.from_form_filters_product_permutation(filters_stock_item) -""" - -class Product_Temp(db.Model, Store_Base): - __tablename__ = 'Shop_Product_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_product: int = db.Column(db.Integer) - id_category: int = db.Column(db.Integer) - name: str = db.Column(db.String(255)) - has_variations: bool = db.Column(db.Boolean) - id_access_level_required: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - guid: str = db.Column(db.BINARY(36)) - # created_on: datetime = db.Column(db.DateTime) - # created_by: int = db.Column(db.Integer) - def __init__(self): - self.id_temp = None - @classmethod - def from_product(cls, product): - row = cls() - row.id_product = product.id_product[0] if isinstance(product.id_product, tuple) else product.id_product - row.id_category = product.id_category[0] if isinstance(product.id_category, tuple) else product.id_category - row.name = product.name[0] if isinstance(product.name, tuple) else product.name - row.has_variations = product.has_variations - row.id_access_level_required = product.id_access_level_required[0] if isinstance(product.id_access_level_required, tuple) else product.id_access_level_required - row.active = product.active - row.display_order = product.display_order - """ - row.guid = product.guid - row.created_on = product.created_on - row.created_by = product.created_by - """ - return row - def to_json(self): - return { - 'id_product': self.id_product, - 'id_category': self.id_category, - 'name': self.name, - 'has_variations': av.input_bool(self.has_variations, self.FLAG_HAS_VARIATIONS, f'{self.__class__.__name__}.to_json'), - 'id_access_level_required': self.id_access_level_required, - 'active': av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - 'display_order': self.display_order, - 'guid': self.guid, - } - """ - 'created_on': self.created_on, - 'created_by': self.created_by - """ - def __repr__(self): - return f'''Product_Temp - id_product: {self.id_product} - id_category: {self.id_category} - name: {self.name} - has_variations: {self.has_variations} - id_access_level_required: {self.id_access_level_required} - active: {self.active} - display_order: {self.display_order} - guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/product_category.py b/business_objects/store/product_category.py deleted file mode 100644 index e5f78c97..00000000 --- a/business_objects/store/product_category.py +++ /dev/null @@ -1,529 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Category Business Object - -Description: -Business object for product category -""" - -# internal -import lib.argument_validation as av -from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base -from business_objects.store.product import Product, Product_Permutation, Product_Price -# from business_objects.store.product_variation import Product_Variation -from business_objects.store.product_variation_type import Product_Variation_Type -from business_objects.store.image import Image -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.discount import Discount -from business_objects.store.stock_item import Stock_Item -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from pydantic import BaseModel -from typing import ClassVar - - -class Product_Category(SQLAlchemy_ABC, Store_Base): - FLAG_ACCESS_LEVEL_REQUIRED: ClassVar[str] = 'id_access_level_required' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT_CATEGORY - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - - __tablename__ = 'Shop_Product_Category' - id_category = db.Column(db.Integer, primary_key=True) - code = db.Column(db.String(50)) - name = db.Column(db.String(255)) - description = db.Column(db.String(4000)) - id_access_level_required = db.Column(db.Integer) - name_access_level_required = db.Column(db.String(255)) - display_order = db.Column(db.Integer) - active = db.Column(db.Boolean) - can_view = db.Column(db.Boolean) - can_edit = db.Column(db.Boolean) - can_admin = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - - """ - products: list = None # [] - product_index: dict = None # {} - """ - - def __init__(self): - self.products = [] - self.product_index = {} - super().__init__() - Store_Base.__init__(self) - self.name_access_level_required = None - @classmethod - def from_DB_get_many_product_catalogue(cls, query_row): - category = cls() - category.id_category = query_row[0] - category.code = query_row[1] - category.name = query_row[2] - category.description = query_row[3] - category.id_access_level_required = query_row[4] - category.name_access_level_required = query_row[5] - category.display_order = query_row[6] - category.active = av.input_bool(query_row[7], cls.FLAG_ACTIVE, f'{cls.__name__}.from_DB_get_many_product_catalogue') - category.can_view = av.input_bool(query_row[8], cls.FLAG_CAN_VIEW, f'{cls.__name__}.from_DB_get_many_product_catalogue') - category.can_edit = av.input_bool(query_row[9], cls.FLAG_CAN_EDIT, f'{cls.__name__}.from_DB_get_many_product_catalogue') - category.can_admin = av.input_bool(query_row[10], cls.FLAG_CAN_ADMIN, f'{cls.__name__}.from_DB_get_many_product_catalogue') - return category - """ - def key_product_index_from_ids_product_permutation(id_product, id_permutation): - return f'{id_product},{"" if id_permutation is None else id_permutation}' - def key_product_index_from_product(product): - av.val_instance(product, 'product', 'Category.key_product_index_from_product', Product) - return f'{product.id_product},{"" if product.id_permutation is None else product.id_permutation}' - """ - def get_index_product(self, product): - return self.get_index_product_from_id(product.id_product) - def get_index_product_from_id(self, id_product): - try: - return self.product_index[id_product] - except: - raise KeyError(f'product id: {id_product} not in product index keys: {self.product_index.keys()} with category id: {self.id_category}') - def get_index_product_from_id_permutation(self, id_permutation): - for product in self.products: - try: - index_permutation = product.get_index_permutation_from_id(id_permutation) - return self.get_index_product(product) - except: - pass - raise KeyError(f'permutation id: {id_permutation} not in category id: {self.id_category}') - def add_product(self, product): - _m = 'Category.add_product' - av.val_instance(product, 'product', _m, Product) - # self.product_index.append(len(self.products)) - # self.product_index[Category.key_product_index_from_ids_product_permutation(product.id_product, product.id_permutation)] = len(self.products) - try: - self.get_index_product(product) - Helper_App.console_log(f'category: {self}') - raise ValueError(f"{av.error_msg_str(product, 'product', _m, Product)}\nProduct already in category.") - except KeyError: - self.product_index[product.id_product] = len(self.products) - self.products.append(product) - def add_product_permutation(self, permutation): - _m = 'Category.add_product_permutation' - av.val_instance(permutation, 'permutation', _m, Product_Permutation) - # self.product_index.append(len(self.products)) - # self.product_index[Category.key_product_index_from_ids_product_permutation(product.id_product, product.id_permutation)] = len(self.products) - index_product = self.get_index_product_from_id(permutation.id_product) - # index_product = self.product_index[permutation.id_product] - self.products[index_product].add_product_permutation(permutation) - """ - def add_product_variation(self, variation): - av.val_instance(variation, 'variation', 'Category.add_product_variation', Product_Variation) - index_product = self.get_index_product_from_id(variation.id_product) - self.products[index_product].add_product_variation(variation) - """ - def add_product_variation_type(self, variation_type): - av.val_instance(variation_type, 'variation_type', 'Category.add_product_variation_type', Product_Variation_Type) - variation = variation_type.variations[0] - index_product = self.get_index_product_from_id(variation.id_product) - self.products[index_product].add_product_variation_type(variation_type) - def add_product_price(self, price): - av.val_instance(price, 'price', 'Category.add_product_price', Product_Price) - index_product = self.get_index_product_from_id(price.id_product) - self.products[index_product].add_product_price(price) - def add_product_image(self, image): - av.val_instance(image, 'image', 'Category.add_product_image', Image) - index_product = self.get_index_product_from_id(image.id_product) - self.products[index_product].add_product_image(image) - def add_delivery_option(self, delivery_option): - av.val_instance(delivery_option, 'delivery_option', 'Category.add_delivery_option', Delivery_Option) - index_product = self.get_index_product_from_id(delivery_option.id_product) - self.products[index_product].add_delivery_option(delivery_option) - def add_product_price_discount(self, discount): - av.val_instance(discount, 'discount', 'Category.add_product_price_discount', Discount) - index_product = self.get_index_product_from_id(discount.id_product) - self.products[index_product].add_product_price_discount(discount) - def add_stock_item(self, stock_item): - av.val_instance(stock_item, 'stock_item', 'Category.add_stock_item', Stock_Item) - index_product = self.get_index_product_from_id(stock_item.id_product) - self.products[index_product].add_stock_item(stock_item) - def get_all_product_variation_trees(self): - for product in self.products: - if product.has_variations: - Helper_App.console_log(f'product with id:{product.id_product} has variations') - product.get_variation_trees() - """ - def index_product_from_ids_product_permutation(self, id_product, id_permutation): - key = Category.key_product_index_from_ids_product_permutation(id_product, id_permutation) - Helper_App.console_log(f'product_index: {self.product_index}') - Helper_App.console_log(f'Key Error: {key}') - try: - return self.product_index[key] - except KeyError: - pass - """ - def __repr__(self): - return f''' - id: {self.id_category[0] if isinstance(self.id_category, tuple) else self.id_category} - code: {self.code[0] if isinstance(self.code, tuple) else self.code} - name: {self.name[0] if isinstance(self.name, tuple) else self.name} - description: {self.description[0] if isinstance(self.description, tuple) else self.description} - access_level: {self.name_access_level_required[0] if isinstance(self.name_access_level_required, tuple) else self.name_access_level_required} - display_order: {self.display_order} - active: {self.active} - products: {self.products} - ''' - """ - def get_permutation_first(self): - if not (len(self.products) == 0): - Helper_App.console_log(f'getting first permutation from product') - return None if len(self.products) == 0 else self.products[0].get_permutation_selected() - """ - def is_available(self): - if len(self.products) == 0: - return False - for product in self.products: - if product.is_available(): - return True - return False - def to_permutation_row_list(self): - list_rows = [] - for product in self.products: - list_rows += product.to_permutation_row_list() - return list_rows - def to_product_option_list(self): - list_products = [] - for product in self.products: - list_products.append({'value': product.id_product, 'text': product.name}) - return list_products - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category[0] if isinstance(self.id_category, tuple) else self.id_category, - self.FLAG_CODE: self.code[0] if isinstance(self.code, tuple) else self.code, - self.FLAG_NAME: self.name[0] if isinstance(self.name, tuple) else self.name, - self.FLAG_DESCRIPTION: self.description[0] if isinstance(self.description, tuple) else self.description, - self.ATTR_ID_ACCESS_LEVEL: self.id_access_level_required[0] if isinstance(self.id_access_level_required, tuple) else self.id_access_level_required, - self.FLAG_ACCESS_LEVEL_REQUIRED: self.name_access_level_required[0] if isinstance(self.name_access_level_required, tuple) else self.name_access_level_required, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_ACTIVE: self.active, - self.FLAG_CAN_VIEW: self.can_view, - self.FLAG_CAN_EDIT: self.can_edit, - self.FLAG_CAN_ADMIN: self.can_admin - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f' Category.from_json: {json}') - category = cls() - category.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - category.code = json[cls.FLAG_CODE] - category.name = json[cls.FLAG_NAME] - category.description = json[cls.FLAG_DESCRIPTION] - category.id_access_level_required = json[cls.ATTR_ID_ACCESS_LEVEL] - category.name_access_level_required = json.get(cls.FLAG_ACCESS_LEVEL_REQUIRED, '') - category.display_order = json[cls.FLAG_DISPLAY_ORDER] - category.active = 1 if av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, f'{cls.__name__}.from_json') else 0 - category.can_view = json.get(cls.FLAG_CAN_VIEW, False) - category.can_edit = json.get(cls.FLAG_CAN_EDIT, False) - category.can_admin = json.get(cls.FLAG_CAN_ADMIN, False) - return category - """ - def to_json_str(self): - return { - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category[0] if isinstance(self.id_category, tuple) else self.id_category, - self.FLAG_CODE: self.code[0] if isinstance(self.code, tuple) else self.code, - self.FLAG_NAME: self.name[0] if isinstance(self.name, tuple) else self.name, - self.FLAG_DESCRIPTION: self.description[0] if isinstance(self.description, tuple) else self.description, - self.ATTR_ID_ACCESS_LEVEL: self.id_access_level_required[0] if isinstance(self.id_access_level_required, tuple) else self.id_access_level_required, - self.FLAG_ACCESS_LEVEL_REQUIRED: self.name_access_level_required[0] if isinstance(self.name_access_level_required, tuple) else self.name_access_level_required, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_ACTIVE: self.output_bool(self.active), - self.FLAG_CAN_VIEW: self.output_bool(self.can_view), - self.FLAG_CAN_EDIT: self.output_bool(self.can_edit), - self.FLAG_CAN_ADMIN: self.output_bool(self.can_admin) - } - """ - @staticmethod - def output_bool(value): - return av.input_bool(value, 'Product_Category bool attribute', 'Product_Category.output_bool') - def to_json_option(self): - return { - 'value': self.id_category, - 'text': self.name - } - def get_csv_ids_permutation(self): - list_ids = [] - for product in self.products: - list_ids += product.get_csv_ids_permutation() - return list_ids -""" -class Filters_Product_Category(BaseModel, Store_Base): - ids_product_category: str - ids_product: str - "" - def __new__(cls, product_ids, product_categories): - _m = 'Parameters_Product.__new__' - v_arg_type = 'class attribute' - # av.val_list_instances(product_ids, 'product_ids', _m, str, v_arg_type=v_arg_type) - # av.val_list_instances(product_categories, 'product_categories', _m, Product_Category_Enum, v_arg_type=v_arg_type) - av.val_str(product_ids, 'product_ids', _m, v_arg_type=v_arg_type) - av.val_str(product_categories, 'product_categories', _m, v_arg_type=v_arg_type) - return super(Parameters_Product_Category, cls).__new__(cls) - "" - def __init__(self, ids_product, ids_product_category): - super().__init__(ids_product=ids_product, ids_product_category=ids_product_category) - "" - # Constructor - self.ids = product_ids - self.categories = product_categories - "" - @classmethod - def get_default(cls): - return Filters_Product_Category( - ids_product_category = '', - ids_product = '' - ) - def to_json(self): - return { - **self.get_shared_json_attributes(self), - 'a_ids_product_category': self.ids_product_category, - 'a_ids_product': self.ids_product - } - @classmethod - def from_json(cls, json): - filters = cls() - filters.ids_product_category = json['a_ids_product_category'], - filters.ids_product = json['a_ids_product'] - - -class Filters_Product_Category(Get_Many_Parameters_Base): - FLAG_IS_NOT_EMPTY: ClassVar[str] = 'is_not_empty' - is_not_empty: bool - active: bool - def __init__(self, is_not_empty, active): - super().__init__(is_not_empty=is_not_empty, active=active) - @classmethod - def get_default(cls): - return cls( - is_not_empty = False, - active = True - ) - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.FLAG_IS_NOT_EMPTY: self.is_not_empty, - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') - } - @classmethod - def from_json(cls, json): - return cls( - is_not_empty = json['is_not_empty'], - active = json['active'] - ) - @classmethod - def from_form(cls, form): - return cls( - is_not_empty = av.input_bool(form.is_not_empty.data, 'is_not_empty', 'Filters_Product_Category.from_form'), - active = av.input_bool(form.active.data, 'active', 'Filters_Product_Category.from_form') - ) -""" - -class Product_Category_Container(Store_Base): - NAME_ATTR_OPTION_TEXT: ClassVar[str] = '' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.FLAG_ROWS - categories: list - def __init__(self): - self.categories = [] - def add_product_category(self, category): - av.val_instance(category, 'category', 'Container_Product_Categories.add_product_category', Product_Category) - self.categories.append(category) - def get_index_category_from_id(self, id_category): - for index_category in range(len(self.categories)): - category = self.categories[index_category] - if category.id_category == id_category: - return index_category - raise ValueError(f"{av.error_msg_str(id_category, 'id_category', 'Container_Product_Categories.get_index_category_from_id', int)}\nID not in list") - def get_index_category_from_id_permutation(self, id_permutation): - for index_category in range(len(self.categories)): - category = self.categories[index_category] - try: - index_product = category.get_index_product_from_id_permutation(id_permutation) - return index_category - except: - pass - raise ValueError(f"{av.error_msg_str(id_permutation, 'id_permutation', 'Container_Product_Categories.get_index_category_from_id_permutation', int)}. Permutation ID not in list") - def add_product(self, product): - av.val_instance(product, 'product', 'Container_Product_Categories.add_product', Product) - index_category = self.get_index_category_from_id(product.id_category) - self.categories[index_category].add_product(product) - def add_product_permutation(self, permutation): - av.val_instance(permutation, 'permutation', 'Container_Product_Categories.add_product_permutation', Product_Permutation) - index_category = self.get_index_category_from_id(permutation.id_category) - self.categories[index_category].add_product_permutation(permutation) - """ - def add_product_variation(self, variation): - av.val_instance(variation, 'variation', 'Container_Product_Categories.add_product_variation', Product_Variation) - index_category = self.get_index_category_from_id(variation.id_category) - self.categories[index_category].add_product_variation(variation) - """ - def add_product_variation_type(self, variation_type): - av.val_instance(variation_type, 'variation_type', 'Container_Product_Categories.add_product_variation_type', Product_Variation_Type) - variation = variation_type.variations[0] - index_category = self.get_index_category_from_id(variation.id_category) - self.categories[index_category].add_product_variation_type(variation_type) - def add_product_price(self, price): - av.val_instance(price, 'price', 'Container_Product_Categories.add_product_price', Product_Price) - index_category = self.get_index_category_from_id(price.id_category) - self.categories[index_category].add_product_price(price) - def add_product_image(self, image): - av.val_instance(image, 'image', 'Container_Product_Categories.add_product_image', Image) - index_category = self.get_index_category_from_id(image.id_category) - self.categories[index_category].add_product_image(image) - def add_delivery_option(self, delivery_option): - av.val_instance(delivery_option, 'delivery_option', 'Container_Product_Categories.add_delivery_option', Delivery_Option) - index_category = self.get_index_category_from_id(delivery_option.id_category) - self.categories[index_category].add_delivery_option(delivery_option) - def add_product_price_discount(self, discount): - av.val_instance(discount, 'discount', 'Container_Product_Categories.add_product_price_discount', Discount) - index_category = self.get_index_category_from_id(discount.id_category) - self.categories[index_category].add_product_price_discount(discount) - def add_stock_item(self, stock_item): - av.val_instance(stock_item, 'stock_item', 'Container_Product_Categories.add_stock_item', Stock_Item) - index_category = self.get_index_category_from_id(stock_item.id_category) - self.categories[index_category].add_stock_item(stock_item) - def get_all_product_variation_trees(self): - for category in self.categories: - category.get_all_product_variation_trees() - def __repr__(self): - return f'categories: {self.categories}' - """ - def get_permutation_first(self): - Helper_App.console_log(f'getting first permutation from category list') - if not (len(self.categories) == 0): - Helper_App.console_log(f'getting first permutation from category') - return None if len(self.categories) == 0 else self.categories[0].get_permutation_first() - """ - def get_category_count(self): - return len(self.categories) - def to_permutation_row_list(self): - list_rows = [] - for category in self.categories: - list_rows += category.to_permutation_row_list() - return list_rows - def to_category_option_list(self): - list_categories = [] - for category in self.categories: - list_categories.append({'value': category.id_category, 'text': category.name}) - return list_categories - def get_list_products(self): - list_products = [] - for category in self.categories: - # list_products.append(category.to_product_option_list()) - """ - for product in category.products: - list_products.append({'value': product.id_product, 'text': product.name, Product.ATTR_ID_PRODUCT_CATEGORY: product.id_category}) - """ - list_products += category.products - return list_products - def to_product_option_list(self): - list_products = self.get_list_products() - return [{'value': product.id_product, 'text': product.name, Product.ATTR_ID_PRODUCT_CATEGORY: product.id_category} for product in list_products] - def get_product_option_lists_by_category(self): - dict_lists_products = {} - for category in self.categories: - dict_lists_products[category.id_category] = category.to_product_option_list() - return dict_lists_products - def to_json(self): - return { - **self.get_shared_json_attributes(self), - f'{self.FLAG_ROWS}': [category.to_json() for category in self.categories] - } - """ - def to_json_str(self): - return { - f'{self.FLAG_ROWS}': [category.to_json_str() for category in self.categories] - } - """ - @classmethod - def from_json(cls, json): - return None - def to_json_option(self): - return None - def to_temporary_record(self): - excluded_attributes = { - column.name: getattr(self, column.name) - for column in self.__table__.columns - if column.name not in ['created_on', 'created_by'] - } - return self.to_object_with_missing_attributes(excluded_attributes) - def get_csv_ids_permutation(self): - list_ids = [] - for category in self.categories: - list_ids += category.get_csv_ids_permutation() - return ','.join(list_ids) - - -""" -class Table_Shop_Product_Category(db.Model): - __tablename__ = 'Shop_Product_Category' - id_category: int = db.Column(db.Integer, primary_key=True) - code: str = db.Column(db.String(50)) - name: str = db.Column(db.String(255)) - description: str = db.Column(db.String(4000)) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - created_on: datetime = db.Column(db.DateTime) - created_by: int = db.Column(db.Integer) - id_change_set: int = db.Column(db.Integer) -""" -class Product_Category_Temp(db.Model, Store_Base): - __tablename__ = 'Shop_Product_Category_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_category: int = db.Column(db.Integer) - code: str = db.Column(db.String(50)) - name: str = db.Column(db.String(255)) - description: str = db.Column(db.String(4000)) - id_access_level_required: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - guid: str = db.Column(db.String(36)) - # created_on: datetime = db.Column(db.DateTime) - # created_by: int = db.Column(db.Integer) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_product_category(cls, product_category): - row = cls() - row.id_category = product_category.id_category[0] if isinstance(product_category.id_category, tuple) else product_category.id_category - row.code = product_category.code[0] if isinstance(product_category.code, tuple) else product_category.code - row.name = product_category.name[0] if isinstance(product_category.name, tuple) else product_category.name - row.description = product_category.description[0] if isinstance(product_category.description, tuple) else product_category.description - row.id_access_level_required = product_category.id_access_level_required[0] if isinstance(product_category.id_access_level_required, tuple) else product_category.id_access_level_required - row.active = product_category.active - row.display_order = product_category.display_order - """ - row.guid = product_category.guid - row.created_on = product_category.created_on - row.created_by = product_category.created_by - """ - return row - def to_json(self): - return { - 'id_category': self.id_category, - 'code': self.code, - 'name': self.name, - 'description': self.description, - 'id_access_level_required': self.id_access_level_required, - 'active': av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - 'display_order': self.display_order, - 'guid': self.guid, - } - """ - 'created_on': self.created_on, - 'created_by': self.created_by - """ - - def __repr__(self): - return str(self.__dict__) \ No newline at end of file diff --git a/business_objects/store/product_permutation.py b/business_objects/store/product_permutation.py deleted file mode 100644 index 2aa0de6a..00000000 --- a/business_objects/store/product_permutation.py +++ /dev/null @@ -1,617 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Permutation Business Object - -Description: -Business object for product permutation -""" - -# internal -import lib.argument_validation as av -from lib import data_types -from forms.forms import Form_Basket_Add, Form_Basket_Edit -from business_objects.currency import Currency -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.discount import Discount -from business_objects.store.image import Image -from business_objects.store.product_price import Product_Price -from business_objects.store.stock_item import Stock_Item -from business_objects.store.store_base import Store_Base -from business_objects.store.product_variation import Product_Variation -from business_objects.store.product_variation_tree import Product_Variation_Tree -from business_objects.unit_measurement import Unit_Measurement -from extensions import db -from helpers.helper_app import Helper_App -# external -from datetime import datetime, timedelta -import locale -from dataclasses import dataclass -from typing import ClassVar - -class Product_Permutation(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE = Store_Base.ATTR_ID_PRODUCT_PERMUTATION - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - FLAG_CURRENCY_COST = f'{Currency.ATTR_ID_CURRENCY}_cost' - FLAG_CODE_CURRENCY_COST = f'{Currency.FLAG_CODE}_cost' - FLAG_SYMBOL_CURRENCY_COST = f'{Currency.FLAG_SYMBOL}_cost' - FLAG_PROFIT_LOCAL_MIN = 'profit_local_min' - FLAG_HAS_VARIATIONS = 'has_variations' - FLAG_LATENCY_MANUFACTURE = 'latency_manufacture' - FLAG_UNIT_MEASUREMENT_QUANTITY = f'{Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT}_quantity' - FLAG_SYMBOL_UNIT_MEASUREMENT_QUANTITY = f'{Unit_Measurement.FLAG_SYMBOL}_quantity' - FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_QUANTITY = f'{Unit_Measurement.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}_quantity' - FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY = f'{Unit_Measurement.FLAG_NAME_SINGULAR}_quantity' - FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY = f'{Unit_Measurement.FLAG_NAME_PLURAL}_quantity' - FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP = 'count_unit_measurement_per_quantity_step' - FLAG_QUANTITY_STOCK = 'quantity_stock' - FLAG_IS_SUBSCRIPTION = 'is_subscription' - FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = f'{Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT}_interval_recurrence' - FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = f'{Unit_Measurement.FLAG_SYMBOL}_unit_measurement_interval_recurrence' - FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = f'{Unit_Measurement.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}_unit_measurement_interval_recurrence' - FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = f'{Unit_Measurement.FLAG_NAME_SINGULAR}_unit_measurement_interval_recurrence' - FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = f'{Unit_Measurement.FLAG_NAME_PLURAL}_unit_measurement_interval_recurrence' - FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE = 'count_interval_recurrence' - FLAG_ID_STRIPE_PRODUCT = 'id_stripe_product' - FLAG_DOES_EXPIRE_FASTER_ONCE_UNSEALED = 'does_expire_faster_once_unsealed' - FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED = f'{Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT}_interval_expiration_unsealed' - FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED = f'{Unit_Measurement.FLAG_SYMBOL}_interval_expiration_unsealed' - FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_INTERVAL_EXPIRATION_UNSEALED = f'{Unit_Measurement.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}_interval_expiration_unsealed' - FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED = f'{Unit_Measurement.FLAG_NAME_SINGULAR}_interval_expiration_unsealed' - FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED = f'{Unit_Measurement.FLAG_NAME_PLURAL}_interval_expiration_unsealed' - FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED = 'count_interval_expiration_unsealed' - - id_permutation = db.Column(db.Integer, primary_key=True) - id_product = db.Column(db.Integer) - id_category = db.Column(db.Integer) - csv_id_pairs_variation = db.Column(db.String(4000)) - # name = db.Column(db.String(255)) - description = db.Column(db.String(4000)) - # price_GBP_full = db.Column(db.Float) - # price_GBP_min = db.Column(db.Float) - """ - id_currency_cost = db.Column(db.Integer) - code_currency_cost = db.Column(db.String(3)) - symbol_currency_cost = db.Column(db.String(3)) - """ - # currency_cost: Currency - cost_local_VAT_excl = db.Column(db.Float) - cost_local_VAT_incl = db.Column(db.Float) - profit_local_min = db.Column(db.Float) - has_variations = db.Column(db.Boolean) - latency_manufacture = db.Column(db.Integer) - id_unit_measurement_quantity = db.Column(db.Integer) - symbol_unit_measurement_quantity = db.Column(db.String(50)) - symbol_is_suffix_not_prefix_unit_measurement_quantity = db.Column(db.Boolean) - name_singular_unit_measurement_quantity = db.Column(db.String(255)) - name_plural_unit_measurement_quantity = db.Column(db.String(256)) - count_unit_measurement_per_quantity_step = db.Column(db.Integer) - quantity_min = db.Column(db.Float) - quantity_max = db.Column(db.Float) - quantity_stock = db.Column(db.Float) - is_subscription = db.Column(db.Boolean) - id_unit_measurement_interval_recurrence = db.Column(db.Integer) - symbol_unit_measurement_interval_recurrence = db.Column(db.String(50)) - symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence = db.Column(db.Boolean) - name_singular_unit_measurement_interval_recurrence = db.Column(db.String(255)) - name_plural_unit_measurement_interval_recurrence = db.Column(db.String(256)) - count_interval_recurrence = db.Column(db.Integer) - id_stripe_product = db.Column(db.String(100)) - does_expire_faster_once_unsealed = db.Column(db.Boolean) - id_unit_measurement_interval_expiration_unsealed = db.Column(db.Integer) - symbol_unit_measurement_interval_expiration_unsealed = db.Column(db.String(50)) - symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed = db.Column(db.Boolean) - name_singular_unit_measurement_interval_expiration_unsealed = db.Column(db.String(255)) - name_plural_unit_measurement_interval_expiration_unsealed = db.Column(db.String(256)) - count_interval_expiration_unsealed = db.Column(db.Integer) - has_variations = db.Column(db.Boolean) - active = db.Column(db.Boolean) - # display_order = db.Column(db.Integer) - can_view = db.Column(db.Boolean) - can_edit = db.Column(db.Boolean) - can_admin = db.Column(db.Boolean) - # form_basket_add: Form_Basket_Add - # form_basket_edit: Form_Basket_Edit - # is_unavailable_in_currency_or_region: bool - # is_available: bool - # variation_tree - - def __init__(self): - self.prices = [] - self.price_index = {} - self.images = [] - self.image_index = {} - self.delivery_options = [] - self.delivery_option_index = {} - self.discounts = [] - self.discount_index = {} - self.stock_items = [] - self.stock_item_index = {} - super().__init__() - Store_Base.__init__(self) - self.currency_cost = None - self.form_basket_add = Form_Basket_Add() - self.form_basket_edit = Form_Basket_Edit() - self.is_unavailable_in_currency_or_region = False - # self.is_available = False - self.variation_tree = None - # self.variations = [] - @classmethod - def from_DB_get_many_product_catalogue(cls, query_row): - _m = f'{cls.__name__}.from_DB_get_many_product_catalogue' - v_arg_type = 'class attribute' - Helper_App.console_log(f'query_row: {query_row}') - permutation = cls() - permutation.id_permutation = query_row[0] - permutation.id_product = query_row[1] - permutation.id_category = query_row[2] - permutation.description = query_row[3] - permutation.cost_local_VAT_excl = query_row[4] - permutation.cost_local_VAT_incl = query_row[5] - permutation.currency_cost = Currency.from_DB_get_many_product_catalogue_product_permutation(query_row) - permutation.profit_local_min = query_row[9] - permutation.latency_manufacture = query_row[10] - permutation.id_unit_measurement_quantity = query_row[11] - permutation.symbol_unit_measurement_quantity = query_row[12] - permutation.symbol_is_suffix_not_prefix_unit_measurement_quantity = av.input_bool(query_row[13], cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_QUANTITY, _m, v_arg_type=v_arg_type) - permutation.name_singular_unit_measurement_quantity = query_row[14] - permutation.name_plural_unit_measurement_quantity = query_row[15] - permutation.count_unit_measurement_per_quantity_step = query_row[16] - permutation.quantity_min = query_row[17] - permutation.quantity_max = query_row[18] - permutation.quantity_stock = query_row[19] - permutation.is_subscription = av.input_bool(query_row[20], "is_subscription", _m, v_arg_type=v_arg_type) - permutation.id_unit_measurement_interval_recurrence = query_row[21] - permutation.symbol_unit_measurement_interval_recurrence = query_row[22] - permutation.symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence = av.input_bool(query_row[23], cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE, _m, v_arg_type=v_arg_type) - permutation.name_singular_unit_measurement_interval_recurrence = query_row[24] - permutation.name_plural_unit_measurement_interval_recurrence = query_row[25] - permutation.count_interval_recurrence = query_row[26] - permutation.id_stripe_product = query_row[27] - permutation.does_expire_faster_once_unsealed = av.input_bool(query_row[28], "does_expire_faster_once_unsealed", _m, v_arg_type=v_arg_type) - permutation.id_unit_measurement_interval_expiration_unsealed = query_row[29] - permutation.symbol_unit_measurement_interval_expiration_unsealed = query_row[30] - permutation.symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed = av.input_bool(query_row[31], cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_INTERVAL_EXPIRATION_UNSEALED, _m, v_arg_type=v_arg_type) - permutation.name_singular_unit_measurement_interval_expiration_unsealed = query_row[32] - permutation.name_plural_unit_measurement_interval_expiration_unsealed = query_row[33] - permutation.count_interval_expiration_unsealed = query_row[34] - permutation.has_variations = av.input_bool(query_row[35], cls.FLAG_HAS_VARIATIONS, _m, v_arg_type=v_arg_type) - permutation.active = av.input_bool(query_row[36], cls.FLAG_ACTIVE, _m, v_arg_type=v_arg_type) - # permutation.display_order = query_row[27] - permutation.can_view = av.input_bool(query_row[37], "can_view", _m, v_arg_type=v_arg_type) - permutation.can_edit = av.input_bool(query_row[38], "can_edit", _m, v_arg_type=v_arg_type) - permutation.can_admin = av.input_bool(query_row[39], "can_admin", _m, v_arg_type=v_arg_type) - return permutation - - def from_DB_Stripe_product(query_row): - _m = 'Product_Permutation.from_DB_Stripe_product' - v_arg_type = 'class attribute' - permutation = Product_Permutation() - permutation.id_product = query_row[0] - # permutation.name = query_row[1] - permutation.description = query_row[2] - return permutation - - def from_DB_Stripe_price(query_row): - _m = 'Product_Permutation.from_DB_Stripe_price' - v_arg_type = 'class attribute' - permutation = Product_Permutation() - permutation.id_product = query_row[0] - # permutation.price_GBP_full = query_row[1] - permutation.id_stripe_product = query_row[2] - permutation.is_subscription = av.input_bool(query_row[3], "is_subscription", _m, v_arg_type=v_arg_type) - permutation.name_singular_unit_measurement_interval_recurrence = query_row[4] - permutation.count_interval_recurrence = query_row[5] - return permutation - """ - def from_json(json_basket_item, key_id_product, key_id_permutation): - _m = 'Product_Permutation.from_json' - v_arg_type = 'class attribute' - permutation = Product_Permutation() - permutation.id_product = json_basket_item[key_id_product] - permutation.id_permutation = json_basket_item[key_id_permutation] - return permutation - """ - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - permutation = cls() - permutation.id_permutation = json[cls.ATTR_ID_PRODUCT_PERMUTATION] - permutation.id_product = json[cls.ATTR_ID_PRODUCT] - permutation.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - permutation.description = json[cls.FLAG_DESCRIPTION] - permutation.cost_local_VAT_excl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL, None) - permutation.cost_local_VAT_incl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_INCL, None) - permutation.currency_cost = Currency.from_json(json, '_cost') - permutation.profit_local_min = json[cls.FLAG_PROFIT_LOCAL_MIN] - permutation.latency_manufacture = json[cls.FLAG_LATENCY_MANUFACTURE] - permutation.id_unit_measurement_quantity = json[cls.FLAG_UNIT_MEASUREMENT_QUANTITY] - permutation.symbol_unit_measurement_quantity = json.get(cls.FLAG_SYMBOL_UNIT_MEASUREMENT_QUANTITY) - permutation.symbol_is_suffix_not_prefix_unit_measurement_quantity = json.get(cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_QUANTITY) - permutation.name_singular_unit_measurement_quantity = json.get(cls.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY) - permutation.name_plural_unit_measurement_quantity = json.get(cls.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY) - permutation.count_unit_measurement_per_quantity_step = json[cls.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP] - permutation.quantity_min = json[cls.FLAG_QUANTITY_MIN] - permutation.quantity_max = json[cls.FLAG_QUANTITY_MAX] - permutation.quantity_stock = json[cls.FLAG_QUANTITY_STOCK] - permutation.is_subscription = 1 if av.input_bool(json[cls.FLAG_IS_SUBSCRIPTION], cls.FLAG_IS_SUBSCRIPTION, _m) else 0 - permutation.id_unit_measurement_interval_recurrence = json[cls.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE] if json[cls.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE] != '' else None - permutation.symbol_unit_measurement_interval_recurrence = json.get(cls.FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE) - permutation.symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence = json.get(cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE) - permutation.name_singular_unit_measurement_interval_recurrence = json.get(cls.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE) - permutation.name_plural_unit_measurement_interval_recurrence = json.get(cls.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE) - permutation.count_interval_recurrence = json[cls.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE] if json[cls.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE] != '' else None - permutation.id_stripe_product = json[cls.FLAG_ID_STRIPE_PRODUCT] - permutation.does_expire_faster_once_unsealed = 1 if av.input_bool(json[cls.FLAG_DOES_EXPIRE_FASTER_ONCE_UNSEALED], cls.FLAG_DOES_EXPIRE_FASTER_ONCE_UNSEALED, _m) else 0 - permutation.id_unit_measurement_interval_expiration_unsealed = json[cls.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED] if json[cls.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED] != '' else None - permutation.symbol_unit_measurement_interval_expiration_unsealed = json.get(cls.FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED) - permutation.symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed = json.get(cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_INTERVAL_EXPIRATION_UNSEALED) - permutation.name_singular_unit_measurement_interval_expiration_unsealed = json.get(cls.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED) - permutation.name_plural_unit_measurement_interval_expiration_unsealed = json.get(cls.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED) - permutation.count_interval_expiration_unsealed = json[cls.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED] if json[cls.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED] != '' else None - permutation.has_variations = json[cls.FLAG_HAS_VARIATIONS] - permutation.active = 1 if av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m) else 0 - if permutation.has_variations: - permutation.csv_id_pairs_variation = json[cls.FLAG_PRODUCT_VARIATIONS] - permutation.variation_tree = Product_Variation_Tree.from_json_str(permutation.csv_id_pairs_variation) - """ - for jsonProductVariation in json[cls.FLAG_PRODUCT_VARIATIONS]: - variation = Product_Variation.from_json(jsonProductVariation) - permutation.add_product_variation(variation) - """ - return permutation - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.FLAG_DESCRIPTION: self.description, - self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_local_VAT_excl, - self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_local_VAT_incl, - self.FLAG_CURRENCY_COST: self.currency_cost.to_json(), - self.FLAG_PROFIT_LOCAL_MIN: self.profit_local_min, - self.FLAG_LATENCY_MANUFACTURE: self.latency_manufacture, - self.FLAG_UNIT_MEASUREMENT_QUANTITY: self.id_unit_measurement_quantity, - self.FLAG_SYMBOL_UNIT_MEASUREMENT_QUANTITY: self.symbol_unit_measurement_quantity, - self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_QUANTITY: self.symbol_is_suffix_not_prefix_unit_measurement_quantity, - self.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY: self.name_singular_unit_measurement_quantity, - self.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY: self.name_plural_unit_measurement_quantity, - self.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP: self.count_unit_measurement_per_quantity_step, - self.FLAG_QUANTITY_MIN: self.quantity_min, - self.FLAG_QUANTITY_MAX: self.quantity_max, - self.FLAG_QUANTITY_STOCK: self.quantity_stock, - self.FLAG_IS_SUBSCRIPTION: self.is_subscription, - self.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.id_unit_measurement_interval_recurrence, - self.FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.symbol_unit_measurement_interval_recurrence, - self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence, - self.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.name_singular_unit_measurement_interval_recurrence, - self.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.name_plural_unit_measurement_interval_recurrence, - self.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: self.count_interval_recurrence, - self.FLAG_ID_STRIPE_PRODUCT: self.id_stripe_product, - self.FLAG_DOES_EXPIRE_FASTER_ONCE_UNSEALED: self.does_expire_faster_once_unsealed, - self.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: self.id_unit_measurement_interval_expiration_unsealed, - self.FLAG_SYMBOL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: self.symbol_unit_measurement_interval_expiration_unsealed, - self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_INTERVAL_EXPIRATION_UNSEALED: self.symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed, - self.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: self.name_singular_unit_measurement_interval_expiration_unsealed, - self.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: self.name_plural_unit_measurement_interval_expiration_unsealed, - self.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: self.count_interval_expiration_unsealed, - self.FLAG_HAS_VARIATIONS: self.has_variations, - self.FLAG_ACTIVE: self.active, - self.FLAG_CAN_VIEW: self.can_view, - self.FLAG_CAN_EDIT: self.can_edit, - self.FLAG_CAN_ADMIN: self.can_admin, - self.FLAG_PRODUCT_VARIATIONS: [] if self.variation_tree is None else [variation_type.to_json() for variation_type in self.variation_tree.get_product_variation_types()], - self.FLAG_PRODUCT_IMAGE: [image.to_json() for image in self.images], - self.FLAG_DELIVERY_OPTION: [option.to_json() for option in self.delivery_options], - self.FLAG_PRODUCT_PRICE: [price.to_json() for price in self.prices], - } - def to_json_option(self): - return { - 'value': self.id_permutation, - 'text': self.get_name_variations() - } - - def get_name(self): - return - def get_name_variations(self): - return self.variation_tree.get_name_variations() - def is_available(self): - return len(self.prices) > 0 - def get_price(self): - return self.prices[0] - - def output_delivery_date(self): - return (datetime.now() + timedelta(days=self.latency_manufacture)).strftime('%A, %d %B %Y') - - """ - def output_lead_time(self): - return '1 day' if self.latency_manufacture == 1 else f'{self.latency_manufacture} days' - - def output_price(self, is_included_VAT): - if self.is_unavailable_in_currency_or_region: - return 'Not available in currency and region' - if not self.is_available: - return 'Not available' - price = self.get_price() - locale.setlocale(locale.LC_ALL, '') - if is_included_VAT: - return f'{price.symbol_currency} {locale.format_string("%d", price.value_local_VAT_incl, grouping=True)}' - else: - return f'{price.symbol_currency} {locale.format_string("%d", price.value_local_VAT_excl, grouping=True)}' - def output_variations(self): - if not self.has_variations: return '' - return '\n'.join([f'{variation.name_variation_type}: {variation.name_variation}' for variation in self.variations]) - def output_variations_jsonify(self): - if not self.has_variations: return '' - return ','.join([f'{variation.id_type}: {variation.id_variation}' for variation in self.variations]) - """ - - def __repr__(self): - return f'''Product_Permutation - id_permutation: {self.id_permutation} - id_product: {self.id_product} - id_category: {self.id_category} - description: {self.description} - cost_local_VAT_excl: {self.cost_local_VAT_excl} - cost_local_VAT_incl: {self.cost_local_VAT_incl} - currency_cost: {self.currency_cost} - latency_manufacture: {self.latency_manufacture} - id_unit_measurement_quantity: {self.id_unit_measurement_quantity} - symbol_unit_measurement_quantity: {self.symbol_unit_measurement_quantity} - symbol_is_suffix_not_prefix_unit_measurement_quantity: {self.symbol_is_suffix_not_prefix_unit_measurement_quantity} - name_singular_unit_measurement_quantity: {self.name_singular_unit_measurement_quantity} - name_plural_unit_measurement_quantity: {self.name_plural_unit_measurement_quantity} - count_unit_measurement_per_quantity_step: {self.count_unit_measurement_per_quantity_step} - quantity_min: {self.quantity_min} - quantity_max: {self.quantity_max} - quantity_stock: {self.quantity_stock} - is_subscription: {self.is_subscription} - id_unit_measurement_interval_recurrence: {self.id_unit_measurement_interval_recurrence} - symbol_unit_measurement_interval_recurrence: {self.symbol_unit_measurement_interval_recurrence} - symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence: {self.symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence} - name_singular_unit_measurement_interval_recurrence: {self.name_singular_unit_measurement_interval_recurrence} - name_plural_unit_measurement_interval_recurrence: {self.name_plural_unit_measurement_interval_recurrence} - count_interval_recurrence: {self.count_interval_recurrence} - id_stripe_product: {self.id_stripe_product} - does_expire_faster_once_unsealed: {self.does_expire_faster_once_unsealed} - id_unit_measurement_interval_expiration_unsealed: {self.id_unit_measurement_interval_expiration_unsealed} - symbol_unit_measurement_interval_expiration_unsealed: {self.symbol_unit_measurement_interval_expiration_unsealed} - symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed: {self.symbol_is_suffix_not_prefix_unit_interval_expiration_unsealed} - name_singular_unit_measurement_interval_expiration_unsealed: {self.name_singular_unit_measurement_interval_expiration_unsealed} - name_plural_unit_measurement_interval_expiration_unsealed: {self.name_plural_unit_measurement_interval_expiration_unsealed} - count_interval_expiration_unsealed: {self.count_interval_expiration_unsealed} - has_variations: {self.has_variations} - csv_id_pairs_variation: {self.csv_id_pairs_variation} - can_view: {self.can_view} - can_edit: {self.can_edit} - can_admin: {self.can_admin} - variation tree: {self.variation_tree} - images: {self.images} - delivery_options: {self.delivery_options} - prices: {self.prices} - ''' - """ - price_GBP_full: {self.price_GBP_full} - price_GBP_min: {self.price_GBP_min} - """ - """ - def add_product_variation(self, variation): - _m = 'Product_Permutation.add_product_variation' - "" - av.val_instance(variation, 'variation', _m, Product_Variation) - try: - self.variation_index[variation.id_variation] - raise ValueError(f"{av.error_msg_str(variation, 'variation', _m, Product_Variation)}\nProduct_Variation already in product.") - except KeyError: - self.variation_index[variation.id_variation] = len(self.variations) - self.variations.append(variation) - "" - if self.variation_tree is None: - self.variation_tree = Product_Variation_Tree.from_product_variation(variation) - else: - self.variation_tree.add_product_variation(variation) - """ - def add_product_variation_type(self, variation_type): - _m = 'Product_Permutation.add_product_variation_type' - if self.variation_tree is None: - self.variation_tree = Product_Variation_Tree.from_product_variation_type(variation_type) - else: - self.variation_tree.add_product_variation_type(variation_type) - def add_product_price(self, price): - _m = 'Product_Permutation.add_product_price' - av.val_instance(price, 'price', _m, Product_Price) - try: - self.price_index[price.display_order] - raise ValueError(f"{av.error_msg_str(price, 'price', _m, Product_Price)}\nPrice already in product.") - except KeyError: - self.price_index[price.display_order] = len(self.prices) - self.prices.append(price) - def add_product_image(self, image): - _m = 'Product_Permutation.add_product_image' - av.val_instance(image, 'image', _m, Image) - try: - self.image_index[image.id_image] - raise ValueError(f"{av.error_msg_str(image, 'image', _m, Image)}\nImage already in product.") - except KeyError: - self.image_index[image.id_image] = len(self.images) - self.images.append(image) - def add_delivery_option(self, delivery_option): - _m = 'Product_Permutation.add_delivery_option' - av.val_instance(delivery_option, 'delivery_option', _m, Delivery_Option) - try: - self.delivery_option_index[delivery_option.id_option] - raise ValueError(f"{av.error_msg_str(delivery_option, 'delivery_option', _m, Delivery_Option)}\nDelivery_Option already in product.") - except KeyError: - self.delivery_option_index[delivery_option.id_option] = len(self.delivery_options) - self.delivery_options.append(delivery_option) - def add_product_price_discount(self, discount): - _m = 'Product_Permutation.add_product_price_discount' - av.val_instance(discount, 'discount', _m, Discount) - try: - self.discount_index[discount.display_order] - raise ValueError(f"{av.error_msg_str(discount, 'discount', _m, Discount)}\nDiscount already in product.") - except KeyError: - self.discount_index[discount.display_order] = len(self.discounts) - self.discounts.append(discount) - - def add_stock_item(self, stock_item): - av.val_instance(stock_item, 'stock_item', 'Product_Permutation.add_stock_item', Stock_Item) - self.stock_items.append(stock_item) - - def get_image_from_index(self, index_image): - try: - return self.images[index_image] - except: - raise IndexError(f"Invalid image index: {index_image}") - - def get_price_from_code_currency(self, code_currency): - for price in self.prices: - if price.code_currency == code_currency: - return price - - def to_row_permutation(self): - a = { - Product_Permutation.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - Product_Permutation.ATTR_ID_PRODUCT: self.id_product, - Product_Permutation.ATTR_ID_PRODUCT_VARIATION: self.output_variations(), - Product_Permutation.FLAG_QUANTITY_STOCK: self.quantity_stock, - Product_Permutation.FLAG_QUANTITY_MIN: self.quantity_min, - Product_Permutation.FLAG_QUANTITY_MAX: self.quantity_max, - Product_Permutation.FLAG_COST_UNIT_LOCAL_VAT_EXCL: f"{self.symbol_currency_cost}{self.cost_local_VAT_excl}" - } - Helper_App.console_log('permutation row: ', a) - return a - - -""" -class Permutation_Product_Variation_Link(db.Model): - id_permutation = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_category = db.Column(db.Integer) - id_variation = db.Column(db.Integer) - - def from_DB_get_many_product_catalogue(query_row): - _m = 'Permutation_Product_Variation_Link.from_DB_get_many_product_catalogue' - v_arg_type = 'class attribute' - link = Permutation_Product_Variation_Link() - link.id_permutation = query_row[0] - link.id_product = query_row[1] - link.id_category = query_row[2] - link.id_variation = query_row[3] - return link -""" - -class Product_Permutation_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Product_Permutation_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_permutation: int = db.Column(db.Integer) - id_product: int = db.Column(db.Integer) - csv_id_pairs_variation: str = db.Column(db.String(4000)) - description: str = db.Column(db.String(4000)) - cost_local_VAT_excl: float = db.Column(db.Float) - cost_local_VAT_incl: float = db.Column(db.Float) - id_currency_cost: int = db.Column(db.Integer) - profit_local_min: float = db.Column(db.Float) - latency_manufacture: int = db.Column(db.Integer) - id_unit_measurement_quantity: int = db.Column(db.Integer) - count_unit_measurement_per_quantity_step: int = db.Column(db.Float) - quantity_min: int = db.Column(db.Integer) - quantity_max: int = db.Column(db.Integer) - quantity_stock: int = db.Column(db.Integer) - is_subscription: bool = db.Column(db.Boolean) - id_unit_measurement_interval_recurrence: int = db.Column(db.Integer) - count_interval_recurrence: int = db.Column(db.Float) - id_stripe_product: str = db.Column(db.String(50)) - does_expire_faster_once_unsealed: bool = db.Column(db.Boolean) - id_unit_measurement_interval_expiration_unsealed: int = db.Column(db.Integer) - count_interval_expiration_unsealed: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_product_permutation(cls, product_permutation): - Helper_App.console_log(f'Product_Permutation_Temp.from_product_permutation: {product_permutation}\ntype(cost local): {str(type(product_permutation.cost_local_VAT_excl))}') - row = cls() - row.id_permutation = product_permutation.id_permutation - row.id_product = product_permutation.id_product - row.csv_id_pairs_variation = product_permutation.csv_id_pairs_variation - row.description = product_permutation.description - row.cost_local_VAT_excl = product_permutation.cost_local_VAT_excl if product_permutation.cost_local_VAT_excl != 'None' else None - row.cost_local_VAT_incl = product_permutation.cost_local_VAT_incl if product_permutation.cost_local_VAT_incl != 'None' else None - row.id_currency_cost = product_permutation.currency_cost.id_currency - row.profit_local_min = product_permutation.profit_local_min if product_permutation.profit_local_min != 'None' else None - row.latency_manufacture = product_permutation.latency_manufacture - row.id_unit_measurement_quantity = product_permutation.id_unit_measurement_quantity - row.count_unit_measurement_per_quantity_step = product_permutation.count_unit_measurement_per_quantity_step - row.quantity_min = product_permutation.quantity_min - row.quantity_max = product_permutation.quantity_max - row.quantity_stock = product_permutation.quantity_stock - row.is_subscription = product_permutation.is_subscription - row.id_unit_measurement_interval_recurrence = product_permutation.id_unit_measurement_interval_recurrence - row.count_interval_recurrence = product_permutation.count_interval_recurrence - row.id_stripe_product = product_permutation.id_stripe_product - row.does_expire_faster_once_unsealed = product_permutation.does_expire_faster_once_unsealed - row.id_unit_measurement_interval_expiration_unsealed = product_permutation.id_unit_measurement_interval_expiration_unsealed - row.count_interval_expiration_unsealed = product_permutation.count_interval_expiration_unsealed - row.active = product_permutation.active - return row - def __repr__(self): - return f''' - id_permutation: {self.id_permutation} - id_product: {self.id_product} - csv_id_pairs_variation: {self.csv_id_pairs_variation} - description: {self.description} - cost_local_VAT_excl: {self.cost_local_VAT_excl} - cost_local_VAT_incl: {self.cost_local_VAT_incl} - id_currency_cost: {self.id_currency_cost} - profit_local_min: {self.profit_local_min} - latency_manufacture: {self.latency_manufacture} - id_unit_measurement_quantity: {self.id_unit_measurement_quantity} - {Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP}: {self.count_unit_measurement_per_quantity_step} - quantity_min: {self.quantity_min} - quantity_max: {self.quantity_max} - quantity_stock: {self.quantity_stock} - is_subscription: {self.is_subscription} - id_unit_measurement_interval_recurrence: {self.id_unit_measurement_interval_recurrence} - count_interval_recurrence: {self.count_interval_recurrence} - id_stripe_product: {self.id_stripe_product} - does_expire_faster_once_unsealed: {self.does_expire_faster_once_unsealed} - id_unit_measurement_interval_expiration_unsealed: {self.id_unit_measurement_interval_expiration_unsealed} - count_interval_expiration_unsealed: {self.count_interval_expiration_unsealed} - active: {self.active} - guid: {self.guid} - ''' - """ - def to_json(self): - return { - self.ATTR_ID_PRODUCT_PERMUTATION: int(self.id_permutation), - self.ATTR_ID_PRODUCT: int(self.id_product), - self.FLAG_DESCRIPTION: self.description, - Product_Permutation.FLAG_COST_LOCAL: float(self.cost_local), - Product_Permutation.FLAG_CURRENCY_COST: int(self.id_currency_cost), - Product_Permutation.FLAG_PROFIT_LOCAL_MIN: float(self.profit_local_min), - Product_Permutation.FLAG_LATENCY_MANUFACTURE: int(self.latency_manufacture), - Product_Permutation.FLAG_UNIT_MEASUREMENT_QUANTITY: int(self.id_unit_measurement_quantity), - Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP: float(self.count_unit_measurement_per_quantity_step), - self.FLAG_QUANTITY_MIN: float(self.quantity_min), - self.FLAG_QUANTITY_MAX: float(self.quantity_max), - Product_Permutation.FLAG_QUANTITY_STOCK: float(self.quantity_stock), - Product_Permutation.FLAG_IS_SUBSCRIPTION: bool(self.is_subscription), - Product_Permutation.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: int(self.id_unit_measurement_interval_recurrence) if self.id_unit_measurement_interval_recurrence != '' else None, - Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: float(self.count_interval_recurrence) if self.count_interval_recurrence != '' else None, - Product_Permutation.FLAG_ID_STRIPE_PRODUCT: self.id_stripe_product, - Product_Permutation.FLAG_DOES_EXPIRE_FASTER_ONCE_UNSEALED: bool(self.does_expire_faster_once_unsealed), - Product_Permutation.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: int(self.id_unit_measurement_interval_expiration_unsealed) if self.id_unit_measurement_interval_expiration_unsealed != '' else None, - Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: float(self.count_interval_expiration_unsealed) if self.count_interval_expiration_unsealed != '' else None, - self.FLAG_ACTIVE: bool(self.active), - self.FLAG_GUID: self.guid - } - """ - \ No newline at end of file diff --git a/business_objects/store/product_price.py b/business_objects/store/product_price.py deleted file mode 100644 index 4822836c..00000000 --- a/business_objects/store/product_price.py +++ /dev/null @@ -1,106 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Price Business Object - -Description: -Business object for product price -""" - -# internal -from business_objects.currency import Currency -from business_objects.region import Region -from business_objects.store.store_base import Store_Base -from extensions import db -# external -from dataclasses import dataclass -from typing import ClassVar - -class Product_Price(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT_PRICE - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_TEXT - - id_price = db.Column(db.Integer, primary_key=True) - id_permutation = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_category = db.Column(db.Integer) - """ - id_currency = db.Column(db.Integer) - code_currency = db.Column(db.String(50)) - name_currency = db.Column(db.String(255)) - symbol_currency = db.Column(db.String(50)) - """ - # id_region = db.Column(db.Integer) - value_local_VAT_incl = db.Column(db.Float) - value_local_VAT_excl = db.Column(db.Float) - display_order = db.Column(db.Float) - - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.currency = None - self.delivery_region = None - @classmethod - def from_DB_get_many_product_catalogue(cls, query_row): - # _m = 'Product_Price.from_DB_get_many_product_catalogue' - price = cls() - price.id_price = query_row[0] - price.id_permutation = query_row[1] - price.id_product = query_row[2] - price.id_category = query_row[3] - price.currency = Currency.from_DB_get_many_product_price_and_discount_and_delivery_region(query_row) - """ - price.id_currency = query_row[4] - price.code_currency = query_row[5] - price.name_currency = query_row[6] - price.symbol_currency = query_row[7] - """ - # price.id_region = query_row[8] - price.value_local_VAT_incl = query_row[9] - price.value_local_VAT_excl = query_row[10] - price.display_order = query_row[11] - return price - - def __repr__(self): - return f'''Product_Price - id: {self.id_price} - id_permutation: {self.id_permutation} - id_product: {self.id_product} - id_category: {self.id_category} - currency: {self.currency} - value_local (VAT incl): {self.value_local_VAT_incl} - value_local (VAT excl): {self.value_local_VAT_excl} - display_order (UID): {self.display_order} - {self.FLAG_TEXT}: {self.currency.symbol} {self.value_local_VAT_incl} - ''' - - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_PRICE: self.id_price, - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.FLAG_CURRENCY: self.currency.to_json(), - # Region.ATTR_ID_REGION_DELIVERY: self.id_region, - self.FLAG_VALUE_LOCAL_VAT_INCL: self.value_local_VAT_incl, - self.FLAG_VALUE_LOCAL_VAT_EXCL: self.value_local_VAT_excl, - self.FLAG_DISPLAY_ORDER: self.display_order - } - - @classmethod - def from_json(cls, json): - price = cls() - price.id_price = json[cls.ATTR_ID_PRODUCT_PRICE] - price.id_permutation = json[cls.ATTR_ID_PRODUCT_PERMUTATION] - price.id_product = json[cls.ATTR_ID_PRODUCT] - price.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - price.currency = Currency.from_json(json) - # price.id_region = json[Region.ATTR_ID_REGION_DELIVERY] - price.value_local_VAT_incl = json[cls.FLAG_VALUE_LOCAL_VAT_INCL] - price.value_local_VAT_excl = json[cls.FLAG_VALUE_LOCAL_VAT_EXCL] - price.display_order = json[cls.FLAG_DISPLAY_ORDER] - return price \ No newline at end of file diff --git a/business_objects/store/product_variation.py b/business_objects/store/product_variation.py deleted file mode 100644 index e5ae26a8..00000000 --- a/business_objects/store/product_variation.py +++ /dev/null @@ -1,217 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Product_Variation Business Object - -Description: -Business object for product variation -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# CLASSES -# METHODS - -# IMPORTS -# internal -import lib.argument_validation as av -from business_objects.db_base import Get_Many_Parameters_Base -from business_objects.store.store_base import Store_Base -# from business_objects.store.product_variation_type import Product_Variation_Type -from extensions import db -from helpers.helper_app import Helper_App -# external -from dataclasses import dataclass -from typing import ClassVar -from pydantic import BaseModel -from itertools import filterfalse -from operator import attrgetter - - -class Product_Variation(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT_VARIATION - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - - id_variation = db.Column(db.Integer, primary_key=True) - id_type = db.Column(db.Integer) - code = db.Column(db.String(50)) - name = db.Column(db.String(255)) - display_order = db.Column(db.Integer) - active = db.Column(db.Boolean) - - id_permutation = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_category = db.Column(db.Integer) - - def __init__(self): - super().__init__() - self.variation_type = None - - @classmethod - def from_DB_get_many_product_catalogue(cls, query_row): - variation = Product_Variation.from_DB_get_many_product_variation(query_row) - variation.id_product = query_row[11] - variation.id_permutation = query_row[12] - variation.id_category = query_row[13] - # variation.variation_type = Product_Variation_Type.from_DB_get_many_product_catalogue(query_row) - return variation - - @classmethod - def from_DB_get_many_product_variation(cls, query_row): - variation = cls() - variation.id_variation = query_row[0] - variation.id_type = query_row[1] - variation.code = query_row[2] - variation.name = query_row[3] - variation.display_order = query_row[4] - variation.active = av.input_bool(query_row[5], cls.FLAG_ACTIVE, f'{cls.__name__}.from_DB_get_many_product_variation') - return variation - - @classmethod - def from_json(cls, json): - variation = cls() - variation.id_variation = json[cls.ATTR_ID_PRODUCT_VARIATION] - variation.id_type = json[cls.ATTR_ID_PRODUCT_VARIATION_TYPE] - variation.code = json[cls.FLAG_CODE] - variation.name = json[cls.FLAG_NAME] - variation.display_order = json[cls.FLAG_DISPLAY_ORDER] - variation.active = 1 if av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, f'{cls.__name__}.from_json') else 0 - variation.id_permutation = json.get(cls.ATTR_ID_PRODUCT_PERMUTATION, None) - variation.id_product = json.get(cls.ATTR_ID_PRODUCT, None) - variation.id_category = json.get(cls.ATTR_ID_PRODUCT_CATEGORY, None) - return variation - - def __repr__(self): - return f''' - {self.__class__.__name__} - id_variation: {self.id_variation} - id_type: {self.id_type} - code: {self.code} - name: {self.name} - display_order: {self.display_order} - active: {self.active} - id_permutation: {self.id_permutation} - id_product: {self.id_product} - id_category: {self.id_category} - variation_type: {self.variation_type} - ''' - - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_VARIATION: self.id_variation, - self.ATTR_ID_PRODUCT_VARIATION_TYPE: self.id_type, - self.FLAG_CODE: self.code, - self.FLAG_NAME: self.name, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_ACTIVE: self.active, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - } - def to_json_option(self): - return { - 'value': self.id_variation, - 'text': self.name - } - -class Parameters_Product_Variation(Get_Many_Parameters_Base): - a_get_all_variation_type: bool - a_get_inactive_variation_type: bool - a_ids_variation_type: str - a_get_all_variation: bool - a_get_inactive_variation: bool - a_ids_variation: str - def __init__(self, **kwargs): - super().__init__(**kwargs) - @classmethod - def get_default(cls): - return cls( - a_get_all_variation_type = True, - a_get_inactive_variation_type = False, - a_ids_variation_type = '', - a_get_all_variation = True, - a_get_inactive_variation = False, - a_ids_variation = '' - ) - @classmethod - def from_filters_product_variation(cls, form): - parameters = cls.get_default() - get_inactive = not form.active.data - parameters.a_get_inactive_variation_type = get_inactive - parameters.a_get_inactive_variation = get_inactive - return parameters - -""" -class Product_Variation_Container(BaseModel): - variation_types: list = [] - variations: list = [] - - def add_product_variation_type(self, variation_type): - av.val_instance(variation_type, 'variation_type', 'Product_Variation_Container.add_product_variation_type', Product_Variation_Type) - self.variations.append(variation_type) - def add_product_variation(self, variation): - av.val_instance(variation, 'variation', 'Product_Variation_Container.add_product_variation', Product_Variation) - if variation.variation_type is None: - variation_type = next(filterfalse(lambda x: x.id_type != variation.id_type, self.variation_types), None) - if variation_type is not None: - variation.variation_type = variation_type - self.variations.append(variation) - - def __repr__(self): - return f'Product_Variation_Container:\nvariations_types: {self.variation_types}\nvariations: {self.variations}' - - def to_list_variation_options(self): - list_variations = [] - for variation in self.variations: - list_variations.append(variation.to_json_option()) - Helper_App.console_log(f'list_variations: {list_variations}') - return list_variations - def to_list_variation_type_options(self): - list_variation_types = [] - for variation_type in self.variation_types: - list_variation_types.append(variation_type.to_json_option()) - return list_variation_types -""" - -class Product_Variation_Temp(db.Model, Store_Base): - __tablename__ = 'Shop_Variation_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_variation: int = db.Column(db.Integer) # , primary_key=True) - id_type: int = db.Column(db.Integer, nullable=False) - code: str = db.Column(db.String(50)) - name: str = db.Column(db.String(255)) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - guid: str = db.Column(db.String(36)) - - def __repr__(self): - attrs = '\n'.join(f'{k}={v!r}' for k, v in self.__dict__.items()) - return f'<{self.__class__.__name__}(\n{attrs}\n)>' - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_product_variation(cls, product_variation): - row = cls() - row.id_variation = product_variation.id_variation - row.id_type = product_variation.id_type - row.code = product_variation.code - row.name = product_variation.name - row.active = 1 if av.input_bool(product_variation.active, cls.FLAG_ACTIVE, f'{cls.__name__}.to_json') else 0 - row.display_order = product_variation.display_order - return row - def to_json(self): - return { - 'id_variation': self.id_variation, - 'id_type': self.id_type, - 'code': self.code, - 'name': self.name, - 'active': self.active, - 'display_order': self.display_order, - 'guid': self.guid, - } \ No newline at end of file diff --git a/business_objects/store/product_variation_tree.py b/business_objects/store/product_variation_tree.py deleted file mode 100644 index 00a3647e..00000000 --- a/business_objects/store/product_variation_tree.py +++ /dev/null @@ -1,161 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Business Object - -Description: -Business object for product -""" - -# internal -from business_objects.store.product_variation import Product_Variation -from business_objects.store.product_variation_type import Product_Variation_Type -from extensions import db -from helpers.helper_app import Helper_App -# external - - -class Product_Variation_Tree_Node(): - variation_type: Product_Variation_Type - node_parent: None - nodes_child: list - def __init__(self): - self.nodes_child = [] - def from_variation_type_and_node_parent(variation_type, node_parent): - node = Product_Variation_Tree_Node() - node.variation_type = variation_type - node.node_parent = node_parent - return node - def from_node_parent(node_parent): - node = Product_Variation_Tree_Node() - node.node_parent = node_parent - return node - def add_child(self, node_child): - self.nodes_child.append(node_child) - def is_leaf(self): - return (len(self.nodes_child) == 0) - -class Product_Variation_Tree(): - node_root: Product_Variation_Tree_Node - @classmethod - def from_node_root(cls, node_root): - tree = cls() - tree.node_root = node_root - return tree - @classmethod - def from_variation_type_root(cls, variation_type_root): - node_root = Product_Variation_Tree_Node.from_variation_type_and_node_parent(variation_type_root, None) - return cls.from_node_root(node_root) - def is_equal(self, tree): - my_type_list = self.get_product_variation_types() - sz_me = len(my_type_list) - other_type_list = tree.get_product_variation_types() - sz_other = len(other_type_list) - is_equal = (sz_me == sz_other) - if is_equal: - for index_type in range(sz_me): - my_variation_type = my_type_list[index_type] - other_variation_type = other_type_list[index_type] - if my_variation_type.id_type != other_variation_type.id_type: - is_equal = False - break - my_variation = my_variation_type.variations[0] - other_variation = other_variation_type.variations[0] - if my_variation.id_variation != other_variation.id_variation: - is_equal = False - break - return is_equal - @classmethod - def from_product_permutation(cls, product_permutation): - depth_max = len(product_permutation.variation_types) - node_root = Product_Variation_Tree_Node.from_variation_type_and_node_parent(product_permutation.variation_types[0], None) - node = node_root - for depth in range(depth_max - 1): - node = Product_Variation_Tree_Node.from_variation_type_and_node_parent(product_permutation.variation_types[depth + 1], node) - return cls.from_node_root(node_root) - @classmethod - def from_product_variation_type(cls, product_variation_type): - node_root = Product_Variation_Tree_Node.from_variation_type_and_node_parent(product_variation_type, None) - return cls.from_node_root(node_root) - @classmethod - def from_product_variation_types(cls, product_variation_types): - node_root = Product_Variation_Tree_Node.from_variation_type_and_node_parent(product_variation_types[0], None) - tree = cls.from_node_root(node_root) - if len(product_variation_types) > 1: - for variation_type in product_variation_types[1:]: - tree.add_product_variation_type(variation_type) - return tree - @classmethod - def from_json_str(cls, json_str): - variation_types = [] - if json_str is None or json_str == '': return None - for json_variation_type in json_str.split(','): - parts = json_variation_type.split(':') - if len(parts) != 2: continue - variation_type = Product_Variation_Type() - variation_type.id_type = parts[0] - variation = Product_Variation() - variation_type.id_variation = parts[1] - variation_type.variations = [variation] - variation_types.append(variation_type) - return cls.from_product_variation_types(variation_types) - def get_node_leaf(self): - node = self.node_root - at_leaf_node = node.is_leaf() - while not at_leaf_node: - node = node.nodes_child[0] - at_leaf_node = node.is_leaf() - return node - def add_product_variation_type(self, variation_type): - node_leaf = self.get_node_leaf() - node_new = Product_Variation_Tree_Node.from_variation_type_and_node_parent(variation_type, node_leaf) - node_leaf.add_child(node_new) - def get_product_variation_types(self): - types = [] - node = self.node_root - at_leaf_node = node.is_leaf() - while not at_leaf_node: - types.append(node.variation_type) - node = node.nodes_child[0] - at_leaf_node = node.is_leaf() - types.append(node.variation_type) - return types - """ - def get_product_variations(self): - variations = [] - node = self.node_root - at_leaf_node = node.is_leaf() - variations.append(node.variation) - while not at_leaf_node: - node = node.nodes_child[0] - at_leaf_node = node.is_leaf() - variations.append(node.variation) - return variations - """ - def to_preview_str(self): - Helper_App.console_log(f'Product_Variation_Tree.to_preview_str') - variation_types = self.get_product_variation_types() - Helper_App.console_log(f'variation_types: {variation_types}') - preview_str = '' - for variation_type in variation_types: - is_first = (preview_str == '') - preview_str += f'{variation_type.name_singular}: {variation_type.variations[0].name}' - if is_first: - preview_str += '\n' - Helper_App.console_log(f'preview_str: {preview_str}') - return preview_str - def to_json(self): - variation_types = self.get_product_variation_types() - json_variation_types = [] - for variation_type in variation_types: - json_variation_types.append(variation_type.to_json()) - return json_variation_types - def to_variation_id_pairs_str(self): - variation_types = self.get_product_variation_types() - pairs_str = '' - for variation_type in variation_types: - pairs_str += f'{variation_type.id_type}:{variation_type.variations[0].id_variation},' - return pairs_str \ No newline at end of file diff --git a/business_objects/store/product_variation_type.py b/business_objects/store/product_variation_type.py deleted file mode 100644 index 7e799893..00000000 --- a/business_objects/store/product_variation_type.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Product_Variation Business Object - -Description: -Business object for product variation -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# CLASSES -# METHODS - -# IMPORTS -# internal -import lib.argument_validation as av -from business_objects.store.product_variation import Product_Variation -from business_objects.store.store_base import Store_Base -from extensions import db -# external -from dataclasses import dataclass -from typing import ClassVar -from pydantic import BaseModel -from itertools import filterfalse -from operator import attrgetter - -class Product_Variation_Type(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT_VARIATION_TYPE - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - - id_type = db.Column(db.Integer, primary_key=True) - code = db.Column(db.String(50)) - name_singular = db.Column(db.String(255)) - name_plural = db.Column(db.String(255)) - display_order = db.Column(db.Integer) - active = db.Column(db.Boolean) - - def __init__(self): - super().__init__() - self.variations = [] - - @classmethod - def from_DB_get_many_product_catalogue(cls, query_row): - variation_type = cls() - variation_type.id_type = query_row[1] - variation_type.code = query_row[6] - variation_type.name_singular = query_row[7] - variation_type.name_plural = query_row[8] - variation_type.display_order = query_row[9] - variation_type.active = av.input_bool(query_row[10], cls.FLAG_ACTIVE, f'{cls.__name__}.from_DB_get_many_product_catalogue') - variation_type.variations = [Product_Variation.from_DB_get_many_product_catalogue(query_row)] - return variation_type - - @classmethod - def from_DB_get_many_product_variation(cls, query_row): - variation_type = cls() - variation_type.id_type = query_row[0] - variation_type.code = query_row[1] - variation_type.name_singular = query_row[2] - variation_type.name_plural = query_row[3] - variation_type.display_order = query_row[4] - variation_type.active = av.input_bool(query_row[5], cls.FLAG_ACTIVE, f'{cls.__name__}.from_DB_get_many_product_variation') - return variation_type - - @classmethod - def from_json(cls, json): - variation_type = cls() - variation_type.id_type = json[cls.ATTR_ID_PRODUCT_VARIATION_TYPE] - variation_type.code = json[cls.FLAG_CODE] - variation_type.name_singular = json.get(cls.FLAG_NAME_SINGULAR, json.get(cls.FLAG_NAME, '')) - variation_type.name_plural = json[cls.FLAG_NAME_PLURAL] - variation_type.display_order = json[cls.FLAG_DISPLAY_ORDER] - variation_type.active = json[cls.FLAG_ACTIVE] - variations = json.get(cls.FLAG_PRODUCT_VARIATIONS, []) - if variations is not None and len(variations) > 0: - variation_type.variations = [Product_Variation.from_json(variation) for variation in variations] - return variation_type - - def __repr__(self): - return f''' - {self.__class__.__name__} - id_type: {self.id_type} - code: {self.code} - name_singular: {self.name_singular} - name_plural: {self.name_plural} - display_order: {self.display_order} - active: {self.active} - ''' - - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_PRODUCT_VARIATION_TYPE: self.id_type, - self.FLAG_CODE: self.code, - self.FLAG_NAME: self.name_singular, - self.FLAG_NAME_PLURAL: self.name_plural, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_ACTIVE: self.active, - self.FLAG_PRODUCT_VARIATIONS: [variation.to_json() for variation in self.variations] - } - def to_json_option(self): - return { - 'value': self.id_type, - 'text': self.name_singular - } - """ - def get_preview_variations(self): - preview = '' - if len(self.variations) > 0: - # preview = '\n'.join([variation.name for variation in self.variations]) - preview = '

' + '

'.join([variation.name for variation in self.variations]) + '

' - return preview - def get_str_list_ids_variation(self): - if self.variations is None or len(self.variations) == 0: - return '' - return ','.join([str(variation.id_variation) for variation in self.variations]) - """ - -class Product_Variation_Type_Temp(db.Model, Store_Base): - __tablename__ = 'Shop_Variation_Type_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_type: int = db.Column(db.Integer) - code: str = db.Column(db.String(50)) - name: str = db.Column(db.String(255)) - name_plural: str = db.Column(db.String(256)) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - guid: str = db.Column(db.String(36)) - - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_product_variation_type(cls, product_variation_type): - row = cls() - row.id_type = product_variation_type.id_type - row.code = product_variation_type.code - row.name = product_variation_type.name_singular - row.name_plural = product_variation_type.name_plural - row.active = 1 if av.input_bool(product_variation_type.active, cls.FLAG_ACTIVE, f'{cls.__name__}.from_product_variation_type') else 0 - row.display_order = product_variation_type.display_order - return row - def to_json(self): - return { - 'id_type': self.id_type, - 'code': self.code, - 'name': self.name, - 'name_plural': self.name_plural, - 'active': self.active, - 'display_order': self.display_order, - 'guid': self.guid, - } - def __repr__(self): - return f''' - {self.__class__.__name__} - id_temp: {self.id_temp} - id_type: {self.id_type} - code: {self.code} - name: {self.name} - name_plural: {self.name_plural} - active: {self.active} - display_order: {self.display_order} - guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/stock_item.py b/business_objects/store/stock_item.py deleted file mode 100644 index 77fabadc..00000000 --- a/business_objects/store/stock_item.py +++ /dev/null @@ -1,303 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Stock Item Business Object -""" - -# IMPORTS -# internal -import lib.argument_validation as av -from lib import data_types -from forms.store.stock_item import Filters_Stock_Item -from business_objects.db_base import Get_Many_Parameters_Base -from business_objects.currency import Currency -# from business_objects.discount import Discount -from business_objects.store.product_variation_tree import Product_Variation_Tree -from business_objects.store.storage_location import Storage_Location -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from dataclasses import dataclass -from typing import ClassVar, Optional -from datetime import datetime - - -class Stock_Item(db.Model, Store_Base): - ATTR_ID_CURRENCY_COST: ClassVar[str] = f'{Store_Base.ATTR_ID_CURRENCY}_cost' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_CURRENCY - NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - FLAG_DATE_CONSUMED: ClassVar[str] = 'date_consumed' - FLAG_DATE_EXPIRATION: ClassVar[str] = 'date_expiration' - FLAG_DATE_PURCHASED: ClassVar[str] = 'date_purchased' - FLAG_DATE_RECEIVED: ClassVar[str] = 'date_received' - FLAG_DATE_UNSEALED: ClassVar[str] = 'date_unsealed' - FLAG_IS_CONSUMED: ClassVar[str] = 'is_consumed' - FLAG_IS_SEALED: ClassVar[str] = 'is_sealed' - - id_stock = db.Column(db.Integer, primary_key=True) - id_permutation = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_category = db.Column(db.Integer) - id_location_storage = db.Column(db.Integer) - id_plant = db.Column(db.Integer) - id_region = db.Column(db.Integer) - id_currency_cost = db.Column(db.Integer) - cost_local_VAT_excl = db.Column(db.Float) - cost_local_VAT_incl = db.Column(db.Float) - date_purchased = db.Column(db.DateTime) - date_received = db.Column(db.DateTime) - is_sealed = db.Column(db.Boolean) - date_unsealed = db.Column(db.DateTime) - date_expiration = db.Column(db.DateTime) - is_consumed = db.Column(db.Boolean) - date_consumed = db.Column(db.DateTime) - active = db.Column(db.Boolean) - """ - can_view = db.Column(db.Boolean) - can_edit = db.Column(db.Boolean) - can_admin = db.Column(db.Boolean) - """ - # variation_tree: Product_Variation_Tree = None - - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.currency_cost = None - self.storage_location = None - self.variation_tree = None - self.has_variations = False - - def from_DB_stock_item(query_row): - _m = 'Product.from_DB_stock_item' - v_arg_type = 'class attribute' - stock_item = Stock_Item() - stock_item.id_stock = query_row[0] - stock_item.id_permutation = query_row[1] - stock_item.id_product = query_row[2] - stock_item.id_category = query_row[3] - stock_item.id_location_storage = query_row[4] - stock_item.storage_location = Storage_Location.from_DB_stock_item(query_row) - stock_item.id_currency_cost = query_row[12] - stock_item.currency_cost = Currency.from_DB_stock_item(query_row) - stock_item.cost_local_VAT_excl = query_row[15] - stock_item.cost_local_VAT_incl = query_row[16] - stock_item.date_purchased = query_row[17] - stock_item.date_received = query_row[18] - stock_item.is_sealed = av.input_bool(query_row[19], "is_sealed", _m, v_arg_type=v_arg_type) - stock_item.date_unsealed = query_row[20] - stock_item.date_expiration = query_row[21] - stock_item.is_consumed = av.input_bool(query_row[22], "is_consumed", _m, v_arg_type=v_arg_type) - stock_item.date_consumed = query_row[23] - stock_item.active = av.input_bool(query_row[24], "active", _m, v_arg_type=v_arg_type) - """ - stock_item.can_view = av.input_bool(query_row[24], "can_view", _m, v_arg_type=v_arg_type) - stock_item.can_edit = av.input_bool(query_row[25], "can_edit", _m, v_arg_type=v_arg_type) - stock_item.can_admin = av.input_bool(query_row[26], "can_admin", _m, v_arg_type=v_arg_type) - """ - return stock_item - - @classmethod - def from_json(cls, json): - stock_item = cls() - stock_item.id_stock = json[cls.ATTR_ID_STOCK_ITEM] - stock_item.id_permutation = json.get(cls.ATTR_ID_PRODUCT_PERMUTATION, 0) - stock_item.id_product = json[cls.ATTR_ID_PRODUCT] - stock_item.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] - Helper_App.console_log(f'json: {json}\nhalf stock item: {stock_item}') - stock_item.variation_tree = Product_Variation_Tree.from_json_str(json[cls.FLAG_PRODUCT_VARIATIONS]) - stock_item.date_purchased = json[cls.FLAG_DATE_PURCHASED] - stock_item.date_received = json[cls.FLAG_DATE_RECEIVED] - stock_item.id_location_storage = json[cls.ATTR_ID_STORAGE_LOCATION] - stock_item.id_currency_cost = json[cls.ATTR_ID_CURRENCY_COST] - stock_item.cost_local_VAT_excl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL] - stock_item.cost_local_VAT_incl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_INCL] - stock_item.is_sealed = json[cls.FLAG_IS_SEALED] - stock_item.date_unsealed = json[cls.FLAG_DATE_UNSEALED] - stock_item.date_expiration = json[cls.FLAG_DATE_EXPIRATION] - stock_item.is_consumed = json[cls.FLAG_IS_CONSUMED] - stock_item.date_consumed = json[cls.FLAG_DATE_CONSUMED] - stock_item.active = json[cls.FLAG_ACTIVE] - return stock_item - def __repr__(self): - return f'''Stock Item - id_stock: {self.id_stock} - id_permutation: {self.id_permutation} - id_product: {self.id_product} - id_category: {self.id_category} - variations: {self.variation_tree.to_preview_str() if self.variation_tree is not None else 'None'} - storage_location: {self.storage_location} - currency: {self.currency_cost} - cost_local_VAT_excl: {self.cost_local_VAT_excl} - cost_local_VAT_incl: {self.cost_local_VAT_incl} - date_purchased: {self.date_purchased} - date_received: {self.date_received} - is_sealed: {self.is_sealed} - date_unsealed: {self.date_unsealed} - date_expiration: {self.date_expiration} - is_consumed: {self.is_consumed} - date_consumed: {self.date_consumed} - active: {self.active} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_STOCK_ITEM: self.id_stock, - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.FLAG_STORAGE_LOCATION: self.storage_location.to_json(), - self.FLAG_CURRENCY_COST: self.currency_cost.to_json(), - self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_local_VAT_excl, - self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_local_VAT_incl, - } - def has_permutations(self): - return len(self.permutations) > 0 - def is_available(self): - if len(self.permutations) == 0: - return False - for permutation in self.permutations: - if permutation.is_available(): - return True - return False - """ - def to_permutation_row_list(self): - list_rows = [] - for permutation in self.permutations: - list_rows.append(permutation.to_row_permutation()) - return list_rows - def to_json_option(self): - return { - 'value': self.id_stock_item, - 'text': self.id_stock_item - } - """ - -class Parameters_Stock_Item(Get_Many_Parameters_Base): - a_get_all_product_permutation: bool - a_get_inactive_product_permutation: bool - a_ids_product_permutation: str - a_get_all_stock_item: bool - a_get_inactive_stock_item: bool - a_ids_stock_item: str - a_get_all_region_storage: bool - a_get_inactive_region_storage: bool - a_ids_region_storage: str - a_get_all_plant_storage: bool - a_get_inactive_plant_storage: bool - a_ids_plant_storage: str - a_get_all_location_storage: bool - a_get_inactive_location_storage: bool - a_ids_location_storage: str - a_date_received_to: Optional[datetime] = None - a_get_sealed_stock_item_only: bool - a_get_unsealed_stock_item_only: bool - a_get_expired_stock_item_only: bool - a_get_nonexpired_stock_item_only: bool - a_get_consumed_stock_item_only: bool - a_get_nonconsumed_stock_item_only: bool - - def __init__(self, **kwargs): - super().__init__(**kwargs) - - @classmethod - def get_default(cls): - return cls( - # a_id_user = id_user, - a_get_all_product_permutation = False, - a_get_inactive_product_permutation = False, - a_ids_product_permutation = '', - a_get_all_stock_item = True, - a_get_inactive_stock_item = False, - a_ids_stock_item = '', - a_get_all_region_storage = True, - a_get_inactive_region_storage = False, - a_ids_region_storage = '', - a_get_all_plant_storage = True, - a_get_inactive_plant_storage = False, - a_ids_plant_storage = '', - a_get_all_location_storage = True, - a_get_inactive_location_storage = False, - a_ids_location_storage = '', - a_date_received_to = None, - a_get_sealed_stock_item_only = False, - a_get_unsealed_stock_item_only = False, - a_get_expired_stock_item_only = False, - a_get_nonexpired_stock_item_only = False, - a_get_consumed_stock_item_only = False, - a_get_nonconsumed_stock_item_only = False - ) - - @classmethod - def from_form_stock_item(cls, form): - return cls.get_default() - - -class Stock_Item_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Stock_Item_Temp' - __table_args__ = { 'extend_existing': True } - id_stock: int = db.Column(db.Integer, primary_key=True) - # id_category: int = db.Column(db.Integer) - id_product: int = db.Column(db.Integer) - # has_variations: bool = db.Column(db.Boolean) - id_permutation: int = db.Column(db.Integer) - id_pairs_variations: str = db.Column(db.String(4000)) - date_purchased: datetime = db.Column(db.DateTime) - date_received: datetime = db.Column(db.DateTime, nullable=True) - id_location_storage: int = db.Column(db.Integer) - id_currency_cost: int = db.Column(db.Integer) - cost_local_VAT_excl: float = db.Column(db.Float) - cost_local_VAT_incl: float = db.Column(db.Float) - is_sealed: bool = db.Column(db.Boolean) - date_unsealed: datetime = db.Column(db.DateTime, nullable=True) - date_expiration: datetime = db.Column(db.DateTime, nullable=True) - is_consumed: bool = db.Column(db.Boolean) - date_consumed: datetime = db.Column(db.DateTime, nullable=True) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - - @classmethod - def from_stock_item(cls, stock_item): - row = cls() - row.id_stock = stock_item.id_stock - # row.id_category = stock_item.id_category - row.id_product = stock_item.id_product - row.id_permutation = stock_item.id_permutation - # row.has_variations = stock_item.has_variations - row.id_pairs_variations = stock_item.variation_tree.to_json_str() if stock_item.variation_tree is not None else '' - row.date_purchased = stock_item.date_purchased - row.date_received = stock_item.date_received if stock_item.date_received else None - row.id_location_storage = stock_item.id_location_storage - row.id_currency_cost = stock_item.id_currency_cost - row.cost_local_VAT_excl = stock_item.cost_local_VAT_excl - row.cost_local_VAT_incl = stock_item.cost_local_VAT_incl - row.is_sealed = 1 if stock_item.is_sealed else 0 - row.date_unsealed = stock_item.date_unsealed if stock_item.date_unsealed else None - row.date_expiration = stock_item.date_expiration if stock_item.date_expiration else None - row.is_consumed = 1 if stock_item.is_consumed else 0 - row.date_consumed = stock_item.date_consumed if stock_item.date_consumed else None - row.active = 1 if stock_item.active else 0 - return row - def __repr__(self): - return f''' -id_stock: {self.id_stock} -id_product: {self.id_product} -id_permutation: {self.id_permutation} -id_pairs_variations: {self.id_pairs_variations} -date_purchased: {self.date_purchased} -date_received: {self.date_received} -id_location_storage: {self.id_location_storage} -id_currency_cost: {self.id_currency_cost} -cost_local_VAT_excl: {self.cost_local_VAT_excl} -cost_local_VAT_incl: {self.cost_local_VAT_incl} -is_sealed: {self.is_sealed} -date_unsealed: {self.date_unsealed} -date_expiration: {self.date_expiration} -is_consumed: {self.is_consumed} -date_consumed: {self.date_consumed} -active: {self.active} -guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/storage_location.py b/business_objects/store/storage_location.py deleted file mode 100644 index 61a3fb8f..00000000 --- a/business_objects/store/storage_location.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Product Category Business Object - -Description: -Business object for product -""" - -# internal -import lib.argument_validation as av -from business_objects.store.plant import Plant -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from typing import ClassVar - - -class Storage_Location(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_STORAGE_LOCATION - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - __tablename__ = 'Shop_Storage_Location_Temp' - id_location = db.Column(db.Integer, primary_key=True) - id_plant = db.Column(db.Integer) - code = db.Column(db.String(50)) - name = db.Column(db.String(255)) - active = db.Column(db.Boolean) - - # plant = None - - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.plant = None - - @classmethod - def from_DB_storage_location(cls, query_row): - location = cls() - location.id_location = query_row[0] - location.id_plant = query_row[1] - location.plant = Plant.from_DB_storage_location(query_row) - location.code = query_row[4] - location.name = query_row[5] - location.active = query_row[6] - return location - @classmethod - def from_DB_stock_item(cls, query_row): - location = cls() - location.id_location = query_row[4] - location.id_plant = query_row[5] - location.code = query_row[8] - location.name = query_row[9] - location.plant = Plant.from_DB_stock_item(query_row) - return location - def __repr__(self): - return f''' - {self.ATTR_ID_STORAGE_LOCATION}: {self.id_location} - {self.ATTR_ID_PLANT}: {self.id_plant} - {self.FLAG_CODE}: {self.code} - {self.FLAG_NAME}: {self.name} - {self.FLAG_ACTIVE}: {self.active} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_STORAGE_LOCATION: self.id_location, - self.ATTR_ID_PLANT: self.id_plant, - self.FLAG_CODE: self.code, - self.FLAG_NAME: self.name, - self.FLAG_ACTIVE: 1 if av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0 - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - location = cls() - location.id_location = json[cls.ATTR_ID_STORAGE_LOCATION], - location.id_plant = json[cls.ATTR_ID_PLANT], - location.code = json[cls.FLAG_CODE], - location.name = json[cls.FLAG_NAME], - location.active = json[cls.FLAG_ACTIVE] - return location - - def get_full_name(self): - return f'{self.plant.name} - {self.name}' \ No newline at end of file diff --git a/business_objects/store/store_base.py b/business_objects/store/store_base.py deleted file mode 100644 index 4eac4567..00000000 --- a/business_objects/store/store_base.py +++ /dev/null @@ -1,129 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Base Store Business Object - -Description: -Abstract business object for store objects -""" - -# internal -# from helpers.DEPRECATED.helper_abc import Interface_ABC -from business_objects.base import Base -from extensions import db -import lib.argument_validation as av -# external -from typing import ClassVar - -""" -class I_Store_Base(): - @abstractmethod - def __repr__(self): - pass - @classmethod - @abstractmethod - def from_json(cls, json): - pass - @abstractmethod - def to_json(self): - pass - @abstractmethod - def to_json_option(self): - pass - @abstractmethod - def test_69 (self): - pass - "" - def __init_subclass__(cls, **kwargs): - super().__init_subclass__(**kwargs) - for name, value in vars(Store_Base).items(): - if getattr(value, "__isabstractmethod__", False): - if name not in cls.__dict__: - raise TypeError(f"Can't instantiate class {cls.__name__} " - f"without implementation of abstract method {name}") - subclass_value = cls.__dict__[name] - if (isinstance(value, (staticmethod, classmethod)) and - not isinstance(subclass_value, type(value))): - raise TypeError(f"Abstract {type(value).__name__} {name} in {cls.__name__} " - f"must be implemented as a {type(value).__name__}") - def __new__(cls, *args, **kwargs): - if cls is Store_Base: - raise TypeError("Can't instantiate abstract class Store_Base directly") - return super().__new__(cls) - "" -""" - -class Store_Base(Base): - # ATTR_ID_CURRENCY_COST: ClassVar[str] = 'id_currency_cost' - ATTR_ID_CUSTOMER: ClassVar[str] = 'id_customer' - ATTR_ID_CUSTOMER_ADDRESS: ClassVar[str] = 'id_address' - ATTR_ID_CUSTOMER_SALES_ORDER: ClassVar[str] = 'id_customer_sales_order' - ATTR_ID_DELIVERY_OPTION: ClassVar[str] = 'id_delivery_option' - ATTR_ID_DISCOUNT: ClassVar[str] = 'id_discount' - ATTR_ID_IMAGE: ClassVar[str] = 'id_image' - ATTR_ID_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'id_order' - ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK: ClassVar[str] = 'id_link' - ATTR_ID_PLANT: ClassVar[str] = 'id_plant' - ATTR_ID_PRODUCT: ClassVar[str] = 'id_product' - ATTR_ID_PRODUCT_CATEGORY: ClassVar[str] = 'id_category' - ATTR_ID_PRODUCT_IMAGE: ClassVar[str] = 'id_image' - ATTR_ID_PRODUCT_PERMUTATION: ClassVar[str] = 'id_permutation' - ATTR_ID_PRODUCT_PRICE: ClassVar[str] = 'id_price' - ATTR_ID_PRODUCT_VARIATION: ClassVar[str] = 'id_variation' - ATTR_ID_PRODUCT_VARIATION_TYPE: ClassVar[str] = 'id_type' - ATTR_ID_STOCK_ITEM: ClassVar[str] = 'id_stock_item' - ATTR_ID_STORAGE_LOCATION: ClassVar[str] = 'id_location' - ATTR_ID_SUPPLIER: ClassVar[str] = 'id_supplier' - ATTR_ID_SUPPLIER_ADDRESS: ClassVar[str] = 'id_address' - ATTR_ID_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'id_order' - ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK: ClassVar[str] = 'id_link' - ATTR_ID_UNIT_MEASUREMENT_LATENCY_MANUFACTURE: ClassVar[str] = 'id_unit_latency_manufacture' - ATTR_ID_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = 'id_unit_quantity' - # FLAG_COST_LOCAL: ClassVar[str] = 'cost_local' - FLAG_COST_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = 'cost_total_local_vat_excl' - FLAG_COST_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = 'cost_total_local_vat_incl' - FLAG_COST_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = 'cost_unit_local_vat_excl' - FLAG_COST_UNIT_LOCAL_VAT_INCL: ClassVar[str] = 'cost_unit_local_vat_incl' - FLAG_CUSTOMER: ClassVar[str] = 'customer' - FLAG_CUSTOMER_ADDRESS: ClassVar[str] = 'customer_address' - FLAG_CUSTOMER_SALES_ORDER: ClassVar[str] = 'customer_sales_order' - FLAG_DELIVERY_OPTION: ClassVar[str] = 'delivery_option' - FLAG_DISCOUNT: ClassVar[str] = 'discount' - FLAG_HAS_VARIATIONS: ClassVar[str] = 'has_variations' - FLAG_IS_OUT_OF_STOCK: ClassVar[str] = 'is_out_of_stock' - FLAG_LATENCY_DELIVERY_DAYS: ClassVar[str] = 'latency_delivery_days' - FLAG_LATENCY_MANUFACTURE: ClassVar[str] = 'latency_manufacture' - FLAG_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'manufacturing_purchase_order' - FLAG_ORDER_ITEMS: ClassVar[str] = 'order_items' - FLAG_PLANT: ClassVar[str] = 'plant' - FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = 'price_total_local_vat_excl' - FLAG_PRICE_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = 'price_total_local_vat_incl' - FLAG_PRICE_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = 'price_unit_local_vat_excl' - FLAG_PRICE_UNIT_LOCAL_VAT_INCL: ClassVar[str] = 'price_unit_local_vat_incl' - FLAG_PRODUCT: ClassVar[str] = 'product' - FLAG_PRODUCT_CATEGORY: ClassVar[str] = 'product_category' - FLAG_PRODUCT_IMAGE: ClassVar[str] = 'product_image' - FLAG_PRODUCT_PERMUTATION: ClassVar[str] = 'product_permutation' - FLAG_PRODUCT_PRICE: ClassVar[str] = 'product_price' - FLAG_PRODUCT_VARIATION: ClassVar[str] = 'product_variation' - FLAG_PRODUCT_VARIATIONS: ClassVar[str] = f'{FLAG_PRODUCT_VARIATION}s' - FLAG_PRODUCT_VARIATION_TYPE: ClassVar[str] = 'product_variation_type' - FLAG_QUANTITY_MIN: ClassVar[str] = 'quantity_min' - FLAG_QUANTITY_MAX: ClassVar[str] = 'quantity_max' - FLAG_QUANTITY_ORDERED: ClassVar[str] = 'quantity_ordered' - FLAG_QUANTITY_RECEIVED: ClassVar[str] = 'quantity_received' - FLAG_STOCK_ITEM: ClassVar[str] = 'stock_item' - FLAG_STORAGE_LOCATION: ClassVar[str] = 'storage_location' - FLAG_SUPPLIER: ClassVar[str] = 'supplier' - FLAG_SUPPLIER_ADDRESS: ClassVar[str] = 'supplier_address' - FLAG_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'supplier_purchase_order' - FLAG_TEXT: ClassVar[str] = 'text' - FLAG_UNIT_MEASUREMENT_LATENCY_MANUFACTURE: ClassVar[str] = 'unit_measurement_latency_manufacture' - FLAG_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = 'unit_measurement_quantity' - FLAG_VALUE_TEXT: ClassVar[str] = 'value_text' - - def __repr__(self): - return str(self.__dict__) \ No newline at end of file diff --git a/business_objects/store/stripe.py b/business_objects/store/stripe.py deleted file mode 100644 index 3ed8c54d..00000000 --- a/business_objects/store/stripe.py +++ /dev/null @@ -1,161 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Stripe Business Object - -Description: -Business objects for Stripe -""" - -# internal -import lib.argument_validation as av -from lib import data_types -from forms.forms import Form_Basket_Add, Form_Basket_Edit # Form_Product -from extensions import db -from helpers.helper_app import Helper_App -# external -from datetime import datetime, timedelta -import locale - -class Stripe_Product(db.Model): - id_product = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(255)) - description = db.Column(db.String(4000)) - price_GBP_full = db.Column(db.Float) - id_category = db.Column(db.Integer) - lead_time_manuf = db.Column(db.Integer) - quantity_min = db.Column(db.Float) - quantity_max = db.Column(db.Float) - quantity_step = db.Column(db.Float) - quantity_stock = db.Column(db.Float) - id_stripe_product = db.Column(db.String(255)) - id_stripe_price = db.Column(db.String(255)) - is_subscription = db.Column(db.Boolean) - name_recurring_interval = db.Column(db.String(255)) - name_plural_recurring_interval = db.Column(db.String(256)) - count_recurring_interval = db.Column(db.Integer) - display_order = db.Column(db.Integer) - can_view = db.Column(db.Boolean) - can_edit = db.Column(db.Boolean) - can_admin = db.Column(db.Boolean) - # form_basket_add: Form_Basket_Add - # form_basket_edit: Form_Basket_Edit - - def __new__(cls, id, name, description, price_GBP_full, id_category, lead_time_manuf, quantity_min, quantity_max, quantity_step, quantity_stock, id_stripe_product, id_stripe_price, - is_subscription, name_recurring_interval, name_plural_recurring_interval, count_recurring_interval, display_order, can_view, can_edit, can_admin): - _m = 'Product.__new__' - v_arg_type = 'class attribute' - av.val_int(id, 'id', _m, 0, v_arg_type=v_arg_type) - av.val_str(name, 'name', _m, max_len=256, v_arg_type=v_arg_type) - av.val_str(description, 'description', _m, max_len=4000, v_arg_type=v_arg_type) - av.full_val_float(price_GBP_full, 'price_GBP_full', _m, 0., v_arg_type=v_arg_type) - av.val_int(id_category, 'id_category', _m, 0, v_arg_type=v_arg_type) - av.val_int(lead_time_manuf, 'lead_time_manuf', _m, 0, v_arg_type=v_arg_type) - av.full_val_float(quantity_step, 'quantity_step', _m, 0., v_arg_type=v_arg_type) - av.full_val_float(quantity_min, 'quantity_min', _m, quantity_step, v_arg_type=v_arg_type) - av.full_val_float(quantity_max, 'quantity_max', _m, quantity_min, v_arg_type=v_arg_type) - av.full_val_float(quantity_stock, 'quantity_stock', _m, 0, v_arg_type=v_arg_type) - av.val_str(id_stripe_product, 'id_stripe_product', _m, max_len=100, v_arg_type=v_arg_type) - av.val_str(id_stripe_price, 'id_stripe_price', _m, max_len=100, v_arg_type=v_arg_type) - av.full_val_bool(is_subscription, 'is_subscription', _m, v_arg_type=v_arg_type) - Helper_App.console_log(f'is_subscription: {is_subscription}, {av.input_bool(is_subscription, "is_subscription", _m, v_arg_type=v_arg_type)}') - is_subscription = av.input_bool(is_subscription, "is_subscription", _m, v_arg_type=v_arg_type) - if is_subscription: - av.val_str(name_recurring_interval, 'name_recurring_interval', _m, max_len=255, v_arg_type=v_arg_type) - av.val_str(name_plural_recurring_interval, 'name_plural_recurring_interval', _m, max_len=256, v_arg_type=v_arg_type) - av.val_int(count_recurring_interval, 'count_recurring_interval', _m, 0, v_arg_type=v_arg_type) - av.val_int(display_order, 'display_order', _m, v_arg_type=v_arg_type) - av.full_val_bool(can_view, 'can_view', _m, v_arg_type=v_arg_type) - # can_view = av.input_bool(can_view, "can_view", _m, v_arg_type=v_arg_type) - av.full_val_bool(can_edit, 'can_edit', _m, v_arg_type=v_arg_type) - # can_edit = av.input_bool(can_edit, "can_edit", _m, v_arg_type=v_arg_type) - av.full_val_bool(can_admin, 'can_admin', _m, v_arg_type=v_arg_type) - # can_admin = av.input_bool(can_admin, "can_admin", _m, v_arg_type=v_arg_type) - return super(Product, cls).__new__(cls) # , id, name, description, price_GBP, id_category, lead_time_manuf, quantity_min, quantity_max, quantity_step, quantity_stock, id_stripe_product, id_stripe_price, - # is_subscription, name_recurring_interval, name_plural_recurring_interval, count_recurring_interval, can_view, can_edit, can_admin) - - def __init__(self, id, name, description, price_GBP_full, id_category, lead_time_manuf, quantity_min, quantity_max, quantity_step, quantity_stock, id_stripe_product, id_stripe_price, - is_subscription, name_recurring_interval, name_plural_recurring_interval, count_recurring_interval, display_order, can_view, can_edit, can_admin): - _m = 'Product.__new__' - v_arg_type = 'class attribute' - self.id_product = id - self.name = name - self.description = description - self.price_GBP_full = price_GBP_full - self.id_category = id_category - self.lead_time_manuf = lead_time_manuf - self.quantity_min = quantity_min - self.quantity_max = quantity_max - self.quantity_step = quantity_step - self.quantity_stock = quantity_stock - self.id_stripe_product = id_stripe_product - self.id_stripe_price = id_stripe_price - self.is_subscription = av.input_bool(is_subscription, "is_subscription", _m, v_arg_type=v_arg_type) - self.name_recurring_interval = name_recurring_interval - self.name_plural_recurring_interval = name_plural_recurring_interval - self.count_recurring_interval = count_recurring_interval - self.display_order = display_order - self.can_view = av.input_bool(can_view, "can_view", _m, v_arg_type=v_arg_type) - self.can_edit = av.input_bool(can_edit, "can_edit", _m, v_arg_type=v_arg_type) - self.can_admin = av.input_bool(can_admin, "can_admin", _m, v_arg_type=v_arg_type) - self.variations = [] - self.images = [] - self.delivery_options = [] - self.discounts = [] - self.discount_index = {} - super().__init__() - self.form_basket_add = Form_Basket_Add() - self.form_basket_edit = Form_Basket_Edit() - - def output_lead_time(self): - return '1 day' if self.lead_time_manuf == 1 else f'{self.lead_time_manuf} days' - - def output_delivery_date(self): - return (datetime.now() + timedelta(days=self.lead_time_manuf)).strftime('%A, %d %B %Y') - - def output_price(self): - locale.setlocale(locale.LC_ALL, '') - return locale.format_string("%d", self.price_GBP_full, grouping=True) - """ - def add_form_basket_add(self): - self.form_basket_add = None - - def add_form_basket_edit(self): - self.form_basket_edit = None - """ - def __repr__(self): - return f'''Product - id: {self.id_product} - name: {self.name} - description: {self.description} - price_GBP_full: {self.price_GBP_full} - id_category: {self.id_category} - lead_time_manuf: {self.lead_time_manuf} - quantity_min: {self.quantity_min} - quantity_max: {self.quantity_max} - quantity_step: {self.quantity_step} - quantity_stock: {self.quantity_stock} - id_stripe_product: {self.id_stripe_product} - id_stripe_price: {self.id_stripe_price} - is_subscription: {self.is_subscription} - name_recurring_interval: {self.name_recurring_interval} - name_plural_recurring_interval: {self.name_plural_recurring_interval} - count_recurring_interval: {self.count_recurring_interval} - display_order: {self.display_order} - can_view: {self.can_view} - can_edit: {self.can_edit} - can_admin: {self.can_admin} - variations: {self.variations} - images: {self.images} - delivery_options: {self.delivery_options} - ''' - - def add_product_price_discount(self, discount): - _m = 'Category.add_product' - av.val_instance(discount, 'discount', _m, Discount) - # self.product_index.append(len(self.products)) - self.discount_index[discount.id_discount] = len(self.discounts) - self.discounts.append(discount) \ No newline at end of file diff --git a/business_objects/store/supplier.py b/business_objects/store/supplier.py deleted file mode 100644 index d4752bef..00000000 --- a/business_objects/store/supplier.py +++ /dev/null @@ -1,200 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Supplier Business Object - -Description: -Business object for supplier -""" - -# internal -import lib.argument_validation as av -from business_objects.store.supplier_address import Supplier_Address -from business_objects.currency import Currency -from business_objects.db_base import Get_Many_Parameters_Base -from business_objects.store.store_base import Store_Base -from extensions import db -from helpers.helper_app import Helper_App -# external -from pydantic import BaseModel -from typing import ClassVar - - -class Supplier(db.Model, Store_Base): - FLAG_DEPARTMENT_CONTACT: ClassVar[str] = 'department_contact' - FLAG_NAME_COMPANY: ClassVar[str] = 'name_company' - FLAG_NAME_CONTACT: ClassVar[str] = 'name_contact' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER - NAME_ATTR_OPTION_TEXT: ClassVar[str] = FLAG_NAME_COMPANY - __tablename__ = 'Shop_Supplier' - id_supplier = db.Column(db.Integer, primary_key=True) - # id_address = db.Column(db.Integer) - id_currency = db.Column(db.Integer) - name_company = db.Column(db.String(255)) - name_contact = db.Column(db.String(255)) - department_contact = db.Column(db.String(255)) - phone_number = db.Column(db.String(50)) - fax = db.Column(db.String(50)) - email = db.Column(db.String(255)) - website = db.Column(db.String(255)) - active = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.addresses = [] - self.currency = None - @classmethod - def from_DB_supplier(cls, query_row): - supplier = cls() - supplier.id_supplier = query_row[0] - # supplier.id_address = query_row[1] - # supplier.address = Supplier_Address.from_DB_supplier(query_row) - supplier.id_currency = query_row[1] - supplier.currency = Currency.from_DB_supplier(query_row) - supplier.name_company = query_row[4] - supplier.name_contact = query_row[5] - supplier.department_contact = query_row[6] - supplier.phone_number = query_row[7] - supplier.fax = query_row[8] - supplier.email = query_row[9] - supplier.website = query_row[10] - supplier.active = av.input_bool(query_row[11], 'active', f'{cls.__name__}.from_DB_supplier') - return supplier - @classmethod - def from_DB_supplier_purchase_order(cls, query_row): - supplier = cls() - supplier.id_supplier = query_row[1] - supplier.name_company = query_row[2] - return supplier - def __repr__(self): - return f''' -id: {self.id_supplier}, -id_currency: {self.id_currency}, -name_company: {self.name_company}, -name_contact: {self.name_contact}, -department_contact: {self.department_contact}, -phone_number: {self.phone_number}, -fax: {self.fax}, -email: {self.email}, -website: {self.website}, -active: {self.active}, -addresses: {self.addresses} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_SUPPLIER: self.id_supplier, - # self.ATTR_ID_ADDRESS: self.id_address, - self.ATTR_ID_CURRENCY: self.id_currency, - self.FLAG_NAME_COMPANY: self.name_company, - self.FLAG_NAME_CONTACT: self.name_contact, - self.FLAG_DEPARTMENT_CONTACT: self.department_contact, - self.FLAG_PHONE_NUMBER: self.phone_number, - self.FLAG_FAX: self.fax, - self.FLAG_EMAIL: self.email, - self.FLAG_WEBSITE: self.website, - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') - } - def to_json_option(self): - return { - 'value': self.id_supplier, - 'text': self.name_company - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - supplier = cls() - supplier.id_supplier = json[cls.ATTR_ID_SUPPLIER] - supplier.id_currency = json[cls.ATTR_ID_CURRENCY] - supplier.name_company = json[cls.FLAG_NAME_COMPANY] - supplier.name_contact = json[cls.FLAG_NAME_CONTACT] - supplier.department_contact = json[cls.FLAG_DEPARTMENT_CONTACT] - supplier.phone_number = json[cls.FLAG_PHONE_NUMBER] - supplier.fax = json[cls.FLAG_FAX] - supplier.email = json[cls.FLAG_EMAIL] - supplier.website = json[cls.FLAG_WEBSITE] - supplier.active = json[cls.FLAG_ACTIVE] - addresses = json.get(cls.FLAG_SUPPLIER_ADDRESS, []) - supplier.addresses = [Supplier_Address.from_json(address) for address in addresses] - return supplier - def get_address_active(self): - for address in self.addresses: - if address.active: - return address - return Supplier_Address() - address = Supplier_Address() - address.postcode = '' - return address - -class Parameters_Supplier(Get_Many_Parameters_Base): - a_get_all_supplier: bool - a_get_inactive_supplier: bool - a_ids_supplier: str - def __init__(self, **kwargs): - super().__init__(**kwargs) - @classmethod - def get_default(cls): - return cls( - a_get_all_supplier = True, - a_get_inactive_supplier = False, - a_ids_supplier = '', - ) - @classmethod - def from_filters_supplier(cls, form): - parameters = cls.get_default() - parameters.a_get_inactive_supplier = form.active.data - return parameters - -class Supplier_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Supplier_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_supplier: int = db.Column(db.Integer) - id_currency: int = db.Column(db.Integer) - # id_address: int = db.Column(db.Integer) - name_company: str = db.Column(db.String(255)) - name_contact: str = db.Column(db.String(255)) - department_contact: str = db.Column(db.String(255)) - phone_number: str = db.Column(db.String(50)) - fax: str = db.Column(db.String(50)) - email: str = db.Column(db.String(255)) - website: str = db.Column(db.String(255)) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_supplier(cls, supplier): - row = cls() - row.id_supplier = supplier.id_supplier - row.id_currency = supplier.id_currency - # row.id_address = supplier.id_address - row.name_company = supplier.name_company - row.name_contact = supplier.name_contact - row.department_contact = supplier.department_contact - row.phone_number = supplier.phone_number - row.fax = supplier.fax - row.email = supplier.email - row.website = supplier.website - row.active = 1 if supplier.active else 0 - return row - def __repr__(self): - return f''' -id_supplier: {self.id_supplier} -id_currency: {self.id_currency} -name_company: {self.name_company} -name_contact: {self.name_contact} -department_contact: {self.department_contact} -phone_number: {self.phone_number} -fax: {self.fax} -email: {self.email} -website: {self.website} -active: {self.active} -guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/supplier_address.py b/business_objects/store/supplier_address.py deleted file mode 100644 index 8c73f914..00000000 --- a/business_objects/store/supplier_address.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Supplier Address Business Object - -Description: -Business object for supplier address -""" - -# internal -import lib.argument_validation as av -from business_objects.store.store_base import Store_Base -from business_objects.region import Region -from extensions import db -from helpers.helper_app import Helper_App -# external -from typing import ClassVar -from flask import jsonify - -class Supplier_Address(db.Model, Store_Base): - FLAG_ADDRESS_LINE_1: ClassVar[str] = 'address_line_1' - FLAG_ADDRESS_LINE_2: ClassVar[str] = 'address_line_2' - FLAG_CITY: ClassVar[str] = 'city' - FLAG_COUNTY: ClassVar[str] = 'county' - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_ADDRESS - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_POSTCODE - __tablename__ = 'Shop_Supplier_Address' - id_address = db.Column(db.Integer, primary_key=True) - id_supplier = db.Column(db.Integer) - id_region = db.Column(db.Integer) - postcode = db.Column(db.String(20)) - address_line_1 = db.Column(db.String(256)) - address_line_2 = db.Column(db.String(256)) - city = db.Column(db.String(256)) - county = db.Column(db.String(256)) - active = db.Column(db.Boolean) - - # region = None - - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.region = Region() - @classmethod - def from_DB_supplier(cls, query_row): - address = cls() - address.id_supplier = query_row[0] - address.id_address = query_row[1] - address.id_region = query_row[2] - address.region = Region.from_DB_supplier(query_row) - address.postcode = query_row[4] - address.address_line_1 = query_row[5] - address.address_line_2 = query_row[6] - address.city = query_row[7] - address.county = query_row[8] - address.active = av.input_bool(query_row[9], 'active', f'{cls.__name__}.from_DB_supplier') - - return address - def __repr__(self): - return f''' -{self.ATTR_ID_ADDRESS}: {self.id_address} -{self.ATTR_ID_SUPPLIER}: {self.id_supplier} -{self.FLAG_REGION}: {self.region} -{self.FLAG_POSTCODE}: {self.postcode} -{self.FLAG_ADDRESS_LINE_1}: {self.address_line_1} -{self.FLAG_ADDRESS_LINE_2}: {self.address_line_2} -{self.FLAG_CITY}: {self.city} -{self.FLAG_COUNTY}: {self.county} -{self.FLAG_ACTIVE}: {self.active} - ''' - def to_json(self): - Helper_App.console_log(f'{self.__class__.__name__}.to_json\n{self.__dict__}\n{self}') - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_ADDRESS: self.id_address, - self.ATTR_ID_SUPPLIER: self.id_supplier, - self.FLAG_REGION: self.region.to_json(), - self.FLAG_POSTCODE: self.postcode, - self.FLAG_ADDRESS_LINE_1: self.address_line_1, - self.FLAG_ADDRESS_LINE_2: self.address_line_2, - self.FLAG_CITY: self.city, - self.FLAG_COUNTY: self.county, - self.FLAG_ACTIVE: 1 if av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0 - } - def to_json_str(self): - return jsonify(self.to_json()) - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - address = cls() - address.id_address = json[cls.ATTR_ID_ADDRESS] - address.id_supplier = json[cls.ATTR_ID_SUPPLIER] - address.id_region = json[cls.ATTR_ID_REGION] - address.region = Region() - address.region.id_region = json[cls.ATTR_ID_REGION] - address.postcode = json[cls.FLAG_POSTCODE] - address.address_line_1 = json[cls.FLAG_ADDRESS_LINE_1] - address.address_line_2 = json.get(cls.FLAG_ADDRESS_LINE_2, '') - address.city = json[cls.FLAG_CITY] - address.county = json[cls.FLAG_COUNTY] - address.active = json[cls.FLAG_ACTIVE] - return address - - -class Supplier_Address_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Supplier_Address_Temp' - __table_args__ = { 'extend_existing': True } - id_address: int = db.Column(db.Integer, primary_key=True) - id_supplier: int = db.Column(db.Integer) - id_region: int = db.Column(db.Integer) - postcode: str = db.Column(db.String(20)) - address_line_1: str = db.Column(db.String(256)) - address_line_2: str = db.Column(db.String(256)) - city: str = db.Column(db.String(256)) - county: str = db.Column(db.String(256)) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - @classmethod - def from_supplier_address(cls, address): - row = cls() - row.id_address = address.id_address - row.id_supplier = address.id_supplier - row.id_region = address.id_region - row.postcode = address.postcode - row.address_line_1 = address.address_line_1 - row.address_line_2 = address.address_line_2 - row.city = address.city - row.county = address.county - row.active = 1 if address.active else 0 - return row - def __repr__(self): - return f''' -id_address: {self.id_address} -id_supplier: {self.id_supplier} -id_region: {self.id_region} -postcode: {self.postcode} -address_line_1: {self.address_line_1} -address_line_2: {self.address_line_2} -city: {self.city} -county: {self.county} -active: {self.active} -guid: {self.guid} - ''' \ No newline at end of file diff --git a/business_objects/store/supplier_purchase_order.py b/business_objects/store/supplier_purchase_order.py deleted file mode 100644 index 24bda6aa..00000000 --- a/business_objects/store/supplier_purchase_order.py +++ /dev/null @@ -1,343 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Business Objects -Feature: Supplier_Purchase_Order Business Object - -Description: -Business object for supplier_purchase_order -""" - -# internal -import lib.argument_validation as av -from business_objects.currency import Currency -from business_objects.db_base import Get_Many_Parameters_Base -from business_objects.store.store_base import Store_Base -from business_objects.store.supplier import Supplier -from extensions import db -from helpers.helper_app import Helper_App -# external -from pydantic import BaseModel -from typing import ClassVar, Optional -from datetime import datetime - -class Supplier_Purchase_Order(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_PURCHASE_ORDER - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - __tablename__ = 'Shop_Supplier_Purchase_Order' - id_order = db.Column(db.Integer, primary_key=True) - id_supplier = db.Column(db.Integer) - id_currency = db.Column(db.Integer) - cost_total_local_VAT_excl = db.Column(db.Float) - cost_total_local_VAT_incl = db.Column(db.Float) - active = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - name = db.Column(db.String(255)) - # items: list = None - def __init__(self): - super().__init__() - Store_Base.__init__(self) - self.currency = None - self.items = [] - self.supplier = None - @classmethod - def from_DB_supplier_purchase_order(cls, query_row): - supplier_purchase_order = cls() - supplier_purchase_order.id_order = query_row[0] - supplier_purchase_order.id_supplier = query_row[1] - supplier_purchase_order.supplier = Supplier.from_DB_supplier_purchase_order(query_row) - supplier_purchase_order.id_currency = query_row[3] - supplier_purchase_order.currency = Currency.from_DB_supplier_purchase_order(query_row) - supplier_purchase_order.cost_total_local_VAT_excl = query_row[6] - supplier_purchase_order.cost_total_local_VAT_incl = query_row[7] - supplier_purchase_order.active = av.input_bool(query_row[8], 'active', f'{cls.__name__}.from_DB_supplier_purchase_order') - supplier_purchase_order.created_on = query_row[9] - supplier_purchase_order.name = query_row[10] - return supplier_purchase_order - - def __repr__(self): - return f''' -{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER}: {self.id_order}, -{self.ATTR_ID_SUPPLIER}: {self.id_supplier}, -{self.FLAG_SUPPLIER}: {self.supplier}, -{self.ATTR_ID_CURRENCY}: {self.id_currency}, -{self.FLAG_CURRENCY}: {self.currency}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, -{self.FLAG_ACTIVE}: {self.active}, -{self.FLAG_CREATED_ON}: {self.created_on}, -{self.FLAG_NAME}: {self.name} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_SUPPLIER_PURCHASE_ORDER: self.id_order, - self.ATTR_ID_SUPPLIER: self.id_supplier, - self.FLAG_SUPPLIER: self.supplier.to_json(), - self.ATTR_ID_CURRENCY: self.id_currency, - self.FLAG_CURRENCY: self.currency.to_json(), - self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, - self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, - self.FLAG_ORDER_ITEMS: [item.to_json() for item in self.items], - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - self.FLAG_CREATED_ON: self.created_on, - self.FLAG_NAME: self.name, - } - def to_json_option(self): - return { - 'value': self.id_order, - 'text': self.name, - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - supplier_purchase_order = cls() - supplier_purchase_order.id_order = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER] - supplier_purchase_order.id_supplier = json[cls.ATTR_ID_SUPPLIER] - supplier_purchase_order.id_currency = json[cls.ATTR_ID_CURRENCY] - supplier_purchase_order.cost_total_local_VAT_excl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL] - supplier_purchase_order.cost_total_local_VAT_incl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL] - supplier_purchase_order.items = [Supplier_Purchase_Order_Product_Link.from_json(item) for item in json[cls.FLAG_ORDER_ITEMS]] - supplier_purchase_order.active = json[cls.FLAG_ACTIVE] - supplier_purchase_order.created_on = json.get(cls.FLAG_CREATED_ON, None) - supplier_purchase_order.created_by = json.get(cls.FLAG_CREATED_BY, None) - supplier_purchase_order.name = json.get(cls.FLAG_NAME, None) - return supplier_purchase_order - -class Supplier_Purchase_Order_Product_Link(db.Model, Store_Base): - NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK - NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME - __tablename__ = 'Shop_Supplier_Purchase_Order_Product_Link' - id_link = db.Column(db.Integer, primary_key=True) - id_order = db.Column(db.Integer) - id_category = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - csv_id_pairs_variation = db.Column(db.String) - id_unit_quantity = db.Column(db.Integer) - name_permutation = db.Column(db.String(255)) - quantity_ordered = db.Column(db.Float) - quantity_received = db.Column(db.Float) - latency_delivery_days = db.Column(db.Integer) - display_order = db.Column(db.Integer) - cost_total_local_VAT_excl = db.Column(db.Float) - cost_total_local_VAT_incl = db.Column(db.Float) - cost_unit_local_VAT_excl = db.Column(db.Float) - cost_unit_local_VAT_incl = db.Column(db.Float) - active = db.Column(db.Boolean) - created_on = db.Column(db.DateTime) - created_by = db.Column(db.Integer) - def __init__(self): - super().__init__() - Store_Base.__init__(self) - # self.unit_quantity = None - @classmethod - def from_DB_supplier_purchase_order(cls, query_row): - link = cls() - link.id_link = query_row[0] - link.id_order = query_row[1] - link.id_category = query_row[2] - link.id_product = query_row[3] - link.id_permutation = query_row[4] - link.name_permutation = query_row[5] - link.csv_id_pairs_variation = query_row[6] - link.id_unit_quantity = query_row[7] - link.quantity_ordered = query_row[8] - link.quantity_received = query_row[9] - link.latency_delivery_days = query_row[10] - link.display_order = query_row[11] - link.cost_total_local_VAT_excl = query_row[12] - link.cost_total_local_VAT_incl = query_row[13] - link.cost_unit_local_VAT_excl = query_row[14] - link.cost_unit_local_VAT_incl = query_row[15] - link.active = query_row[16] - return link - def __repr__(self): - return f''' -{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK}: {self.id_link}, -{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER}: {self.id_order}, -{self.ATTR_ID_PRODUCT_CATEGORY}: {self.id_category}, -{self.ATTR_ID_PRODUCT}: {self.id_product}, -{self.ATTR_ID_PRODUCT_PERMUTATION}: {self.id_permutation}, -{self.FLAG_NAME}: {self.name_permutation}, -{self.FLAG_PRODUCT_VARIATIONS}: {self.csv_id_pairs_variation}, -{self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY}: {self.id_unit_quantity}, -{self.FLAG_QUANTITY_ORDERED}: {self.quantity_ordered}, -{self.FLAG_QUANTITY_RECEIVED}: {self.quantity_received}, -{self.FLAG_LATENCY_DELIVERY_DAYS}: {self.latency_delivery_days}, -{self.FLAG_DISPLAY_ORDER}: {self.display_order}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, -{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, -{self.FLAG_COST_UNIT_LOCAL_VAT_EXCL}: {self.cost_unit_local_VAT_excl}, -{self.FLAG_COST_UNIT_LOCAL_VAT_INCL}: {self.cost_unit_local_VAT_incl}, -{self.FLAG_ACTIVE}: {self.active} - ''' - def to_json(self): - return { - **self.get_shared_json_attributes(self), - self.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK: self.id_link, - self.ATTR_ID_SUPPLIER_PURCHASE_ORDER: self.id_order, - self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, - self.ATTR_ID_PRODUCT: self.id_product, - self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, - self.FLAG_NAME: self.name_permutation, - self.FLAG_PRODUCT_VARIATIONS: self.csv_id_pairs_variation, - self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY: self.id_unit_quantity, - self.FLAG_QUANTITY_ORDERED: self.quantity_ordered, - self.FLAG_QUANTITY_RECEIVED: self.quantity_received, - self.FLAG_LATENCY_DELIVERY_DAYS: self.latency_delivery_days, - self.FLAG_DISPLAY_ORDER: self.display_order, - self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, - self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, - self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_unit_local_VAT_excl, - self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_unit_local_VAT_incl, - self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - } - def to_json_option(self): - return { - 'value': self.id_order, - 'text': self.name_permutation, - } - @classmethod - def from_json(cls, json): - Helper_App.console_log(f'{cls.__name__}.from_json: {json}') - link = cls() - link.id_link = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK] - link.id_order = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER] - link.id_category = json.get(cls.ATTR_ID_PRODUCT_CATEGORY, None) - link.id_product = json.get(cls.ATTR_ID_PRODUCT, None) - link.id_permutation = json.get(cls.ATTR_ID_PRODUCT_PERMUTATION, None) - link.name_permutation = json.get(cls.FLAG_NAME, None) - link.csv_id_pairs_variation = json.get(cls.FLAG_PRODUCT_VARIATIONS, '') - link.id_unit_quantity = json[cls.ATTR_ID_UNIT_MEASUREMENT_QUANTITY] - link.quantity_ordered = json[cls.FLAG_QUANTITY_ORDERED] - link.quantity_received = json[cls.FLAG_QUANTITY_RECEIVED] - link.latency_delivery_days = json[cls.FLAG_LATENCY_DELIVERY_DAYS] - link.display_order = json[cls.FLAG_DISPLAY_ORDER] - link.cost_total_local_VAT_excl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL] - link.cost_total_local_VAT_incl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL] - link.cost_unit_local_VAT_excl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL, None) - link.cost_unit_local_VAT_incl = json.get(cls.FLAG_COST_UNIT_LOCAL_VAT_INCL, None) - link.active = json[cls.FLAG_ACTIVE] - return link - -class Parameters_Supplier_Purchase_Order(Get_Many_Parameters_Base): - a_get_all_supplier: bool - a_get_inactive_supplier: bool - a_ids_supplier: str - a_get_all_order: bool - a_get_inactive_order: bool - a_ids_order: str - a_ids_permutation: str - a_date_from: Optional[datetime] - a_date_to: Optional[datetime] - def __init__(self, **kwargs): - super().__init__(**kwargs) - @classmethod - def get_default(cls): - return cls( - a_get_all_supplier = True, - a_get_inactive_supplier = False, - a_ids_supplier = '', - a_get_all_order = True, - a_get_inactive_order = False, - a_ids_order = '', - a_ids_permutation = '', - a_date_from = None, - a_date_to = None - ) - @classmethod - def from_filters_supplier_purchase_order(cls, form): - parameters = cls.get_default() - parameters.a_get_inactive_order = form.active.data - parameters.a_date_from = None if form.date_from.data == '' else form.date_from.data - parameters.a_date_to = None if form.date_to.data == '' else form.date_to.data - return parameters - -class Supplier_Purchase_Order_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Supplier_Purchase_Order_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_order: int = db.Column(db.Integer) - id_supplier_ordered: int = db.Column(db.Integer) - id_currency_cost: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - guid: str = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_supplier_purchase_order(cls, supplier_purchase_order): - row = cls() - row.id_order = supplier_purchase_order.id_order - row.id_supplier_ordered = supplier_purchase_order.id_supplier - row.id_currency_cost = supplier_purchase_order.id_currency - row.active = 1 if supplier_purchase_order.active else 0 - return row - def __repr__(self): - return f''' -id_order: {self.id_order} -id_supplier_ordered: {self.id_supplier_ordered} -id_currency_cost: {self.id_currency_cost} -active: {self.active} -guid: {self.guid} - ''' - -class Supplier_Purchase_Order_Product_Link_Temp(db.Model, Store_Base): - __tablename__: ClassVar[str] = 'Shop_Supplier_Purchase_Order_Product_Link_Temp' - __table_args__ = { 'extend_existing': True } - id_temp: int = db.Column(db.Integer, primary_key=True, autoincrement=True) - id_link = db.Column(db.Integer) - id_order = db.Column(db.Integer) - id_product = db.Column(db.Integer) - id_permutation = db.Column(db.Integer) - csv_list_variations = db.Column(db.String) - id_unit_quantity = db.Column(db.Integer) - quantity_ordered = db.Column(db.Float) - quantity_received = db.Column(db.Float) - latency_delivery_days = db.Column(db.Integer) - display_order = db.Column(db.Integer) - cost_total_local_VAT_excl = db.Column(db.Float) - cost_total_local_VAT_incl = db.Column(db.Float) - active = db.Column(db.Boolean) - guid = db.Column(db.String(36)) - def __init__(self): - super().__init__() - self.id_temp = None - @classmethod - def from_supplier_purchase_order_product_link(cls, supplier_purchase_order_product_link): - row = cls() - row.id_link = supplier_purchase_order_product_link.id_link - row.id_order = supplier_purchase_order_product_link.id_order - row.id_product = supplier_purchase_order_product_link.id_product - row.id_permutation = supplier_purchase_order_product_link.id_permutation - row.csv_list_variations = supplier_purchase_order_product_link.csv_id_pairs_variation - row.id_unit_quantity = supplier_purchase_order_product_link.id_unit_quantity - row.quantity_ordered = supplier_purchase_order_product_link.quantity_ordered - row.quantity_received = supplier_purchase_order_product_link.quantity_received - row.latency_delivery_days = supplier_purchase_order_product_link.latency_delivery_days - row.display_order = supplier_purchase_order_product_link.display_order - row.cost_total_local_VAT_excl = supplier_purchase_order_product_link.cost_total_local_VAT_excl - row.cost_total_local_VAT_incl = supplier_purchase_order_product_link.cost_total_local_VAT_incl - row.active = 1 if supplier_purchase_order_product_link.active else 0 - return row - def __repr__(self): - return f''' -id_link: {self.id_link} -id_order: {self.id_order} -id_product: {self.id_product} -id_permutation: {self.id_permutation} -csv_list_variations: {self.csv_list_variations} -id_unit_quantity: {self.id_unit_quantity} -quantity_ordered: {self.quantity_ordered} -quantity_received: {self.quantity_received} -latency_delivery_days: {self.latency_delivery_days} -display_order: {self.display_order} -cost_total_local_VAT_excl: {self.cost_total_local_VAT_excl} -cost_total_local_VAT_incl: {self.cost_total_local_VAT_incl} -active: {self.active} -guid: {self.guid} - ''' \ No newline at end of file diff --git a/controllers/core.py b/controllers/core.py index a654d981..009ab5e5 100644 --- a/controllers/core.py +++ b/controllers/core.py @@ -13,11 +13,9 @@ Initializes the Flask application, sets the configuration based on the environme # IMPORTS # internal from datastores.datastore_base import DataStore_Base -from forms.forms import Form_Contact -from models.model_view_admin_home import Model_View_Admin_Home +from forms.contact import Form_Contact from models.model_view_contact import Model_View_Contact from models.model_view_home import Model_View_Home -from models.model_view_services import Model_View_Services import lib.argument_validation as av # external from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app @@ -44,10 +42,7 @@ def home(): @routes_core.route(Model_View_Contact.HASH_PAGE_CONTACT, methods=['GET']) def contact(): try: - user = DataStore_Base.get_user_session() form = Form_Contact() - form.email.data = user.email - form.name.data = (user.firstname if user.firstname else '') + (' ' if user.firstname and user.surname else '') + (user.surname if user.surname else '') model = Model_View_Contact(form) html_body = render_template('pages/core/_contact.html', model = model) except Exception as e: @@ -62,37 +57,17 @@ def contact_post(): # Handle form submission email = form.email.data CC = form.CC.data # not in use - name = form.name.data + contact_name = form.contact_name.data + company_name = form.company_name.data message = form.message.data + receive_marketing = form.receive_marketing.data + receive_marketing_text = "I would like to receive marketing emails." if receive_marketing else "" # send email mailItem = Message("PARTS Website Contact Us Message", recipients=[current_app.config['MAIL_CONTACT_PUBLIC']]) - mailItem.body = f"Dear Lord Edward Middleton-Smith,\n\n{message}\n\nKind regards,\n{name}\n{email}" + mailItem.body = f"Dear Lord Edward Middleton-Smith,\n\n{message}\n{receive_marketing_text}\nKind regards,\n{contact_name}\n{company_name}\n{email}" mail.send(mailItem) return "Submitted." return "Invalid. Failed to submit." # html_body = render_template('pages/core/_contact.html', model = model) except Exception as e: return jsonify(error=str(e)), 403 - -@routes_core.route(Model_View_Services.HASH_PAGE_SERVICES, methods=['GET', 'POST']) -def services(): - try: - model = Model_View_Services() - html_body = render_template('pages/core/_services.html', model = model) - except Exception as e: - return jsonify(error=str(e)), 403 - return html_body - -@routes_core.route(Model_View_Admin_Home.HASH_PAGE_ADMIN_HOME, methods=['GET', 'POST']) -def admin_home(): - try: - model = Model_View_Admin_Home() - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', callback = Model_View_Admin_Home.HASH_PAGE_ADMIN_HOME)) - return redirect(url_for('routes_core.home')) - if not (model.user.can_admin_store or model.user.can_admin_user): - return redirect(url_for('routes_core.home')) - html_body = render_template('pages/core/_admin_home.html', model = model) - except Exception as e: - return jsonify(error=str(e)), 403 - return html_body diff --git a/controllers/store/__init__.py b/controllers/store/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/controllers/store/__pycache__/__init__.cpython-312.pyc b/controllers/store/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index aa8a0685792d5f015830b36ec7b047579feefb60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmX@j%ge<81dn=|(n0iN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%5k=e2`x@7Dvn7_ zDNihl@y|X# zGKvXs36Ca2KczG$ Y)vkyYXgMPg7lRldnHd=wil&^JRaNh?l` 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 F{(t&I8hro& diff --git a/controllers/store/__pycache__/product_permutation.cpython-312.pyc b/controllers/store/__pycache__/product_permutation.cpython-312.pyc deleted file mode 100644 index 5b4c8733d473fe47a2109864dac57aaf01b7d56c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5446 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 A-2eap diff --git a/controllers/store/__pycache__/store.cpython-312.pyc b/controllers/store/__pycache__/store.cpython-312.pyc deleted file mode 100644 index 934b6cbcba9e04d4a964e2048a7a34800bd9371c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2029 zcmZuy-D?|15Z^mVmVA~hJN}X#$GMc0SdiMqZ77&fTTPTY(8R9grsWVEXWd#p_4ZEL z-Lvc9P(Sn!=v&&SLZ4df=h8nR&=;8)3`;^<+LyjHH6@Uz&YXO>gf3`yX6NH(emk@J zrBE;ktnbx8lV%9{9ff42Pnnayfq6t+Vi8w!bzft;rEAEi{1i)DX_m1vtjFqMSu4wO zR*v;rz09x-)@Svxyp?AKtHAoLepa-Kv0vIBV1w2mJ7=AX<%~bXhOJ>XVvWRdk3Y)B ztg)ES`Xx4QjmLZr>?W)UcHTPACap=0=!6#BUV33)@8)Vv(W%x#Qoz|x_15BU_kaph zZc_7>?}*P$r``6whJz+oO+jT>*9e0RuNm?9++24AbxlYW-Dt4o@i1UCkXKCya(C&5 z7hufo(BzO3u+y`#X4Y8;xeRWOG&v1i%1tP#?K^0+4UohUMH`^l@Zb~DlRgzQ#-E6M zSyKadLYMmXJ&$hNab@Ma%EWoAVmF?h#8cUp2m^0pM`by^A5kII=xZjnkR0$*LjqE< zH+aZw*Mn;S$aYkY)2^Vh5%=wlkgKeq0&ht5e&9#64Zc$KH6jjSr46{L99&yF3)CUl?)Krrq{p`>=(kA&)la5QK@Ay80e8QTOHBW9|chrFCpnb=vy4KsxuTIYFYYk0Bn7{dpMX3f5@>g|PUj(!ac`mZYs=MS zPjb}CCEVFAB_9kFS*ohG$Uu?9f1&}2^JOO=*8Z2*#AfDjLcTVhtg{lOgpg8_G`YhVv}XODCnCo;Ycg`Z(42dFZmu4`GB&(2bttC}gDH9F`xr5< zxJzf+J8Gm`p0H0L>9!1?hD;{lCsu&$kv~cozsrA{KQ2ulmZm%9>qkqU9WRN)C2_R- zWv4WKLdbYU@1#eb<|jL|i%0p&UiE2ls&nz$&(Tq_y0`SSZ|Li#&Xt9uzQs;@5zGm> zTYf`jZQBhSwynlu?8QvH*;_cdah_dVGaLBmaQrjrLWm6)UjfI4#M3;Cj_<9{#B;;X;rS4rU&4t*1q?3*nB!iViL{YS#f$X@~SDt8?qiG2D# ze-}g?6Cr^7mC`irg>Go+e7m@ zeKYk#=}B>JFaN7nIM#*^wV}@N<>TRn!{LR;Z$2LDXhTo5k6-9%t)iWzh`tKnK|W6E EUm#38fdBvi diff --git a/controllers/store/__pycache__/supplier.cpython-312.pyc b/controllers/store/__pycache__/supplier.cpython-312.pyc deleted file mode 100644 index 26a0326bbcd9f6903bc3e1f83432a6b85ad0a2f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5257 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 UEq|#@(Zg^y!F?7$d>*9#FFyR_jQ{`u diff --git a/controllers/store/manufacturing_purchase_order.py b/controllers/store/manufacturing_purchase_order.py deleted file mode 100644 index 39c0cd17..00000000 --- a/controllers/store/manufacturing_purchase_order.py +++ /dev/null @@ -1,82 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Manufacturing_Purchase_Order Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order -from forms.store.manufacturing_purchase_order import Filters_Manufacturing_Purchase_Order -from models.model_view_store_manufacturing_purchase_order import Model_View_Store_Manufacturing_Purchase_Order -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from datetime import datetime -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs -import requests - -routes_store_manufacturing_purchase_order = Blueprint('routes_store_manufacturing_purchase_order', __name__) - -@routes_store_manufacturing_purchase_order.route(Model_View_Store_Manufacturing_Purchase_Order.HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS, methods=['GET']) -def manufacturing_purchase_orders(): - Helper_App.console_log('manufacturing_purchase_orders') - try: - form_filters = Filters_Manufacturing_Purchase_Order.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Manufacturing_Purchase_Order() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Manufacturing_Purchase_Order(form_filters) - if not model.is_user_logged_in: - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_manufacturing_purchase_orders.html', model = model, datetime = datetime) - - -@routes_store_manufacturing_purchase_order.route(Model_View_Store_Manufacturing_Purchase_Order.HASH_SAVE_STORE_MANUFACTURING_PURCHASE_ORDER, methods=['POST']) -def save_manufacturing_purchase_order(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Manufacturing_Purchase_Order.from_json(data[Model_View_Store_Manufacturing_Purchase_Order.FLAG_FORM_FILTERS]) - Helper_App.console_log(f'form_filters: {form_filters}') - - manufacturing_purchase_orders = data[Model_View_Store_Manufacturing_Purchase_Order.FLAG_MANUFACTURING_PURCHASE_ORDER] - if len(manufacturing_purchase_orders) == 0: - return jsonify({ - Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'No stock items.' - }) - Helper_App.console_log(f'manufacturing_purchase_orders={manufacturing_purchase_orders}') - objs_manufacturing_purchase_order = [] - for manufacturing_purchase_order in manufacturing_purchase_orders: - objs_manufacturing_purchase_order.append(Manufacturing_Purchase_Order.from_json(manufacturing_purchase_order)) - Helper_App.console_log(f'objs_manufacturing_purchase_order={objs_manufacturing_purchase_order}') - save_errors = Model_View_Store_Manufacturing_Purchase_Order.save_manufacturing_purchase_orders(data.get('comment', 'No comment'), objs_manufacturing_purchase_order) - if len(save_errors) > 0: - return jsonify({ - Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Save errors: {save_errors}' - }) - model_return = Model_View_Store_Manufacturing_Purchase_Order(form_filters_old = form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in.') - return jsonify({ - Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_SUCCESS, - Model_View_Store_Manufacturing_Purchase_Order.FLAG_DATA: model_return.convert_list_objects_to_json(model_return.manufacturing_purchase_orders) - }) - except Exception as e: - return jsonify({ - Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/pay_stripe.py b/controllers/store/pay_stripe.py deleted file mode 100644 index 9ae08d65..00000000 --- a/controllers/store/pay_stripe.py +++ /dev/null @@ -1,167 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App General -Feature: App - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# IMPORTS -from helpers.helper_app import Helper_App -import os -import stripe -import json -from flask import Flask, render_template, render_template_string, jsonify, request, send_from_directory, redirect -from dotenv import load_dotenv, find_dotenv - - -# VARIABLE INSTANTIATION -key_secret = os.environ.get("KEY_SECRET_STRIPE") -key_public = os.environ.get("KEY_PUBLIC_STRIPE") # 'pk_test_51OGrxlL7BuLKjoMpfpfw7bSmZZK1MhqMoQ5VhW2jUj7YtoEejO4vqnxKPiqTHHuh9U4qqkywbPCSI9TpFKtr4SYH007KHMWs68' - -# METHODS -def create_product_price(): - Helper_App.console_log(f'stripe.api_key = {stripe.api_key}') - starter_subscription = stripe.Product.create( - name="Starter Subscription", - description="$12/Month subscription", - ) - - starter_subscription_price = stripe.Price.create( - unit_amount=1200, - currency="usd", - recurring={"interval": "month"}, - product=starter_subscription['id'], - ) - - # Save these identifiers - Helper_App.console_log(f"Success! Here is your starter subscription product id: {starter_subscription.id}") - Helper_App.console_log(f"Success! Here is your starter subscription price id: {starter_subscription_price.id}") - - return starter_subscription_price.id - -def get_file_str(f_address): - f = open(f_address) - return f.read() - -# Ensure environment variables are set. -price = os.getenv('PRICE') -if price is None or price == 'price_12345' or price == '': - Helper_App.console_log('You must set a Price ID in .env. Please see the README.') - exit(0) - -# For sample support and debugging, not required for production: -stripe.set_app_info( - 'stripe-samples/checkout-one-time-payments', - version='0.0.1', - url='https://github.com/stripe-samples/checkout-one-time-payments') - -# stripe.api_version = '2020-08-27' -stripe.api_key = key_secret # os.getenv('KEY_SECRET_STRIPE') - -app_dir = str(os.path.abspath(os.path.join( - __file__, "..", ".."))) -static_dir = str(os.path.abspath(os.path.join( - app_dir, os.getenv("STATIC_DIR")))) -app = Flask(__name__, static_folder=static_dir, - static_url_path="", template_folder=static_dir) - - -@app.route('/', methods=['GET']) -def get_example(): - # return render_template(f'{app_dir}\\templates\\_home.html') # f'{app_dir}\\templates\\layout.html') - # return render_template_string(get_file_str(f'{app_dir}\\templates\\_home.html')) # f'{app_dir}\\templates\\layout.html') - return render_template('../templates/_home.html') - - -@app.route('/config', methods=['GET']) -def get_publishable_key(): - price = stripe.Price.retrieve(os.getenv('PRICE')) - return jsonify({ - 'publicKey': key_public, # os.getenv('KEY_PUBLIC_STRIPE'), - 'unitAmount': price['unit_amount'], - 'currency': price['currency'] - }) - -# Fetch the Checkout Session to display the JSON result on the success page -@app.route('/checkout-session', methods=['GET']) -def get_checkout_session(): - id = request.args.get('sessionId') - checkout_session = stripe.checkout.Session.retrieve(id) - return jsonify(checkout_session) - - -@app.route('/create-checkout-session', methods=['POST']) -def create_checkout_session(): - quantity = request.form.get('quantity', 1) - domain_url = os.getenv('DOMAIN') - - try: - # Create new Checkout Session for the order - # Other optional params include: - # [billing_address_collection] - to display billing address details on the page - # [customer] - if you have an existing Stripe Customer ID - # [payment_intent_data] - lets capture the payment later - # [customer_email] - lets you prefill the email input in the form - # [automatic_tax] - to automatically calculate sales tax, VAT and GST in the checkout page - # For full details see https://stripe.com/docs/api/checkout/sessions/create - - # ?session_id={CHECKOUT_SESSION_ID} means the redirect will have the session ID set as a query param - checkout_session = stripe.checkout.Session.create( - success_url=domain_url + '/success.html?session_id={CHECKOUT_SESSION_ID}', - cancel_url=domain_url + '/canceled.html', - mode='payment', - # automatic_tax={'enabled': True}, - line_items=[{ - 'price': os.getenv('PRICE'), - 'quantity': quantity, - }] - ) - return redirect(checkout_session.url, code=303) - except Exception as e: - return jsonify(error=str(e)), 403 - - -@app.route('/webhook', methods=['POST']) -def webhook_received(): - # You can use webhooks to receive information about asynchronous payment events. - # For more about our webhook events check out https://stripe.com/docs/webhooks. - webhook_secret = os.getenv('STRIPE_WEBHOOK_SECRET') - request_data = json.loads(request.data) - - if webhook_secret: - # Retrieve the event by verifying the signature using the raw body and secret if webhook signing is configured. - signature = request.headers.get('stripe-signature') - try: - event = stripe.Webhook.construct_event( - payload=request.data, sig_header=signature, secret=webhook_secret) - data = event['data'] - except Exception as e: - return e - # Get the type of webhook event sent - used to check the status of PaymentIntents. - event_type = event['type'] - else: - data = request_data['data'] - event_type = request_data['type'] - data_object = data['object'] - - Helper_App.console_log('event ' + event_type) - - if event_type == 'checkout.session.completed': - Helper_App.console_log('🔔 Payment succeeded!') - - return jsonify({Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_SUCCESS}) - - -if __name__ == '__main__': - # stripe.api_key = key_secret - - # create_product_price() - - # Setup Stripe python client library. - load_dotenv(find_dotenv()) - app.run(port=4242, debug=True) \ No newline at end of file diff --git a/controllers/store/product.py b/controllers/store/product.py deleted file mode 100644 index 7d29403f..00000000 --- a/controllers/store/product.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Product Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.product import Product, Parameters_Product -from datastores.datastore_store_product import DataStore_Store_Product -from forms.store.product import Filters_Product -from models.model_view_store_product import Model_View_Store_Product -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs - - -routes_store_product = Blueprint('routes_store_product', __name__) - -@routes_store_product.route(Model_View_Store_Product.HASH_PAGE_STORE_PRODUCTS, methods=['GET']) -def products(): - Helper_App.console_log('products') - try: - form_filters = Filters_Product.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Product() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Product(form_filters) - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', data = jsonify({ Model_View_Store_Product.FLAG_CALLBACK: Model_View_Store_Product.HASH_PAGE_STORE_PRODUCTS }))) - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_products.html', model = model) - - -@routes_store_product.route(Model_View_Store_Product.HASH_SAVE_STORE_PRODUCT, methods=['POST']) -def save_product(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Product.from_json(data[Model_View_Store_Product.FLAG_FORM_FILTERS]) - if not form_filters.validate_on_submit(): - return jsonify({ - Model_View_Store_Product.FLAG_STATUS: Model_View_Store_Product.FLAG_FAILURE, - Model_View_Store_Product.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}' - }) - # filters_form = Filters_Product.from_form(form_filters) - Helper_App.console_log(f'form_filters: {form_filters}') - - products = data[Model_View_Store_Product.FLAG_PRODUCT] - if len(products) == 0: - return jsonify({ - Model_View_Store_Product.FLAG_STATUS: Model_View_Store_Product.FLAG_FAILURE, - Model_View_Store_Product.FLAG_MESSAGE: f'No products.' - }) - objsProduct = [] - for product in products: - objsProduct.append(Product.from_json(product)) - # model_save = Model_View_Store_Product() # filters_product=filters_form) - Helper_App.console_log(f'objsProduct={objsProduct}') - save_errors = Model_View_Store_Product.save_products(data.get('comment', 'No comment'), objsProduct) - - model_return = Model_View_Store_Product(form_filters_old=form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in') - Helper_App.console_log('nips') - return jsonify({ - Model_View_Store_Product.FLAG_STATUS: Model_View_Store_Product.FLAG_SUCCESS, - Model_View_Store_Product.FLAG_DATA: model_return.category_list.to_json() - }) - except Exception as e: - return jsonify({ - Model_View_Store_Product.FLAG_STATUS: Model_View_Store_Product.FLAG_FAILURE, - Model_View_Store_Product.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/product_category.py b/controllers/store/product_category.py deleted file mode 100644 index 2dc443b6..00000000 --- a/controllers/store/product_category.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Product Category Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.product_category import Product_Category #, Filters_Product_Category -from forms.store.product_category import Filters_Product_Category -from models.model_view_store_product_category import Model_View_Store_Product_Category -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs - - -routes_store_product_category = Blueprint('routes_store_product_category', __name__) - - -@routes_store_product_category.route(Model_View_Store_Product_Category.HASH_PAGE_STORE_PRODUCT_CATEGORIES, methods=['GET']) -def categories(): - Helper_App.console_log('categories') - # data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Product_Category.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Product_Category() - Helper_App.console_log(f'form_filters={form_filters}') - """ - filters = Filters_Product_Category.get_default() - have_changed_filters = False - arg_filter_is_not_empty = request.args.get(Model_View_Store_Product_Category.FLAG_IS_NOT_EMPTY, None) - have_changed_filters = have_changed_filters or arg_filter_is_not_empty is None - Helper_App.console_log(f'arg_filter_is_not_empty={arg_filter_is_not_empty}') - filters.is_not_empty = filters.is_not_empty if arg_filter_is_not_empty is None else av.input_bool(arg_filter_is_not_empty, 'is_not_empty', 'filter_category') - arg_filter_active = request.args.get(Model_View_Store_Product_Category.FLAG_ACTIVE, None) - have_changed_filters = have_changed_filters or arg_filter_active is None - Helper_App.console_log(f'arg_filter_active={arg_filter_active}') - filters.active = filters.active if arg_filter_active is None else av.input_bool(arg_filter_active, 'active', 'filter_category') - if have_changed_filters: - Helper_App.console_log('redirecting') - return redirect(url_for('routes_store_product_category.categories', **filters.to_json())) - """ - model = Model_View_Store_Product_Category(form_filters) - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', data = jsonify({ Model_View_Store_Product_Category.FLAG_CALLBACK: Model_View_Store_Product_Category.HASH_PAGE_STORE_PRODUCT_CATEGORIES }))) - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_product_categories.html', model = model) - -@routes_store_product_category.route(Model_View_Store_Product_Category.HASH_SAVE_STORE_PRODUCT_CATEGORY, methods=['POST']) -def save_category(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Product_Category.from_json(data[Model_View_Store_Product_Category.FLAG_FORM_FILTERS]) - if not form_filters.validate_on_submit(): - return jsonify({ - Model_View_Store_Product_Category.FLAG_STATUS: Model_View_Store_Product_Category.FLAG_FAILURE, - Model_View_Store_Product_Category.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}' - }) - # filters_form = Filters_Product_Category.from_form(form_filters) - - categories = data[Model_View_Store_Product_Category.FLAG_PRODUCT_CATEGORY] - if len(categories) == 0: - return jsonify({ - Model_View_Store_Product_Category.FLAG_STATUS: Model_View_Store_Product_Category.FLAG_FAILURE, - Model_View_Store_Product_Category.FLAG_MESSAGE: f'No categories.' - }) - objsCategory = [] - for category in categories: - objsCategory.append(Product_Category.from_json(category)) - # model_save = Model_View_Store_Product_Category() # filters_product=filters_form) - Helper_App.console_log(f'objsCategory={objsCategory}') - errors = Model_View_Store_Product_Category.save_categories(data.get('comment', 'No comment'), objsCategory) - - model_return = Model_View_Store_Product_Category(form_filters_old=form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in') - if (len(errors) > 0): - return jsonify({ - Model_View_Store_Product_Category.FLAG_STATUS: Model_View_Store_Product_Category.FLAG_FAILURE, - Model_View_Store_Product_Category.FLAG_MESSAGE: f'Error saving categories.\n{model_return.convert_list_objects_to_json(errors)}' - }) - return jsonify({ - Model_View_Store_Product_Category.FLAG_STATUS: Model_View_Store_Product_Category.FLAG_SUCCESS, - Model_View_Store_Product_Category.FLAG_DATA: model_return.category_list.to_json() - }) - except Exception as e: - return jsonify({ - Model_View_Store_Product_Category.FLAG_STATUS: Model_View_Store_Product_Category.FLAG_FAILURE, - Model_View_Store_Product_Category.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/product_permutation.py b/controllers/store/product_permutation.py deleted file mode 100644 index 65448ba1..00000000 --- a/controllers/store/product_permutation.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Product Permutation Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - - -# internal -from business_objects.store.product import Parameters_Product, Product_Permutation -from forms.store.product_permutation import Filters_Product_Permutation -from models.model_view_base import Model_View_Base -from models.model_view_store import Model_View_Store -from models.model_view_store_product_permutation import Model_View_Store_Product_Permutation -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs - - -routes_store_product_permutation = Blueprint('routes_store_product_permutation', __name__) - -@routes_store_product_permutation.route(Model_View_Store_Product_Permutation.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS, methods=['GET']) -def permutations(): - Helper_App.console_log('permutations') - data = request.args - # Helper_App.console_log(f'data={data}\nrequest.args={request.args}\nrequest.form={request.form}\nrequest.data={request.data}\nrequest.values={request.values}\nrequest.headers={request.headers}') - try: - form_filters = Filters_Product_Permutation.from_json(data) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Product_Permutation() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Product_Permutation(form_filters) - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', data = jsonify({ Model_View_Store_Product_Permutation.FLAG_CALLBACK: Model_View_Store_Product_Permutation.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS }))) - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_product_permutations.html', model = model) - - -@routes_store_product_permutation.route(Model_View_Store_Product_Permutation.HASH_SAVE_STORE_PRODUCT_PERMUTATION, methods=['POST']) -def save_permutation(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Product_Permutation.from_json(data[Model_View_Store_Product_Permutation.FLAG_FORM_FILTERS]) - if not form_filters.validate_on_submit(): - return jsonify({ - Model_View_Store_Product_Permutation.FLAG_STATUS: Model_View_Store_Product_Permutation.FLAG_FAILURE, - Model_View_Store_Product_Permutation.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}' - }) - # filters_form = Filters_Product_Permutation.from_form(form_filters) - Helper_App.console_log(f'form_filters: {form_filters}') - - permutations = data[Model_View_Store_Product_Permutation.FLAG_PRODUCT_PERMUTATION] - if len(permutations) == 0: - return jsonify({ - Model_View_Store_Product_Permutation.FLAG_STATUS: Model_View_Store_Product_Permutation.FLAG_FAILURE, - Model_View_Store_Product_Permutation.FLAG_MESSAGE: f'No permutations.' - }) - objsPermutation = [] - for permutation in permutations: - objsPermutation.append(Product_Permutation.from_json(permutation)) - # model_save = Model_View_Store_Product_Permutation() # filters_product=filters_form) - Helper_App.console_log(f'objsPermutation={objsPermutation}') - Model_View_Store_Product_Permutation.save_permutations(data.get('comment', 'No comment'), objsPermutation) - - model_return = Model_View_Store_Product_Permutation(form_filters_old=form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in') - Helper_App.console_log('nips') - return jsonify({ - Model_View_Store_Product_Permutation.FLAG_STATUS: Model_View_Store_Product_Permutation.FLAG_SUCCESS, - Model_View_Store_Product_Permutation.FLAG_DATA: model_return.category_list.to_json() - }) - except Exception as e: - return jsonify({ - Model_View_Store_Product_Permutation.FLAG_STATUS: Model_View_Store_Product_Permutation.FLAG_FAILURE, - Model_View_Store_Product_Permutation.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/product_variation.py b/controllers/store/product_variation.py deleted file mode 100644 index 88a8e134..00000000 --- a/controllers/store/product_variation.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Product Variation Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.product_variation import Product_Variation, Parameters_Product_Variation -from business_objects.store.product_variation_type import Product_Variation_Type -from datastores.datastore_store_product_variation import DataStore_Store_Product_Variation -from forms.store.product_variation import Filters_Product_Variation -from models.model_view_store_product_variation import Model_View_Store_Product_Variation -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs - - -routes_store_product_variation = Blueprint('routes_store_product_variation', __name__) - - -@routes_store_product_variation.route(Model_View_Store_Product_Variation.HASH_PAGE_STORE_PRODUCT_VARIATIONS, methods=['GET']) -def product_variations(): - Helper_App.console_log('product_variations') - try: - form_filters = Filters_Product_Variation.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Product_Variation() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Product_Variation(form_filters) - if not model.is_user_logged_in: - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_product_variations.html', model = model) - - -@routes_store_product_variation.route(Model_View_Store_Product_Variation.HASH_SAVE_STORE_PRODUCT_VARIATION, methods=['POST']) -def save_product_variation(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Product_Variation.from_json(data[Model_View_Store_Product_Variation.FLAG_FORM_FILTERS]) - if not form_filters.validate_on_submit(): - return jsonify({ - Model_View_Store_Product_Variation.FLAG_STATUS: Model_View_Store_Product_Variation.FLAG_FAILURE, - Model_View_Store_Product_Variation.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}' - }) - # filters_form = Filters_Product_Variation.from_form(form_filters) - Helper_App.console_log(f'form_filters: {form_filters}') - - product_variation_types = data[Model_View_Store_Product_Variation.FLAG_PRODUCT_VARIATION_TYPE] - if len(product_variation_types) == 0: - return jsonify({ - Model_View_Store_Product_Variation.FLAG_STATUS: Model_View_Store_Product_Variation.FLAG_FAILURE, - Model_View_Store_Product_Variation.FLAG_MESSAGE: f'No Product Variations.' - }) - objs_product_variation_type = [] - for product_variation_type in product_variation_types: - objs_product_variation_type.append(Product_Variation_Type.from_json(product_variation_type)) - # model_save = Model_View_Store_Product_Variation() # filters_product_variation=filters_form) - Helper_App.console_log(f'objs_product_variation_type={objs_product_variation_type}') - save_errors = Model_View_Store_Product_Variation.save_product_variations(data.get('comment', 'No comment'), objs_product_variation_type) - - model_return = Model_View_Store_Product_Variation(form_filters_old = form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in') - Helper_App.console_log('nips') - return jsonify({ - Model_View_Store_Product_Variation.FLAG_STATUS: Model_View_Store_Product_Variation.FLAG_SUCCESS, - Model_View_Store_Product_Variation.FLAG_DATA: model_return.convert_list_objects_to_json(model_return.variation_types) - }) - except Exception as e: - return jsonify({ - Model_View_Store_Product_Variation.FLAG_STATUS: Model_View_Store_Product_Variation.FLAG_FAILURE, - Model_View_Store_Product_Variation.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/stock_item.py b/controllers/store/stock_item.py deleted file mode 100644 index 613347d9..00000000 --- a/controllers/store/stock_item.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Stock Item Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.stock_item import Stock_Item -from forms.store.stock_item import Filters_Stock_Item -from models.model_view_store_stock_item import Model_View_Store_Stock_Item -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from datetime import datetime -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs -import requests - -routes_store_stock_item = Blueprint('routes_store_stock_item', __name__) - -@routes_store_stock_item.route(Model_View_Store_Stock_Item.HASH_PAGE_STORE_STOCK_ITEMS, methods=['GET']) -def stock_items(): - Helper_App.console_log('stock_items') - try: - form_filters = Filters_Stock_Item.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Stock_Item() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Stock_Item(form_filters) - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', data = jsonify({ Model_View_Store_Stock_Item.FLAG_CALLBACK: Model_View_Store_Stock_Item.HASH_PAGE_STORE_STOCK_ITEMS }))) - # return requests.post(f"{current_app.config['URL_HOST']}{url_for('routes_user.login')}", json={ Model_View_Store_Stock_Item.FLAG_CALLBACK: Model_View_Store_Stock_Item.HASH_PAGE_STORE_STOCK_ITEMS }) - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_stock_items.html', model = model, datetime = datetime) - - -@routes_store_stock_item.route(Model_View_Store_Stock_Item.HASH_SAVE_STORE_STOCK_ITEM, methods=['POST']) -def save_stock_item(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Stock_Item.from_json(data[Model_View_Store_Stock_Item.FLAG_FORM_FILTERS]) - """ - if not form_filters.validate_on_submit(): - error_keys = list(form_filters.errors.keys()) - try: - error_keys.remove(Stock_Item.ATTR_ID_PRODUCT_CATEGORY) - "" - if not av.val_int(form_filters.id_product_category.data): - form_filters.errors[Stock_Item.ATTR_ID_PRODUCT_CATEGORY] = ['Invalid category.'] - "" - except: - pass - try: - error_keys.remove(Stock_Item.ATTR_ID_PRODUCT) - except: - pass - if error_keys: - return jsonify({ - Model_View_Store_Stock_Item.FLAG_STATUS: Model_View_Store_Stock_Item.FLAG_FAILURE, - Model_View_Store_Stock_Item.FLAG_MESSAGE: f'Form invalid.\n{form_filters.errors}' - }) - """ - # filters_form = Filters_Stock_Item.from_form(form_filters) - Helper_App.console_log(f'form_filters: {form_filters}') - - stock_items = data[Model_View_Store_Stock_Item.FLAG_STOCK_ITEM] - if len(stock_items) == 0: - return jsonify({ - Model_View_Store_Stock_Item.FLAG_STATUS: Model_View_Store_Stock_Item.FLAG_FAILURE, - Model_View_Store_Stock_Item.FLAG_MESSAGE: f'No stock items.' - }) - Helper_App.console_log(f'stock_items={stock_items}') - objs_stock_item = [] - for stock_item in stock_items: - objs_stock_item.append(Stock_Item.from_json(stock_item)) - # model_save = Model_View_Store_Stock_Item() # filters_product=filters_form) - Helper_App.console_log(f'objs_stock_item={objs_stock_item}') - save_errors = Model_View_Store_Stock_Item.save_stock_items(data.get('comment', 'No comment'), objs_stock_item) - if len(save_errors) > 0: - return jsonify({ - Model_View_Store_Stock_Item.FLAG_STATUS: Model_View_Store_Stock_Item.FLAG_FAILURE, - Model_View_Store_Stock_Item.FLAG_MESSAGE: f'Save errors: {save_errors}' - }) - model_return = Model_View_Store_Stock_Item(filters_stock_item=form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in.') - return jsonify({ - Model_View_Store_Stock_Item.FLAG_STATUS: Model_View_Store_Stock_Item.FLAG_SUCCESS, - Model_View_Store_Stock_Item.FLAG_DATA: model_return.category_list.to_json() - }) - except Exception as e: - return jsonify({ - Model_View_Store_Stock_Item.FLAG_STATUS: Model_View_Store_Stock_Item.FLAG_FAILURE, - Model_View_Store_Stock_Item.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/supplier.py b/controllers/store/supplier.py deleted file mode 100644 index c9a8cb92..00000000 --- a/controllers/store/supplier.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Supplier Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.supplier import Supplier -from forms.store.supplier import Filters_Supplier -from models.model_view_store_supplier import Model_View_Store_Supplier -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from datetime import datetime -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs -import requests - -routes_store_supplier = Blueprint('routes_store_supplier', __name__) - -@routes_store_supplier.route(Model_View_Store_Supplier.HASH_PAGE_STORE_SUPPLIERS, methods=['GET']) -def suppliers(): - Helper_App.console_log('suppliers') - try: - form_filters = Filters_Supplier.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Supplier() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Supplier(form_filters) - if not model.is_user_logged_in: - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_suppliers.html', model = model, datetime = datetime) - - -@routes_store_supplier.route(Model_View_Store_Supplier.HASH_SAVE_STORE_SUPPLIER, methods=['POST']) -def save_supplier(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Supplier.from_json(data[Model_View_Store_Supplier.FLAG_FORM_FILTERS]) - Helper_App.console_log(f'form_filters: {form_filters}') - - suppliers = data[Model_View_Store_Supplier.FLAG_SUPPLIER] - if len(suppliers) == 0: - return jsonify({ - Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, - Model_View_Store_Supplier.FLAG_MESSAGE: f'No stock items.' - }) - Helper_App.console_log(f'suppliers={suppliers}') - objs_supplier = [] - for supplier in suppliers: - objs_supplier.append(Supplier.from_json(supplier)) - Helper_App.console_log(f'objs_supplier={objs_supplier}') - - save_errors = Model_View_Store_Supplier.save_suppliers(data.get('comment', 'No comment'), objs_supplier) - if len(save_errors) > 0: - return jsonify({ - Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, - Model_View_Store_Supplier.FLAG_MESSAGE: f'Save errors: {save_errors}' - }) - model_return = Model_View_Store_Supplier(form_filters_old = form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in.') - return jsonify({ - Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_SUCCESS, - Model_View_Store_Supplier.FLAG_DATA: {supplier.id_supplier: supplier.to_json() for supplier in model_return.suppliers} - }) - except Exception as e: - return jsonify({ - Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, - Model_View_Store_Supplier.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/controllers/store/supplier_purchase_order.py b/controllers/store/supplier_purchase_order.py deleted file mode 100644 index ba9cdc06..00000000 --- a/controllers/store/supplier_purchase_order.py +++ /dev/null @@ -1,82 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: App Routing -Feature: Store Supplier_Purchase_Order Routes - -Description: -Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. -""" - -# internal -from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order -from forms.store.supplier_purchase_order import Filters_Supplier_Purchase_Order -from models.model_view_store_supplier_purchase_order import Model_View_Store_Supplier_Purchase_Order -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from datetime import datetime -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app -from extensions import db, oauth -from urllib.parse import quote_plus, urlencode -from authlib.integrations.flask_client import OAuth -from authlib.integrations.base_client import OAuthError -from urllib.parse import quote, urlparse, parse_qs -import requests - -routes_store_supplier_purchase_order = Blueprint('routes_store_supplier_purchase_order', __name__) - -@routes_store_supplier_purchase_order.route(Model_View_Store_Supplier_Purchase_Order.HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS, methods=['GET']) -def supplier_purchase_orders(): - Helper_App.console_log('supplier_purchase_orders') - try: - form_filters = Filters_Supplier_Purchase_Order.from_json(request.args) - except Exception as e: - Helper_App.console_log(f'Error: {e}') - form_filters = Filters_Supplier_Purchase_Order() - Helper_App.console_log(f'form_filters={form_filters}') - model = Model_View_Store_Supplier_Purchase_Order(form_filters) - if not model.is_user_logged_in: - return redirect(url_for('routes_core.home')) - return render_template('pages/store/_supplier_purchase_orders.html', model = model, datetime = datetime) - - -@routes_store_supplier_purchase_order.route(Model_View_Store_Supplier_Purchase_Order.HASH_SAVE_STORE_SUPPLIER_PURCHASE_ORDER, methods=['POST']) -def save_supplier_purchase_order(): - data = Helper_App.get_request_data(request) - try: - form_filters = Filters_Supplier_Purchase_Order.from_json(data[Model_View_Store_Supplier_Purchase_Order.FLAG_FORM_FILTERS]) - Helper_App.console_log(f'form_filters: {form_filters}') - - supplier_purchase_orders = data[Model_View_Store_Supplier_Purchase_Order.FLAG_SUPPLIER_PURCHASE_ORDER] - if len(supplier_purchase_orders) == 0: - return jsonify({ - Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'No stock items.' - }) - Helper_App.console_log(f'supplier_purchase_orders={supplier_purchase_orders}') - objs_supplier_purchase_order = [] - for supplier_purchase_order in supplier_purchase_orders: - objs_supplier_purchase_order.append(Supplier_Purchase_Order.from_json(supplier_purchase_order)) - Helper_App.console_log(f'objs_supplier_purchase_order={objs_supplier_purchase_order}') - save_errors, save_warnings = Model_View_Store_Supplier_Purchase_Order.save_supplier_purchase_orders(data.get('comment', 'No comment'), objs_supplier_purchase_order) - if len(save_errors) > 0: - return jsonify({ - Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Save errors: {save_errors}' - }) - model_return = Model_View_Store_Supplier_Purchase_Order(form_filters_old = form_filters) - if not model_return.is_user_logged_in: - raise Exception('User not logged in.') - return jsonify({ - Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_SUCCESS, - Model_View_Store_Supplier_Purchase_Order.FLAG_DATA: model_return.convert_list_objects_to_json(model_return.supplier_purchase_orders) - }) - except Exception as e: - return jsonify({ - Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, - Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' - }) - \ No newline at end of file diff --git a/datastores/datastore_base.py b/datastores/datastore_base.py index 2d486680..71d14323 100644 --- a/datastores/datastore_base.py +++ b/datastores/datastore_base.py @@ -13,20 +13,9 @@ Datastore for Store # internal # from routes import bp_home import lib.argument_validation as av -from business_objects.store.access_level import Access_Level -""" -from business_objects.store.basket import Basket, Basket_Item -from business_objects.store.product_category import Product_Category_Container, Product_Category -from business_objects.store.currency import Currency -from business_objects.store.image import Image -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.discount import Discount -from business_objects.store.order import Order -from business_objects.store.product import Product, Product_Permutation, Product_Price, Parameters_Product # Permutation_Variation_Link -""" +from business_objects.access_level import Access_Level from business_objects.region import Region from business_objects.sql_error import SQL_Error -from business_objects.store.stock_item import Stock_Item from business_objects.unit_measurement import Unit_Measurement from business_objects.user import User, Parameters_User, User_Permission_Evaluation # from helpers.helper_db_mysql import Helper_DB_MySQL diff --git a/datastores/datastore_store_basket.py b/datastores/datastore_store_basket.py deleted file mode 100644 index e7731cbb..00000000 --- a/datastores/datastore_store_basket.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Basket DataStore - -Description: -Datastore for Store Baskets -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.store.basket import Basket, Basket_Item -from business_objects.sql_error import SQL_Error -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -# from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - -# db = SQLAlchemy() - - -class DataStore_Store_Basket(DataStore_Store_Base): - # Global constants - KEY_BASKET: ClassVar[str] = Basket.KEY_BASKET - # Attributes - - def __init__(self, **kwargs): - super().__init__(**kwargs) - - def get_metadata_basket(json_request): - try: - basket = json_request[DataStore_Store_Basket.KEY_BASKET] - except KeyError: - basket = {DataStore_Store_Basket.KEY_IS_INCLUDED_VAT: True, DataStore_Store_Basket.KEY_ID_CURRENCY: 1, DataStore_Store_Basket.KEY_ID_REGION_DELIVERY: 1} - is_included_VAT = basket[DataStore_Store_Basket.KEY_IS_INCLUDED_VAT] - id_currency = basket[DataStore_Store_Basket.KEY_ID_CURRENCY] - id_region_delivery = basket[DataStore_Store_Basket.KEY_ID_REGION_DELIVERY] - return id_currency, id_region_delivery, is_included_VAT - - def edit_basket(self, ids_permutation_basket, quantities_permutation_basket, id_permutation_edit, quantity_permutation_edit, sum_not_edit, id_currency, id_region_delivery, is_included_VAT): - # redundant argument validation? - _m = 'DataStore_Store_Base.edit_basket' - Helper_App.console_log(f'{_m}\nstarting...') - # av.val_instance(filters, 'filters', _m, Parameters_Product_Category) - # av.val_str(ids_product_basket, 'ids_product_basket', _m) - av.val_str(ids_permutation_basket, 'ids_permutation_basket', _m) - # av.val_str(quantities_product_basket, 'quantities_product_basket', _m) - av.val_str(quantities_permutation_basket, 'quantities_permutation_basket', _m) - """ - if id_product_edit == 'None': - id_product_edit = None - else: - Helper_App.console_log(f'id_product_edit: {id_product_edit}') - av.val_int(id_product_edit, 'id_product_edit', _m) - """ - if id_permutation_edit == 'None' or str(type(id_permutation_edit)) =="": - id_permutation_edit = None - else: - Helper_App.console_log(f'id_permutation_edit: {id_permutation_edit}') - Helper_App.console_log(str(type(id_permutation_edit))) - av.val_int(id_permutation_edit, 'id_permutation_edit', _m) - if quantity_permutation_edit == 'None' or str(type(quantity_permutation_edit)) =="": - quantity_permutation_edit = None - else: - Helper_App.console_log(f'quantity_permutation_edit: {quantity_permutation_edit}') - av.val_int(quantity_permutation_edit, 'quantity_permutation_edit', _m) - if sum_not_edit == 'None': - sum_not_edit = None - else: - Helper_App.console_log(f'sum_not_edit: {sum_not_edit}') - av.val_bool(sum_not_edit, 'sum_not_edit', _m) - - argument_dict_list = { - 'a_id_user': self.info_user.get('sub'), - # 'a_ids_product_basket': ids_product_basket, - 'a_ids_permutation_basket': ids_permutation_basket, - # 'a_quantities_product_basket': quantities_product_basket, - 'a_quantities_permutation_basket': quantities_permutation_basket, - # 'a_id_product_edit': id_product_edit if id_permutation_edit is None else None, - 'a_id_permutation_edit': id_permutation_edit, - 'a_quantity_permutation_edit': quantity_permutation_edit, - 'a_sum_not_edit': 1 if sum_not_edit else 0, - 'a_id_currency': id_currency, - 'a_id_region_purchase': id_region_delivery - } - - result = self.db_procedure_execute('p_shop_edit_user_basket', argument_dict_list) - Helper_App.console_log('data received') - - cursor = result.cursor - - # categories, category_index = DataStore_Store_Base.input_many_product(cursor) - category_list, errors = DataStore_Store_Base.input_many_product(cursor) - - Helper_App.console_log(f'cursor: {str(cursor)}') - - # Basket - if not cursor.nextset(): - raise Exception("No more query results! Cannot open basket contents") - result_set = cursor.fetchall() - Helper_App.console_log(f'raw basket: {result_set}') - # Helper_App.console_log(f'variations: {result_set_3}') - # variations = [Product_Variation(**row) for row in result_set_3] - basket = Basket(is_included_VAT, id_currency, id_region_delivery) - for row in result_set: - index_category = category_list.get_index_category_from_id(row[0]) - category = category_list.categories[index_category] - index_product = category.get_index_product_from_id(row[1]) - product = category.products[index_product] - basket_item = Basket_Item.from_product_and_quantity_and_VAT_included(product, row[7], self.app.is_included_VAT) - Helper_App.console_log(f'adding basket item: {row}') - Helper_App.console_log(f'basket item: {basket_item}') - basket.add_item(basket_item) # basket.append(basket_item) # Basket_Item(category.name, product, row[4])) - - Helper_App.console_log(f'basket: {basket}') - - # Errors - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # [SQL_Error(row[0], row[1]) for row in result_set_2] - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Base.db_cursor_clear(cursor) - - return basket diff --git a/datastores/datastore_store_manufacturing_purchase_order.py b/datastores/datastore_store_manufacturing_purchase_order.py deleted file mode 100644 index f0840480..00000000 --- a/datastores/datastore_store_manufacturing_purchase_order.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Manufacturing Purchase Order Purchase Order DataStore - -Description: -Datastore for Store Manufacturing Purchase Order Purchase Orders -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.sql_error import SQL_Error -from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order, Manufacturing_Purchase_Order_Product_Link, Parameters_Manufacturing_Purchase_Order, Manufacturing_Purchase_Order_Temp, Manufacturing_Purchase_Order_Product_Link_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - - -class DataStore_Store_Manufacturing_Purchase_Order(DataStore_Store_Base): - - def __init__(self): - super().__init__() - - def get_many_manufacturing_purchase_order(self, parameters_manufacturing_purchase_order): - _m = 'DataStore_Store_Manufacturing_Purchase_Order.get_many_manufacturing_purchase_order' - av.val_instance(parameters_manufacturing_purchase_order, 'parameters_manufacturing_purchase_order', _m, Parameters_Manufacturing_Purchase_Order) - argument_dict = parameters_manufacturing_purchase_order.to_json() - user = self.get_user_session() - argument_dict = { - 'a_id_user': user.id_user - , **argument_dict - , 'a_debug': 0 - } - Helper_App.console_log(f'argument_dict: {argument_dict}') - Helper_App.console_log('executing p_shop_get_many_manufacturing_purchase_order') - result = self.db_procedure_execute('p_shop_get_many_manufacturing_purchase_order', argument_dict) - cursor = result.cursor - Helper_App.console_log('data received') - - # Manufacturing_Purchase_Orders - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw manufacturing_purchase_orders: {result_set_1}') - manufacturing_purchase_orders = [] - indices_manufacturing_purchase_order = {} - for row in result_set_1: - new_manufacturing_purchase_order = Manufacturing_Purchase_Order.from_DB_manufacturing_purchase_order(row) - indices_manufacturing_purchase_order[new_manufacturing_purchase_order.id_order] = len(manufacturing_purchase_orders) - manufacturing_purchase_orders.append(new_manufacturing_purchase_order) - - # Manufacturing_Purchase_Orders Items - cursor.nextset() - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw manufacturing_purchase_order_product_links: {result_set_1}') - order_product_links = [] - for row in result_set_1: - new_link = Manufacturing_Purchase_Order_Product_Link.from_DB_manufacturing_purchase_order(row) - order_product_links.append(new_link) - manufacturing_purchase_orders[indices_manufacturing_purchase_order[new_link.id_order]].items.append(new_link) - - # Errors - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Manufacturing_Purchase_Order.db_cursor_clear(cursor) - - return manufacturing_purchase_orders, errors - - @classmethod - def save_manufacturing_purchase_orders(cls, comment, manufacturing_purchase_orders): - _m = 'DataStore_Store_Manufacturing_Purchase_Order.save_manufacturing_purchase_orders' - av.val_str(comment, 'comment', _m) - - guid = Helper_DB_MySQL.create_guid_str() - now = datetime.now() - user = cls.get_user_session() - rows_order = [] - for manufacturing_purchase_order in manufacturing_purchase_orders: - row = Manufacturing_Purchase_Order_Temp.from_manufacturing_purchase_order(manufacturing_purchase_order) - row.guid = guid - rows_order.append(row) - Helper_App.console_log(f'order rows: {rows_order}') - DataStore_Store_Base.upload_bulk(Manufacturing_Purchase_Order_Temp.__tablename__, rows_order, 1000) - Helper_App.console_log('bulk uploaded orders') - - rows_link = [] - for manufacturing_purchase_order in manufacturing_purchase_orders: - for link in manufacturing_purchase_order.items: - row = Manufacturing_Purchase_Order_Product_Link_Temp.from_manufacturing_purchase_order_product_link(link) - row.guid = guid - rows_link.append(row) - Helper_App.console_log(f'link rows: {rows_link}') - DataStore_Store_Base.upload_bulk(Manufacturing_Purchase_Order_Product_Link_Temp.__tablename__, rows_link, 1000) - Helper_App.console_log('bulk uploaded links') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0 - } - result = cls.db_procedure_execute('p_shop_save_manufacturing_purchase_order', argument_dict_list) - Helper_App.console_log('saved manufacturing purchase orders') - - # Errors - cursor = result.cursor - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Manufacturing_Purchase_Order.db_cursor_clear(cursor) - return errors diff --git a/datastores/datastore_store_product.py b/datastores/datastore_store_product.py deleted file mode 100644 index 7dea7b47..00000000 --- a/datastores/datastore_store_product.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Product DataStore - -Description: -Datastore for Store Products -""" - -# internal -import lib.argument_validation as av -from business_objects.sql_error import SQL_Error -from business_objects.store.product import Product, Product_Permutation, Product_Price, Parameters_Product, Product_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - -# db = SQLAlchemy() - -""" -class Table_Shop_Product_Category(db.Model): - __tablename__ = 'Shop_Product_Category' - id_category: int = db.Column(db.Integer, primary_key=True) - code: str = db.Column(db.String(50)) - name: str = db.Column(db.String(255)) - description: str = db.Column(db.String(4000)) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - created_on: datetime = db.Column(db.DateTime) - created_by: int = db.Column(db.Integer) - id_change_set: int = db.Column(db.Integer) -""" -""" -class Row_Shop_Product_Temp(db.Model): - __tablename__ = 'Shop_Product_Temp' - __table_args__ = { 'extend_existing': True } - id_product: int = db.Column(db.Integer, primary_key=True) - id_category: int = db.Column(db.Integer) - name: str = db.Column(db.String(50)) - has_variations: str = db.Column(db.String(255)) - id_access_level_required: int = db.Column(db.Integer) - active: bool = db.Column(db.Boolean) - display_order: int = db.Column(db.Integer) - guid: str = db.Column(db.BINARY(36)) - - @classmethod - def from_product(cls, product): - row = cls() - row.id_product = product.id_product[0] if isinstance(product.id_product, tuple) else product.id_product - row.id_category = product.id_category[0] if isinstance(product.id_category, tuple) else product.id_category - row.name = product.name[0] if isinstance(product.name, tuple) else product.name - row.id_access_level_required = product.id_access_level_required[0] if isinstance(product.id_access_level_required, tuple) else product.id_access_level_required - row.active = product.active - row.display_order = product.display_order - return row - def to_json(self): - return { - 'id_product': self.id_product, - 'id_category': self.id_category, - 'name': self.name, - 'has_variations': self.has_variations, - 'id_access_level_required': self.id_access_level_required, - 'active': av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), - 'display_order': self.display_order, - 'guid': self.guid, - } -""" - -class DataStore_Store_Product(DataStore_Store_Base): - def __init__(self): - super().__init__() - @classmethod - def save_products(cls, comment, products): - _m = 'DataStore_Store_Product.save_products' - Helper_App.console_log(f'{_m}\nstarting...') - Helper_App.console_log(f'comment: {comment}\nproducts: {products}') - - guid = Helper_DB_MySQL.create_guid() - user = cls.get_user_session() - rows = [] - id_product_new = 0 - for product in products: - row = Product_Temp.from_product(product) - if row.id_product == '': - id_product_new -= 1 - row.id_product = id_product_new - else: - Helper_App.console_log(f'row.id_product: {row.id_product}') - row.guid = guid - rows.append(row) - - Helper_App.console_log(f'rows: {rows}') - DataStore_Store_Base.upload_bulk(Product_Temp.__tablename__, rows, 1000) - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0, - } - save_result = cls.db_procedure_execute('p_shop_save_product', argument_dict_list) - - cursor = save_result # .cursor - Helper_App.console_log('data received') - - # Errors - # cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - try: - DataStore_Store_Base.db_cursor_clear(cursor) - except Exception as e: - Helper_App.console_log(f'Error clearing cursor: {e}') - cursor.close() - - save_result.close() - Helper_App.console_log('save procedure executed') - return errors - diff --git a/datastores/datastore_store_product_category.py b/datastores/datastore_store_product_category.py deleted file mode 100644 index 6a32c4e9..00000000 --- a/datastores/datastore_store_product_category.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Product Category DataStore - -Description: -Datastore for Store Product Categories -""" - -# internal -import lib.argument_validation as av -from business_objects.store.product_category import Product_Category_Container, Product_Category, Product_Category_Temp -from business_objects.sql_error import SQL_Error -# from datastores.datastore_base import Table_Shop_Product_Category, Table_Shop_Product_Category_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - - -class DataStore_Store_Product_Category(DataStore_Store_Base): - def __init__(self): - super().__init__() - @classmethod - def save_categories(cls, comment, categories): - _m = 'DataStore_Store_Product_Category.save_categories' - Helper_App.console_log(f'{_m}\nstarting...') - Helper_App.console_log(f'comment: {comment}\ncategories: {categories}') - # av.val_str(comment, 'comment', _m) - # av.val_list_instances(categories, 'categories', _m, Product_Category, 1) - - guid = Helper_DB_MySQL.create_guid() - now = datetime.now() - user = cls.get_user_session() - rows = [] - id_category_new = 0 - for category in categories: - row = Product_Category_Temp.from_product_category(category) - # row = category.to_temporary_record() - # id_tmp = - if row.id_category == '': - id_category_new -= 1 - row.id_category = id_category_new - else: - Helper_App.console_log(f'row.id_category: {row.id_category}') - row.guid = guid - # row.created_on = now - # row.created_by = user.id_user - rows.append(row) - - Helper_App.console_log(f'rows: {rows}') - """ - cursor = db.cursor() - Helper_App.console_log('cursor created') - cursor.executemany( - 'INSERT INTO Shop_Product_Category_Temp (id_category, code, name, description, active, display_order, guid, created_on, created_by) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', - categories - ) - Helper_App.console_log('bulk upload executed') - db.commit() - Helper_App.console_log('bulk upload committed') - cursor.close() - Helper_App.console_log('cursor closed') - """ - DataStore_Store_Base.upload_bulk(Product_Category_Temp.__tablename__, rows, 1000) - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0, - } - save_result = cls.db_procedure_execute('p_shop_save_product_category', argument_dict_list) - - # Errors - cursor = save_result.cursor - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Product_Category.db_cursor_clear(cursor) - - save_result.close() - Helper_App.console_log('save procedure executed') - return errors diff --git a/datastores/datastore_store_product_permutation.py b/datastores/datastore_store_product_permutation.py deleted file mode 100644 index 2d9dc6b7..00000000 --- a/datastores/datastore_store_product_permutation.py +++ /dev/null @@ -1,106 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Product Permutation DataStore - -Description: -Datastore for Store Product Permutations -""" - -# internal -import lib.argument_validation as av -from business_objects.store.store_base import Store_Base -from business_objects.store.product_permutation import Product_Permutation, Product_Permutation_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - -# db = SQLAlchemy() - - - -class DataStore_Store_Product_Permutation(DataStore_Store_Base): - def __init__(self): - super().__init__() - - @classmethod - def save_permutations(cls, comment, permutations): - _m = 'DataStore_Store_Product_Permutation.save_permutations' - av.val_str(comment, 'comment', _m) - # av.val_list(permutations, 'list_permutations', _m, Product_Permutation, 1) - - guid = Helper_DB_MySQL.create_guid_str() - now = datetime.now() - user = cls.get_user_session() - rows = [] - for permutation in permutations: - # row = permutation.to_temporary_record() - row = Product_Permutation_Temp.from_product_permutation(permutation) - row.guid = guid - rows.append(row) - - Helper_App.console_log(f'rows: {rows}') - - """ - cursor = db.cursor() - Helper_App.console_log('cursor created') - cursor.executemany( - '''INSERT INTO Shop_Product_Permutation_Temp ( - id_permutation, - id_product, - description, - cost_local, - id_currency_cost, - profit_local_min, - latency_manufacture, - id_unit_measurement_quantity, - count_unit_measurement_quantity, - quantity_min, - quantity_max, - quantity_stock, - is_subscription, - id_unit_measurement_interval_recurrence, - count_interval_recurrence, - id_stripe_product, - does_expire_faster_once_unsealed, - id_unit_measurement_interval_expiration_unsealed, - count_interval_expiration_unsealed, - active, - guid - ) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)''', - rows - ) - Helper_App.console_log('cursor executed') - db.commit() - Helper_App.console_log('cursor committed') - cursor.close() - Helper_App.console_log('cursor closed') - """ - DataStore_Store_Base.upload_bulk(Product_Permutation_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0, - } - results = cls.db_procedure_execute('p_shop_save_product_permutation', argument_dict_list) - DataStore_Store_Base.db_cursor_clear(results.cursor) - Helper_App.console_log('saved product permutations') diff --git a/datastores/datastore_store_product_variation.py b/datastores/datastore_store_product_variation.py deleted file mode 100644 index 5265df82..00000000 --- a/datastores/datastore_store_product_variation.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Product Variation DataStore - -Description: -Datastore for Store Product Variations -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.store.product_variation import Product_Variation, Parameters_Product_Variation, Product_Variation_Temp -from business_objects.store.product_variation_type import Product_Variation_Type, Product_Variation_Type_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - - - -class DataStore_Store_Product_Variation(DataStore_Store_Base): - - def __init__(self, **kwargs): - super().__init__(**kwargs) - - @classmethod - def save_product_variations(cls, comment, variation_types): - _m = f'{cls.__class__}.save_product_variations' - av.val_str(comment, 'comment', _m) - - guid = Helper_DB_MySQL.create_guid_str() - user = cls.get_user_session() - rows = [] - for variation_type in variation_types: - row = Product_Variation_Type_Temp.from_product_variation_type(variation_type) - row.guid = guid - rows.append(row) - Helper_App.console_log(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(Product_Variation_Type_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded product variation types') - - rows = [] - for variation_type in variation_types: - if variation_type.variations is not None: - for variation in variation_type.variations: - row = Product_Variation_Temp.from_product_variation(variation) - row.guid = guid - rows.append(row) - Helper_App.console_log(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(Product_Variation_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded product variations') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0, - } - cls.db_procedure_execute('p_shop_save_product_variation', argument_dict_list) - Helper_App.console_log('saved product variations') diff --git a/datastores/datastore_store_stock_item.py b/datastores/datastore_store_stock_item.py deleted file mode 100644 index fbc933e4..00000000 --- a/datastores/datastore_store_stock_item.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Stock Item DataStore - -Description: -Datastore for Store Stock Items -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.sql_error import SQL_Error -from business_objects.store.stock_item import Stock_Item, Parameters_Stock_Item, Stock_Item_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -# from models.model_view_store_checkout import Model_View_Store_Checkout # circular! -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - -# db = SQLAlchemy() - - -class DataStore_Store_Stock_Item(DataStore_Store_Base): - # Global constants - # Attributes - - def __init__(self): - super().__init__() - - # Stock Items - def get_many_stock_item(self, parameters_stock_item, category_list): - # redundant argument validation? - _m = 'DataStore_Store_Stock_Item.get_many_stock_item' - av.val_instance(parameters_stock_item, 'parameters_stock_item', _m, Parameters_Stock_Item) - argument_dict = parameters_stock_item.to_json() - user = self.get_user_session() - argument_dict = { - 'a_id_user': user.id_user - , **argument_dict - , 'a_debug': 0 - } - ids_permutation = category_list.get_csv_ids_permutation() - Helper_App.console_log(f'ids_permutation: {ids_permutation}') - argument_dict['a_ids_product_permutation'] = ids_permutation - Helper_App.console_log(f'argument_dict: {argument_dict}') - Helper_App.console_log('executing p_shop_get_many_stock_item') - result = self.db_procedure_execute('p_shop_get_many_stock_item', argument_dict) - cursor = result.cursor - Helper_App.console_log('data received') - category_list, errors = DataStore_Store_Stock_Item.input_many_stock_item(cursor, category_list) - DataStore_Store_Stock_Item.db_cursor_clear(cursor) - - return category_list, errors - - - def input_many_stock_item(cursor, category_list): - _m = 'DataStore_Store_Stock_Item.input_many_stock_item' - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw categories: {result_set_1}') - for row in result_set_1: - new_stock_item = Stock_Item.from_DB_stock_item(row) - category_list.add_stock_item(new_stock_item) # , row) - - # Errors - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - """ - if len(errors) > 0: - for error in errors: - if error.code == 'PRODUCT_AVAILABILITY': - ids_permutation_unavailable = DataStore_Store_Stock_Item.get_ids_permutation_from_error_availability(error.msg) - for id_permutation in ids_permutation_unavailable: - index_category = category_list.get_index_category_from_id_permutation(id_permutation) - category = category_list.categories[index_category] - index_product = category.get_index_product_from_id_permutation(id_permutation) - product = category.products[index_product] - index_permutation = product.get_index_permutation_from_id(id_permutation) - permutation = product.permutations[index_permutation] - permutation.is_available = False - if 'region' in error.msg or 'currency' in error.msg: - permutation.is_unavailable_in_currency_or_region = True - """ - DataStore_Store_Stock_Item.db_cursor_clear(cursor) - return category_list, errors # categories, category_index - - @classmethod - def save_stock_items(cls, comment, stock_items): - _m = 'DataStore_Store_Stock_Item.save_stock_items' - av.val_str(comment, 'comment', _m) - - guid = Helper_DB_MySQL.create_guid_str() - now = datetime.now() - user = cls.get_user_session() - rows = [] - for stock_item in stock_items: - # row = permutation.to_temporary_record() - row = Stock_Item_Temp.from_stock_item(stock_item) - row.guid = guid - rows.append(row) - - Helper_App.console_log(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(Stock_Item_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0 - } - result = cls.db_procedure_execute('p_shop_save_stock_item', argument_dict_list) - Helper_App.console_log('saved product permutations') - - # Errors - cursor = result.cursor - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - DataStore_Store_Stock_Item.db_cursor_clear(cursor) - return errors diff --git a/datastores/datastore_store_supplier.py b/datastores/datastore_store_supplier.py deleted file mode 100644 index 1a9538ea..00000000 --- a/datastores/datastore_store_supplier.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Supplier DataStore - -Description: -Datastore for Store Suppliers -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.sql_error import SQL_Error -from business_objects.store.supplier_address import Supplier_Address, Supplier_Address_Temp -from business_objects.store.supplier import Supplier, Parameters_Supplier, Supplier_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - - -class DataStore_Store_Supplier(DataStore_Store_Base): - - def __init__(self): - super().__init__() - - @classmethod - def get_many_supplier(cls, parameters_supplier): - _m = 'DataStore_Store_Supplier.get_many_supplier' - av.val_instance(parameters_supplier, 'parameters_supplier', _m, Parameters_Supplier) - argument_dict = parameters_supplier.to_json() - user = cls.get_user_session() - argument_dict = { - 'a_id_user': user.id_user - , **argument_dict - , 'a_debug': 0 - } - Helper_App.console_log(f'argument_dict: {argument_dict}') - Helper_App.console_log('executing p_shop_get_many_supplier') - result = cls.db_procedure_execute('p_shop_get_many_supplier', argument_dict) - cursor = result.cursor - Helper_App.console_log('data received') - - # Suppliers - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw suppliers: {result_set_1}') - suppliers = [] - supplier_indexes = {} - for row in result_set_1: - new_supplier = Supplier.from_DB_supplier(row) - supplier_indexes[new_supplier.id_supplier] = len(suppliers) - suppliers.append(new_supplier) - - # Supplier Addresses - cursor.nextset() - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw supplier addresses: {result_set_1}') - for row in result_set_1: - new_address = Supplier_Address.from_DB_supplier(row) - index_supplier = supplier_indexes[new_address.id_supplier] - suppliers[index_supplier].addresses.append(new_address) - - # Errors - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Supplier.db_cursor_clear(cursor) - - return suppliers, errors - - @classmethod - def save_suppliers(cls, comment, suppliers): - _m = 'DataStore_Store_Supplier.save_suppliers' - Helper_App.console_log(f'{_m}\n{suppliers}') - av.val_str(comment, 'comment', _m) - - guid = Helper_DB_MySQL.create_guid_str() - now = datetime.now() - user = cls.get_user_session() - - rows = [] - for supplier in suppliers: - row = Supplier_Temp.from_supplier(supplier) - row.guid = guid - rows.append(row) - Helper_App.console_log(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(Supplier_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded suppliers') - - rows = [] - for supplier in suppliers: - Helper_App.console_log(f'supplier: {supplier}') - for supplier_address in supplier.addresses: - row = Supplier_Address_Temp.from_supplier_address(supplier_address) - row.guid = guid - rows.append(row) - Helper_App.console_log(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(Supplier_Address_Temp.__tablename__, rows, 1000) - Helper_App.console_log('bulk uploaded supplier addresses') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0 - } - result = cls.db_procedure_execute('p_shop_save_supplier', argument_dict_list) - Helper_App.console_log('saved suppliers') - - # Errors - cursor = result.cursor - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Supplier.db_cursor_clear(cursor) - return errors diff --git a/datastores/datastore_store_supplier_purchase_order.py b/datastores/datastore_store_supplier_purchase_order.py deleted file mode 100644 index 03e2854b..00000000 --- a/datastores/datastore_store_supplier_purchase_order.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: DataStores -Feature: Store Supplier Purchase Order Purchase Order DataStore - -Description: -Datastore for Store Supplier Purchase Order Purchase Orders -""" - -# internal -# from routes import bp_home -import lib.argument_validation as av -from business_objects.sql_error import SQL_Error -from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order, Supplier_Purchase_Order_Product_Link, Parameters_Supplier_Purchase_Order, Supplier_Purchase_Order_Temp, Supplier_Purchase_Order_Product_Link_Temp -from datastores.datastore_store_base import DataStore_Store_Base -from helpers.helper_app import Helper_App -from helpers.helper_db_mysql import Helper_DB_MySQL -from extensions import db -# external -# from abc import ABC, abstractmethod, abstractproperty -from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import text -import stripe -import os -from flask import Flask, session, current_app -from pydantic import BaseModel, ConfigDict -from typing import ClassVar -from datetime import datetime - - -class DataStore_Store_Supplier_Purchase_Order(DataStore_Store_Base): - - def __init__(self): - super().__init__() - - def get_many_supplier_purchase_order(self, parameters_supplier_purchase_order): - _m = 'DataStore_Store_Supplier_Purchase_Order.get_many_supplier_purchase_order' - av.val_instance(parameters_supplier_purchase_order, 'parameters_supplier_purchase_order', _m, Parameters_Supplier_Purchase_Order) - argument_dict = parameters_supplier_purchase_order.to_json() - user = self.get_user_session() - argument_dict = { - 'a_id_user': user.id_user - , **argument_dict - , 'a_debug': 0 - } - Helper_App.console_log(f'argument_dict: {argument_dict}') - Helper_App.console_log('executing p_shop_get_many_supplier_purchase_order') - result = self.db_procedure_execute('p_shop_get_many_supplier_purchase_order', argument_dict) - cursor = result.cursor - Helper_App.console_log('data received') - - # Supplier_Purchase_Orders - result_set_1 = cursor.fetchall() - Helper_App.console_log(f'raw supplier_purchase_orders: {result_set_1}') - supplier_purchase_orders = [] - indices_supplier_purchase_order = {} - for row in result_set_1: - new_supplier_purchase_order = Supplier_Purchase_Order.from_DB_supplier_purchase_order(row) - indices_supplier_purchase_order[new_supplier_purchase_order.id_order] = len(supplier_purchase_orders) - supplier_purchase_orders.append(new_supplier_purchase_order) - - # Supplier_Purchase_Orders Items - cursor.nextset() - result_set_2 = cursor.fetchall() - Helper_App.console_log(f'raw supplier_purchase_order_product_links: {result_set_2}') - order_product_links = [] - for row in result_set_2: - new_link = Supplier_Purchase_Order_Product_Link.from_DB_supplier_purchase_order(row) - order_product_links.append(new_link) - supplier_purchase_orders[indices_supplier_purchase_order[new_link.id_order]].items.append(new_link) - - - # Errors - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) - for error in errors: - Helper_App.console_log(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Supplier_Purchase_Order.db_cursor_clear(cursor) - - return supplier_purchase_orders, errors - - @classmethod - def save_supplier_purchase_orders(cls, comment, supplier_purchase_orders): - _m = 'DataStore_Store_Supplier_Purchase_Order.save_supplier_purchase_orders' - av.val_str(comment, 'comment', _m) - - guid = Helper_DB_MySQL.create_guid_str() - now = datetime.now() - user = cls.get_user_session() - rows_order = [] - for supplier_purchase_order in supplier_purchase_orders: - row = Supplier_Purchase_Order_Temp.from_supplier_purchase_order(supplier_purchase_order) - row.guid = guid - rows_order.append(row) - Helper_App.console_log(f'order rows: {rows_order}') - DataStore_Store_Base.upload_bulk(Supplier_Purchase_Order_Temp.__tablename__, rows_order, 1000) - Helper_App.console_log('bulk uploaded orders') - - rows_link = [] - for supplier_purchase_order in supplier_purchase_orders: - for link in supplier_purchase_order.items: - row = Supplier_Purchase_Order_Product_Link_Temp.from_supplier_purchase_order_product_link(link) - row.guid = guid - rows_link.append(row) - Helper_App.console_log(f'link rows: {rows_link}') - DataStore_Store_Base.upload_bulk(Supplier_Purchase_Order_Product_Link_Temp.__tablename__, rows_link, 1000) - Helper_App.console_log('bulk uploaded links') - - argument_dict_list = { - 'a_comment': comment, - 'a_guid': guid, - 'a_id_user': user.id_user, - 'a_debug': 0 - } - result = cls.db_procedure_execute('p_shop_save_supplier_purchase_order', argument_dict_list) - Helper_App.console_log('saved supplier purchase orders') - - # Errors - cursor = result.cursor - cursor.nextset() - result_set_e = cursor.fetchall() - Helper_App.console_log(f'raw errors: {result_set_e}') - errors = [] - warnings = [] - if len(result_set_e) > 0: - for row in result_set_e: - new_error = SQL_Error.from_DB_record(row) - if new_error.code == 'WARNING': - warnings.append(new_error) - else: - errors.append(new_error) - Helper_App.console_log(f"Error [{new_error.code}]: {new_error.msg}") - - cls.db_cursor_clear(cursor) - return errors, warnings diff --git a/datastores/datastore_user.py b/datastores/datastore_user.py index 42e1a523..f79b526a 100644 --- a/datastores/datastore_user.py +++ b/datastores/datastore_user.py @@ -14,10 +14,8 @@ Datastore for Users # from routes import bp_home import lib.argument_validation as av from business_objects.sql_error import SQL_Error -from business_objects.store.stock_item import Stock_Item from business_objects.user import User, Parameters_User, User_Permission_Evaluation -# from datastores.datastore_base import DataStore_Base -from datastores.datastore_store_base import DataStore_Store_Base +from datastores.datastore_base import DataStore_Base from helpers.helper_app import Helper_App from helpers.helper_db_mysql import Helper_DB_MySQL # from models.model_view_store_checkout import Model_View_Store_Checkout # circular! @@ -36,7 +34,7 @@ from datetime import datetime db = SQLAlchemy() -class DataStore_User(DataStore_Store_Base): +class DataStore_User(DataStore_Base): # Global constants # Attributes diff --git a/forms/contact.py b/forms/contact.py new file mode 100644 index 00000000..4e2a5ed5 --- /dev/null +++ b/forms/contact.py @@ -0,0 +1,33 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Backend +Feature: Contact Us Form + +Description: +Defines Flask-WTF form for handling user input on Contact Us page. +""" + +# IMPORTS +# internal +# from business_objects.store.product_category import Filters_Product_Category # circular +# from models.model_view_store import Model_View_Store # circular +from forms.base import Form_Base +# external +from flask_wtf import FlaskForm +from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField +from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional +from flask_wtf.recaptcha import RecaptchaField +from abc import ABCMeta, abstractmethod + + +class Form_Contact(FlaskForm): + email = StringField('Email') + contact_name = StringField('Name') + company_name = StringField('Company') + message = TextAreaField('Message') + receive_marketing = BooleanField('I would like to receive marketing emails.') + recaptcha = RecaptchaField() + submit = SubmitField('Send Message') diff --git a/forms/store/__init__.py b/forms/store/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/forms/store/__pycache__/__init__.cpython-312.pyc b/forms/store/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f2679b8774c2f7f7a8bde0e2fd6a9998e2fafac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmX@j%ge<81dn@}(!n%{KnI^$fFjcwDj75x{Z=v*F#&m>L27=bIa|eq7N-^!$E2o| zClu*uC&Da}c>D`Ev& T%Lv59AjU^#Mn=XWW*`dyxSTe% diff --git a/forms/store/__pycache__/product.cpython-312.pyc b/forms/store/__pycache__/product.cpython-312.pyc deleted file mode 100644 index 73c5e222410352f7539b3c8f0d1679433959c532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 zcmZ`*&2JM&6rWwM?e*G@LqZE_Lb~BY;Fegx0a4U|lDMf5G(kyP#LCjL?2eNS`^D@U zh)LTVaxhXQD)j(WRjEf%I8gP{KLM$iSfp}TsiIYT=?$8qN*t=bncV~vr6c+6oA-V* z@6G#|@lW}@gkYHKxtaSZgnp-!jggF*^=rV~K?YKg!5O^8*}TGYluuX*TTlc$sU+=` zlCslE+7=bj&L|mMQY3~EtgM|=a&}(H+Z{@WT~G>kr_#xENo$AQrF3zKM;{_1wSt7=}#JrA{S=Z3Tm#H4zp7M0pOU4 zEhEfN;~T*+!CExUPSq}h^U)+X;<^^roOpJ|3GfUi8$fJ9SfhzFX1Q9#7n5QB40U}H zU#*!08)0_5W?#l+Qgdc-n3{wwZg^p?3}@Vgh!gC9ngy~`xX?NdH5|>RiyYYv+vu^6%u~wK zI$ysB*nyi9+wl<(tG1E0 zt>UMk49AN}(gh2`tZArv9IY^C`l{mwDhoj<(BcnM8Vdo$E}>g~Sg5kb@KrBrlu%%G zPo0A9e2GU-Rz8NR_bZsTab?26WdaeblwG}MV<+${kfa%+**4UDfXQcBnq^)E@=1i2f+_ zKQ71(VXgO_R`2m<@9~DPD(+qzIMNyzY7PuFgqGOT6nj?1eug;O>^<5LZf9?0DXP%j z$gaaSNZ(8&Ow#aUwQ}ya;PoaL-oR8xjo@S^~_;8%J$Gpu2>YvTVRUxQbMCf_5guvLGZCv_35c)G5|Cb zRh3|msA_%p7JH=)%|5{S7l16HwH<@^j8^GXvvg`@@br(LKMGnCmzoooS`)ZAfmg<> zD^+*J3tHaIrg!rngsyVK{PXDZ3?Yvj;o&pFkJ3+PnbJ&|C)B|9jrj#=?!d#e@LEe6 zTo1^hS%7XG?Tu;hF>ad%eGQk0aoc364M&?#7;g(Ki)kEb7GxG~CQXoj@GKPOeAfxn zak2Zfx}ejd$Y)rEQ$W3EYv?ys2VjL?2C|5L>w4p>1C8|BzJvGj&3(rk>6X~r6nj@i zd2Ropd;QJ*C#a~eDfX?318e?dkHe)4Nq00Gt7<5z zstu2(MfsenUWJa1G$aE?Nr4hpNwhhla-!!8vpT$;zK!AOH^^S9J4ng9K<*=EhaHmL zQ;g8d*H?fnp(kB??#_Kb`@`JB%A>Q7hE^^ct6g~U?33=dSLCCQyN@lNdy?6%O#_{6LFs-VFtHZG}Rr<`U z*Mlmd@ek9$(dVAfsvz|L6`^@2?1c3CjgC(Ll7(F{w)E=hAz2E^QIe;mgAy92uzS-` z3I5|mk1y$@YU&d?LJ2K(7MYjg`%&Oek>env9qA7Od6wWf?l~`U!i&9#lb<55g}f&6 Zo}!CCql>?w(%-3WZr7LQ3j`mw-G4l{i*Wz| diff --git a/forms/store/__pycache__/product_category.cpython-312.pyc b/forms/store/__pycache__/product_category.cpython-312.pyc deleted file mode 100644 index 4b9588f9ff077076784f309e3041ea90c9182e6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 zcmb6bOKcNIbauV|t?hhp_=FJHKvi(tn3h%r(x#Omn5KddVi)R_tJQjUoUGZ8nOy^p z(kfDONKaKyP*tevskCtDp@$xOtkjF6Pz6>Xkg6VfgQi?K_06oEk3(y5(-GNA9tDf8!CmFSrjSXh0~|u)Bynn3 z^F}0Clewv4LAr=5uHj)Z*YIW>!Whyi{i;fI>8zpaCiWbAxL_IHj7Sf4)+E82;Tn!D zcHX{|WHe)-cGu@O5P1nPgE1famFxEwJoi`$#P_;|g*2O$ly#~R|Y~CRt zJ}ki<^@iq2CshwmJESS)4b#KKm2}lpCBv>aJW(9Ou11Wy2R9f2qH5UKmGY+QUK+kw z%u7|K3!pTk+PZ1j(^9>yR_my(GPQxitoSz#R)+J%g69ydoKRg1RGeOl5fhA}2Iy8M z>L&^w0lj$xo4TJW;%i=xU^O5Ug+>Lu4v6Fl$1$;Lx2bU(+`^PPOj2P?risj<4M@6drir)&F1^F z$(-gHS8zZT!Ih|vt7^maw6=Msnf4*A?^PWD^dUEgYK*ZN)Y{kExcd##d64e7x`DNY zbm(TdfHK0w?8{quama8L+wm0U$LMVQH3`BCPK-Y1GMSK{+{pF?TE~7QkO2P#7n@a= zIww81PmYv7a-rDEnD$`#oQ=l_C@PORTEoJ&=awOY(?qo_sJ-$9!)>UhRPY+Q;Ydeb zKXRnZx>|v*F01u=ne{>0r6pZ%H-OS-s4c#{Z%%gj~ zM}HAkj*TxJ8(%p#v2<*rb@beC%~t7?m6Ehe|HE2O=gj(-Sqp8lwr!o;!Pc$Kg@S?;vsL0)O3ig_vKz$69sn7U zrp;C@44K&h8$PdI@kKTml?u!nLZjvP=Fj9#E8_)a;#^TVb#}5?3RDbGW`Z$uCyV13 zP6bK@KctziFHl=PuUNjoYKL|So%v)hJr-ZP&g}jz>t#(Q14mpFz&v`~lfIt(D!KUC z4Y`#%w8%f`IkepK%A)XK=)m`b-wodKe*SRft;r?$9X{VGs4WdI4^Cdga-574aOpQ6?T3=OdWHcg_;4H1ov$K3+R4& zUrTypIeldQ%>7jVjqFcjcT>mb^H2C_IQCBu7q+;^;hv{_INY}yLXlpE1uALcGJE}~ zqUeqWw;QT7T>6N)ic_Iaw3}sJ8$hK3&ry(8k)BFSh&%o)hPa`J=%v5VzDKCOg6d1C{s@)+K&6K$`v@KUHYQ@u!8VG(EnuJ@_Q65&2lUW`f%d?KRZw0eaEqdc0zD{ojRHCK&5{%) znKX2=t+-VW=W%$C(xf(XUWac|e5#-GJAAXkr~xjZ2DzXb;zDW**P^y^t!f+BrnYnK z4#ul=sGVG=+QoILZ*Xs@-CVbNggfH2`IH{Dm+N(Szj9RV}Rl0xN5|yvZ
L2F4yDkBnZQUWi-Dzl21Z>Lg6DKy zL4sD1rZpHA!c`zrU_HtLlT>t}%*UGS&@>t8BD$8BF_P@STwcu}yeMd^$ZlQ)6B{`@ zI0aL(2l352^C2kUYRe)Lg`6p_l|72lwl{HZau%6_-6CWR6APlLB3N=sEJsP1Hdln_ zUjcKQLKNqM5T|Jhxg{4+&w~nJ6@ngq?uVWSp0bK-a!`c63e^nlUa9#3L?bDj&yl^7 z@1g$zUD5eL$4JZ`Cg8|{Jvr#7q~J}83!xS%bd#$3#Ijt&% zG#n)Bm3i5({Us&QfUeB_{+0%4H=wJlyAR#~?E$oJAFRSQKsN!}Ntp+GG(a~48q(_F z(g5xKJhVi`d~=25f&BA|H6A$tBneBF`0B2oDD=P0)&o@1!$e`QUc15Td6U<(ytC{R zg`;&qu%jRdCJF;@zhwVfUeHY0+~ieRn<%h#I@b`w#zcXM?U^8%W}pAIhh#yU0ae9g zyH!5uo!wma#17Vs%G!QO*nkY-F_4lqNI0_JU7H+FFB_0!(}<-0^t^_qFbpO=rHgqL zX{M2e_+Q0>3IkY8UzUx$ps-73UXpco?Bv*3+Br;kI84$)E|+%FZyM$bqjbehK3Cg? z@!Y2E<9Up7nCA;auUN}?6?FpqG;RagqIPMzEArP!v=kY&BBQ0qm=zf-hJUb2xlV<5 z!tA~IyYr>+Nh^G^*!O)nHD|)&V9k-(6MfNPH-|gAy3EvCc4U~FDte%nL zkr*hC_wV!{EA^kS`cIVlPg(t^ijmWx{$T^Pf49}w7Tl$L{@`;G&f@-!N;aFbxu<~M zhLicmUZVPhzTq-S2dC5v{9b5z9ZVLI@C~|N8sN!)JLPrkG_bLkUJlr(v(;bnw*jW& zZ=LPmz~2UTz~6c{_WU(ltD|3Ut8%sPfzfo-^i__GX5aeMK|l)Ys-kOONXo9y>FT`; zeC)2ZRXP6u@sS)+hsq%z>mXj!$D@Y~gIM$Nz)X=-?ND*nonG%hqz18p4fbVZ#m2Fh zTlU$Y;Siwb3QRnUb(LQ?bS>6_Nr>A$iBxKlpPu3u7U!pyCsX`nB6a@4{Nf58fM(oB z2upyihk!Urw6t&?vMIT0@foThkGzi7JU*%^*KJYG6JYe5~JD=wtAm-*82h6QzD zvp7^J4t{*gQ}Xp#zMgF#yTcCM=SssLSWwyNT0>-KXyoD1Qf$(KIyChM>CfY(8Dv3C zW{ZQX#bax?JfF3G+Pdu<*clkSf3Y<5o&|N_{i-_r_0XHYnf>+bqoJ<~r8Ac;sAE^Q zSH#lFhPAS>OHn^_CFuW>&qey%@&}ZkxMpbh%+Sl^^ReqP4H9pt>yOfpXC6-!Gtzbk+M0RV9=@~k#Rp$reDv<)?>&wbf125D7q>1x z?LJl zYeHt-?xl)5}Gj#937Uic_i^c!mEAJo7zDp#U%7L|KO ct^9>r`G$%=qu%;Y^N6eKSFslqd>rHd1D9*!o&W#< diff --git a/forms/store/manufacturing_purchase_order.py b/forms/store/manufacturing_purchase_order.py deleted file mode 100644 index eae4f7c2..00000000 --- a/forms/store/manufacturing_purchase_order.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Manufacturing Purchase Order Filters data input - -Description: -Defines Flask-WTF forms for handling manufacturing purchase order filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField, DateField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Manufacturing_Purchase_Order(Form_Base): - active = BooleanField("Active only?", default = True) - date_from = DateField('Date from') - date_to = DateField('Date to') - def __repr__(self): - return f'Filters_Manufacturing_Purchase_Order(active={self.active.data}, date_from={self.date_from.data}, date_to={self.date_to.data})' - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - form = cls() - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) - if json[Store_Base.FLAG_DATE_FROM] != '': - form.date_from.data = json[Store_Base.FLAG_DATE_FROM] - if json[Store_Base.FLAG_DATE_TO] != '': - form.date_to.data = json[Store_Base.FLAG_DATE_TO] - return form \ No newline at end of file diff --git a/forms/store/product.py b/forms/store/product.py deleted file mode 100644 index 702e2fcf..00000000 --- a/forms/store/product.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Product Filter data input - -Description: -Defines Flask-WTF forms for handling user input. -""" - -# IMPORTS -# internal -# from business_objects.store.product_category import Filters_Product_Category -# from models.model_view_store import Model_View_Store # circular -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField - - -class Filters_Product(FlaskForm): - id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='') - is_not_empty = BooleanField('Not empty only?') - active = BooleanField("Active only?", default = True) - @classmethod - def from_filters_product(cls, filters_product): - form = Filters_Product() - form.id_category = filters_product.id_category - form.is_not_empty.data = filters_product.is_not_empty - form.active.data = filters_product.active - return form - def __repr__(self): - return f'Filters_Product(id_category={self.id_category}, is_not_empty={self.is_not_empty.data}, active={self.active.data})' - @classmethod - def from_json(cls, json): - filters = cls() - filters.id_category.data = json['id_category'] - filters.is_not_empty.data = json['is_not_empty'] - filters.active.data = json['active'] - return filters \ No newline at end of file diff --git a/forms/store/product_category.py b/forms/store/product_category.py deleted file mode 100644 index 463540ab..00000000 --- a/forms/store/product_category.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Product Category Filters data input - -Description: -Defines Flask-WTF forms for handling product category filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -# from business_objects.store.product_category import Filters_Product_Category -# from models.model_view_store import Model_View_Store # circular -# from helpers.DEPRECATED.helper_abc import Interface_ABC -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Product_Category(Form_Base): - is_not_empty = BooleanField('Not empty only?') - active = BooleanField("Active only?", default = True) - """ - @classmethod - def from_filters(cls, filters): - form = Filters_Product_Category() - form.is_not_empty.data = filters.is_not_empty - form.active.data = filters.active - return form - """ - def __repr__(self): - return f'Filters_Product_Category(is_not_empty={self.is_not_empty.data}, active={self.active.data})' - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - form = Filters_Product_Category() # is_not_empty=json['is_not_empty'], active=json['active']) - form.is_not_empty.data = av.input_bool(json[Store_Base.FLAG_IS_NOT_EMPTY], 'is_not_empty', _m) - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) - return form \ No newline at end of file diff --git a/forms/store/product_permutation.py b/forms/store/product_permutation.py deleted file mode 100644 index 2fcd9d91..00000000 --- a/forms/store/product_permutation.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Product Category Filters data input - -Description: -Defines Flask-WTF forms for handling product category filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -# from business_objects.store.product_category import Filters_Product_Category -# from models.model_view_store import Model_View_Store # circular -# from helpers.DEPRECATED.helper_abc import Interface_ABC -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Product_Permutation(Form_Base): - id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='') - id_product = SelectField('Product', validators=[Optional()], choices=[('', 'All')], default='') - is_out_of_stock = BooleanField('Out of stock only?') - active = BooleanField('Active only?', default=True) - quantity_min = FloatField('Min stock') - quantity_max = FloatField('Max stock') - # submit = SubmitField('Submit') - """ - @classmethod - def from_filters(cls, filters): - form = Filters_Product_Permutation() - form.id_category.choices = Store_Base.convert_list_objects_to_list_options(filters.categories) - form.id_product.choices = Store_Base.convert_list_objects_to_list_options(filters.products) - form.is_out_of_stock.data = filters.is_out_of_stock - form.quantity_min.data = filters.quantity_min - form.quantity_max.data = filters.quantity_max - return form - """ - def __repr__(self): - return f''' - Filters_Product_Permutation( - id_category={self.id_category.data}, - id_product={self.id_product.data}, - is_out_of_stock={self.is_out_of_stock.data}, - active={self.active.data}, - quantity_min={self.quantity_min.data}, - quantity_max={self.quantity_max.data}) - ''' - @classmethod - def from_json(cls, json): - form = cls() - form.id_category.choices = [(json[Store_Base.ATTR_ID_PRODUCT_CATEGORY], json[Store_Base.ATTR_ID_PRODUCT_CATEGORY])] - form.id_category.data = json[Store_Base.ATTR_ID_PRODUCT_CATEGORY] - form.id_product.choices = [(json[Store_Base.ATTR_ID_PRODUCT], json[Store_Base.ATTR_ID_PRODUCT])] - form.id_product.data = json[Store_Base.ATTR_ID_PRODUCT] - form.is_out_of_stock.data = av.input_bool(json[Store_Base.FLAG_IS_OUT_OF_STOCK], Store_Base.FLAG_IS_OUT_OF_STOCK, f'{cls.__name__}.from_json') - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], Store_Base.FLAG_ACTIVE, f'{cls.__name__}.from_json') - form.quantity_min.data = json[Store_Base.FLAG_QUANTITY_MIN] - form.quantity_max.data = json[Store_Base.FLAG_QUANTITY_MAX] - return form \ No newline at end of file diff --git a/forms/store/product_variation.py b/forms/store/product_variation.py deleted file mode 100644 index 33efd993..00000000 --- a/forms/store/product_variation.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Product Variation Filters data input - -Description: -Defines Flask-WTF forms for handling product variation filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -from forms.base import Form_Base -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField, DateField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Product_Variation(Form_Base): - is_not_empty = BooleanField('Not empty only?') - active = BooleanField("Active only?", default = True) - def __repr__(self): - return f'Filters_Product_Variation(is_not_empty={self.is_not_empty.data}, active={self.active.data})' - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - Helper_App.console_log(f'{_m}\njson={json}') - form = cls() - form.is_not_empty.data = av.input_bool(json[Store_Base.FLAG_IS_NOT_EMPTY], Store_Base.FLAG_IS_NOT_EMPTY, _m) - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], Store_Base.FLAG_ACTIVE, _m) - return form \ No newline at end of file diff --git a/forms/store/stock_item.py b/forms/store/stock_item.py deleted file mode 100644 index 0388031f..00000000 --- a/forms/store/stock_item.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Product Category Filters data input - -Description: -Defines Flask-WTF forms for handling product category filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -# from business_objects.store.product_category import Filters_Product_Category -# from models.model_view_store import Model_View_Store # circular -# from helpers.DEPRECATED.helper_abc import Interface_ABC -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - -class Filters_Stock_Item(Form_Base): - id_category = SelectField('Category', choices=[Form_Base.get_choice_all()], default='') - id_product = SelectField('Product', choices=[Form_Base.get_choice_all()], default='') - is_out_of_stock = BooleanField('Out of stock only?') - quantity_min = FloatField('Min stock') - quantity_max = FloatField('Max stock') - # submit = SubmitField('Submit') - """ - def __repr__(self): - return f''' - {self.__class__.__name__}( - id_category={self.id_category.data}, - id_product={self.id_product.data}, - is_out_of_stock={self.is_out_of_stock.data}, - quantity_min={self.quantity_min.data}, - quantity_max={self.quantity_max.data}) - ''' - """ - @classmethod - def from_json(cls, json): - form = cls() - # form.id_category.choices = [(json[Store_Base.ATTR_ID_PRODUCT_CATEGORY], json[Store_Base.ATTR_ID_PRODUCT_CATEGORY])] - form.id_category.data = json[Store_Base.ATTR_ID_PRODUCT_CATEGORY] - # form.id_product.choices = [(json[Store_Base.ATTR_ID_PRODUCT], json[Store_Base.ATTR_ID_PRODUCT])] - form.id_product.data = json[Store_Base.ATTR_ID_PRODUCT] - form.is_out_of_stock.data = av.input_bool(json[Store_Base.FLAG_IS_OUT_OF_STOCK], Store_Base.FLAG_IS_OUT_OF_STOCK, f'{cls.__name__}.from_json') - form.quantity_min.data = json[Store_Base.FLAG_QUANTITY_MIN] - form.quantity_max.data = json[Store_Base.FLAG_QUANTITY_MAX] - return form - def to_json(self): - return { - Store_Base.ATTR_ID_PRODUCT_CATEGORY: self.id_category.data, - Store_Base.ATTR_ID_PRODUCT: self.id_product.data, - Store_Base.FLAG_IS_OUT_OF_STOCK: self.is_out_of_stock.data, - Store_Base.FLAG_QUANTITY_MIN: self.quantity_min.data, - Store_Base.FLAG_QUANTITY_MAX: self.quantity_max.data - } - @classmethod - def get_default(cls): - filters = cls() - filters.id_category.choices = cls.get_choices_blank() - filters.id_product.choices = cls.get_choices_blank() - """ - def import_values(self, form_filters): - self.id_category.data = form_filters.id_category.data - self.id_product.data = form_filters.id_product.data - self.is_out_of_stock.data = form_filters.is_out_of_stock.data - self.quantity_min.data = form_filters.quantity_min.data - self.quantity_max.data = form_filters.quantity_max.data - """ \ No newline at end of file diff --git a/forms/store/supplier.py b/forms/store/supplier.py deleted file mode 100644 index 5ae4b600..00000000 --- a/forms/store/supplier.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Supplier Filters data input - -Description: -Defines Flask-WTF forms for handling supplier filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Supplier(Form_Base): - active = BooleanField("Active only?", default = True) - def __repr__(self): - return f'Filters_Supplier(active={self.active.data})' - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - form = cls() - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) - return form \ No newline at end of file diff --git a/forms/store/supplier_purchase_order.py b/forms/store/supplier_purchase_order.py deleted file mode 100644 index ad5c3b8e..00000000 --- a/forms/store/supplier_purchase_order.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: Backend -Feature: Forms - Supplier Purchase Order Filters data input - -Description: -Defines Flask-WTF forms for handling supplier purchase order filter input. -""" - -# internal -from business_objects.store.store_base import Store_Base -from forms.base import Form_Base -import lib.argument_validation as av -# external -from flask_wtf import FlaskForm -from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField, DateField -from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional -from flask_wtf.recaptcha import RecaptchaField -from abc import ABCMeta, abstractmethod - - -class Filters_Supplier_Purchase_Order(Form_Base): - active = BooleanField("Active only?", default = True) - date_from = DateField('Date from') - date_to = DateField('Date to') - def __repr__(self): - return f'Filters_Supplier_Purchase_Order(active={self.active.data}, date_from={self.date_from.data}, date_to={self.date_to.data})' - @classmethod - def from_json(cls, json): - _m = f'{cls.__name__}.from_json' - form = cls() - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) - if json[Store_Base.FLAG_DATE_FROM] != '': - form.date_from.data = json[Store_Base.FLAG_DATE_FROM] - if json[Store_Base.FLAG_DATE_TO] != '': - form.date_to.data = json[Store_Base.FLAG_DATE_TO] - return form \ No newline at end of file diff --git a/forms/unit_measurement.py b/forms/unit_measurement.py index 2c2d46e2..720da3e8 100644 --- a/forms/unit_measurement.py +++ b/forms/unit_measurement.py @@ -11,7 +11,7 @@ Defines Flask-WTF forms for handling unit of measurement filter input. """ # internal -from business_objects.store.store_base import Store_Base +from business_objects.base import Base from forms.base import Form_Base import lib.argument_validation as av # external @@ -34,9 +34,9 @@ class Filters_Unit_Measurement(Form_Base): @classmethod def from_json(cls, json): form = Filters_Unit_Measurement() - form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', 'Filters_Unit_Measurement') + form.active.data = av.input_bool(json[Base.FLAG_ACTIVE], 'active', 'Filters_Unit_Measurement') return form def to_json(self): return { - Store_Base.FLAG_ACTIVE: av.input_bool(self.active.data, Store_Base.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + Base.FLAG_ACTIVE: av.input_bool(self.active.data, Base.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), } \ No newline at end of file diff --git a/models/__pycache__/model_view_base.cpython-38.pyc b/models/__pycache__/model_view_base.cpython-38.pyc index 3112cb6ead80b3a93ce4517113ef6dd30869a190..4532f87d11d5141eaf2f3330f0cc9670b126feb6 100644 GIT binary patch delta 5886 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 delta 6050 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 0 else None - self.form_delivery_region = Form_Delivery_Region(id_region_delivery=self.id_region_delivery) - self.form_delivery_region.id_region_delivery.choices = [(region.id_region, f'{region.code} - {region.name}') for region in regions] - self.form_delivery_region.id_region_delivery.data = str(self.id_region_delivery) if len(regions) > 0 else None - """ - - def get_many_product(self, product_filters): # category_ids = '', product_ids = '', get_all_category = True, get_all_product = True, max_products_per_category = -1): - _m = 'Model_View_Store.get_many_product' - av.val_instance(product_filters, 'product_filters', _m, Parameters_Product) - """ - av.val_str(category_ids, 'category_ids', _m) - av.val_str(product_ids, 'product_ids', _m) - av.val_bool(get_all_category, 'get_all_category', _m) - av.val_bool(get_all_product, 'get_all_product', _m) - av.val_int(max_products_per_category, 'max_products_per_category', _m) - """ - # get products from database - # call datastore method - # return [Product.template()] - self.category_list, errors = DataStore_Store_Base().get_many_product(product_filters) # category_ids, product_ids, get_all_category, get_all_product, max_products_per_category) - # self.categories = categories - # self.category_index = category_index - - return - if get_all_category or get_all_product: - prod = Product.template() - prod_list = [ prod, prod ] - return { 'MISCELLANEOUS': prod_list if max_products_per_category < 0 else prod_list[:max_products_per_category] } - if product_ids == 'panties123': - prod = Product.template() - return { 'MISCELLANEOUS': [ prod] } - - # def product_category_getMany(self, category_ids = '', product_ids = '', get_all_category = True, get_all_product = True): - # return Model_View_Store.product_category_getMany(category_ids, product_ids, get_all_category, get_all_product) - - def get_many_product_image_src(self, product_id, image_ids = '', get_primary_only = True, resolution_level = ''): - _m = 'Model_View_Store.get_many_product_image' - # Helper_App.console_log(f'{_m}\n') - # av.val_instance(filters, 'filters', _m, Product_Image_Filters) - av.val_int(product_id, 'product_id', _m) - # av.full_val_int(product_id, 'product_id', _m) - # product_id = int(product_id) - av.val_str(image_ids, 'image_ids', _m) - av.full_val_bool(get_primary_only, 'get_primary_only', _m) - get_primary_only = bool(get_primary_only) - resolution_level = Resolution_Level_Enum.get_member_by_text(resolution_level) - av.val_instance(resolution_level, 'resolution_level', _m, Resolution_Level_Enum) - # if (filters.product_id < 0 or filters.product_id not in self.valid_product_id_list): - if (product_id not in Model_View_Store.valid_product_id_list): # product_id < 0 or - return '' - path_suffix = 'jpg' # get_suffix_from_product_id(product_id) - path_file = f'/static/images/{product_id}.{path_suffix}' - return path_file - # return send_file(path_file, mimetype=f'image/{path_suffix}') - - """ - def get_product_category_text(self, category): - return Enum_Product_Product_Category.get_member_by_text(category).text() - - def add_2_basket(product_id, quantity, basket_local): - _m = 'Model_View_Store.add_2_basket' - av.full_val_int(product_id, 'product_id', _m) - product_id = str(product_id) - av.full_val_int(quantity, 'quantity', _m) - quantity = int(quantity) - av.val_instance(basket_local, 'basket_local', _m, dict) - # send to database - - # update basket on webpage with new database status - if product_id in basket_local: - basket_local[product_id] += quantity - else: - basket_local[product_id] = quantity - return basket_local // jsonify(basket_local) - """ - - - def basket_item_edit(self, permutation_id, quantity, quantity_sum_not_replace): - _m = 'Model_View_Store.basket_item_edit' - # av.full_val_int(product_id, 'product_id', _m) - # product_id = int(product_id) - # av.val_instance(db, 'db', _m, SQLAlchemy) - Helper_App.console_log(f'{_m} starting') - # Helper_App.console_log(f'product_id: {product_id}\npermutation_id: {permutation_id}\nquantity = {quantity}') - # av.full_val_int(product_id, 'product_id', _m) - # Helper_App.console_log('valid product id') - av.full_val_int(quantity, 'quantity', _m) - quantity = int(quantity) - # item_added = False - Helper_App.console_log(f'basket: {self.basket}') - ids_permutation, quantities_permutation = self.basket.to_csv() - self.basket = DataStore_Store_Basket().edit_basket(ids_permutation, quantities_permutation, permutation_id, quantity, quantity_sum_not_replace, self.id_currency, self.id_region_delivery, self.is_included_VAT) - return True - - def get_basket(self, json_data): - self.import_JSON_basket(json_data) - if self.is_user_logged_in: - ids_permutation, quantities_permutation = self.basket.to_csv() - self.basket = DataStore_Store_Basket().edit_basket(ids_permutation, quantities_permutation, None, None, None, self.id_currency, self.id_region_delivery, self.is_included_VAT) - # return self.basket - - def _get_json_basket_id_CSVs_product_permutation(self, basket): - product_ids = '' - permutation_ids = '' - item_index_dict = {} - if len(basket) > 0: - for index_item in range(len(basket)): - if index_item > 0: - product_ids += ',' - permutation_ids += ',' - basket_item = basket[index_item] - id_product = basket_item[self.KEY_ID_PRODUCT] - id_permutation = basket_item[self.KEY_ID_PERMUTATION] - id_permutation = '' if (id_permutation is None or id_permutation == 'None') else str(id_permutation) - product_ids += str(id_product) # str(basket[b].product.id) - permutation_ids += id_permutation # str(basket[b].product.id) - # item_index_dict[Basket.get_key_product_index_from_ids_product_permutation(id_product, id_permutation)] = index_item - item_index_dict[id_permutation] = index_item - Helper_App.console_log(f'product_ids = {product_ids}') - Helper_App.console_log(f'permutation_ids = {permutation_ids}') - return product_ids, permutation_ids, item_index_dict - - def _get_basket_from_json(self, json_data): - basket = json_data[self.KEY_BASKET]['items'] - av.val_instance(basket, 'basket', 'Model_View_Store._get_basket_from_json', list) - Helper_App.console_log(f'basket = {basket}') - return basket - - def import_JSON_basket(self, json_data): - _m = 'Model_View_Store.import_JSON_basket' - # av.val_instance(db, 'db', _m, SQLAlchemy) - items = self._get_basket_from_json(json_data) - basket = json_data[self.KEY_BASKET] - id_currency = basket[self.KEY_ID_CURRENCY] - id_region_delivery = basket[self.KEY_ID_REGION_DELIVERY] - is_included_VAT = basket[self.KEY_IS_INCLUDED_VAT] - Helper_App.console_log(f'json basket items: {items}') - product_ids, permutation_ids, item_index_dict = self._get_json_basket_id_CSVs_product_permutation(items) - category_list, errors = DataStore_Store_Base().get_many_product(Parameters_Product( - self.id_user, # :a_id_user - True, '', False, # :a_get_all_category, :a_ids_category, :a_get_inactive_category - False, product_ids, False, False, # :a_get_all_product, :a_ids_product, :a_get_inactive_product, :a_get_first_product_only - False, permutation_ids, False, # :a_get_all_permutation, :a_ids_permutation, :a_get_inactive_permutation - False, '', False, True, # :a_get_all_image, :a_ids_image, :a_get_inactive_image, :a_get_first_image_only - False, str(id_region_delivery), False, # :a_get_all_delivery_region, :a_ids_delivery_region, :a_get_inactive_delivery_region - False, str(id_currency), False, # :a_get_all_currency, :a_ids_currency, :a_get_inactive_currency - True, '', False # :a_get_all_discount, :a_ids_discount, :a_get_inactive_discount - )) # product_ids=product_ids, get_all_category=False, get_all_product=False) - # Helper_App.console_log(f'categories = {categories}') - self.basket = Basket(id_currency, id_region_delivery, is_included_VAT) - if len(category_list.categories) > 0: # not (categories is None): - for category in category_list.categories: - for product in category.products: - # product = Product.from_json(items[index_item]) - product.form_basket_edit = Form_Basket_Edit() - # key_index_product = Basket.get_key_product_index_from_ids_product_permutation(product.id_product, product.get_id_permutation()) - permutation = product.get_permutation_selected() - self.basket.add_item(Basket_Item.from_product_and_quantity_and_VAT_included(product, items[item_index_dict[str(permutation.id_permutation)]][self.KEY_QUANTITY], self.is_included_VAT)) - """ - if len(items) > 0: - for index_item in range(len(items)): - """ - Helper_App.console_log(f'basket data: {json_data}') - Helper_App.console_log(f'basket: {self.basket}') - - # ids_permutation_unavailable_region_or_currency = [] - # id_permutation_unavailable_otherwise = [] - if len(errors) > 0: - for error in errors: - if error[1] == 'PRODUCT_AVAILABILITY': - ids_permutation = DataStore_Store_Base.get_ids_permutation_from_error_availability(error[2]) - for id_permutation in ids_permutation: - for item in self.basket.items: - permutation = item.product.get_permutation_selected() - if id_permutation == permutation.id_permutation: - item.is_available = False - if 'region' in error[2] or 'currency' in error[2]: - item.is_unavailable_in_currency_or_region = True - # ids_permutation_unavailable_region_or_currency.append(id_permutation) - # else: - # for id_permutation in ids_permutation: - # id_permutation_unavailable_otherwise.append(id_permutation) - """ - ids_permutation_unavailable = self.basket.get_ids_permutation_unavailable() - if len(ids_permutation_unavailable) > 0: - category_list_unavailable, errors_unavailable = DataStore_Store().get_many_product(Parameters_Product( - self.id_user, # :a_id_user - True, '', False, # :a_get_all_category, :a_ids_category, :a_get_inactive_category - False, '', False, False, # :a_get_all_product, :a_ids_product, :a_get_inactive_product, :a_get_first_product_only - False, ','.join(ids_permutation_unavailable), False, # :a_get_all_permutation, :a_ids_permutation, :a_get_inactive_permutation - False, '', False, True, # :a_get_all_image, :a_ids_image, :a_get_inactive_image, :a_get_first_image_only - True, '', False, # :a_get_all_delivery_region, :a_ids_delivery_region, :a_get_inactive_delivery_region - True, '', False, # :a_get_all_currency, :a_ids_currency, :a_get_inactive_currency - True, '', False # :a_get_all_discount, :a_ids_discount, :a_get_inactive_discount - )) # product_ids=product_ids, get_all_category=False, get_all_product=False) - else: - category_list_unavailable = None - errors_unavailable = [] - """ - - - def import_JSON_basket_item(self, json_data, form_basket = None): - _m = 'Model_View_Store.import_JSON_basket_item' - Helper_App.console_log(f'starting {_m}') - # Helper_App.console_log('getting product id') - # product_id = av.input_int(json_data[self.key_id_product], self.key_id_product, _m) - - # Helper_App.console_log(f'product id: {product_id}, type: {str(type(product_id))}') - try: - permutation_id = json_data[self.KEY_ID_PERMUTATION] - av.full_val_int(permutation_id, self.KEY_ID_PERMUTATION, _m) - permutation_id = int(permutation_id) - except: - permutation_id = None - if not permutation_id == 'None': - Helper_App.console_log(f'permutation_id invalid: {permutation_id}') - raise ValueError("Invalid permutation id") - Helper_App.console_log(f'permutation_id: {permutation_id}') - - try: - Helper_App.console_log(f'form_basket: {form_basket}') - Helper_App.console_log('getting quantity') - Helper_App.console_log(f'form_basket.quantity: {form_basket.quantity}') - Helper_App.console_log(f'form_basket.quantity.data: {form_basket.quantity.data}') - quantity = int(form_basket.quantity.data) - except: - quantity = 0 - Helper_App.console_log(f'quantity: {quantity}') - - Helper_App.console_log(f'permutation_id: {permutation_id}\nquantity: {quantity}') - - return permutation_id, quantity - - def output_basket_total(self): - return self.basket.output_total() - - - def init_forms_basket_add(self): - for cat in self.categories: - c = self.category_index - - def get_many_user_order(self, ids_order, n_order_max, id_checkout_session): - # _m = 'Model_View_Store.get_many_user_order' - # av.val_str(id_user) - # validation conducted by server - return DataStore_User().get_many_user_order(self.info_user['sub'], ids_order, n_order_max, id_checkout_session) - - def get_many_plant(self, get_inactive = False): - plants = DataStore_Store_Base().get_many_plant(get_inactive) - return plants - def get_many_storage_location(self, get_inactive = False): - storage_locations = DataStore_Store_Base().get_many_storage_location(get_inactive) - return storage_locations - def get_many_currency(self): - currencies = DataStore_Store_Base().get_many_currency() - return currencies - def get_many_region(self): - regions = DataStore_Store_Base().get_many_region() - return regions - def get_many_region_and_currency(self): - regions, currencies = DataStore_Store_Base().get_many_region_and_currency() - return regions, currencies - - def get_many_product_variation(self, variation_filters = None): - if variation_filters is None: - variation_filters = Parameters_Product_Variation.get_default() - variation_types, variations, errors = DataStore_Store_Base().get_many_product_variation(variation_filters) - return variation_types, variations, errors \ No newline at end of file diff --git a/models/model_view_store_basket.py b/models/model_view_store_basket.py deleted file mode 100644 index a8e965c7..00000000 --- a/models/model_view_store_basket.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Basket View Model - -Description: -Data model for store basket view -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# METHODS - -# IMPORTS -# internal -from models.model_view_store import Model_View_Store -# from routes import bp_home -from business_objects.store.product import Product -from forms.forms import Form_Billing # Form_Product -# external - - -# VARIABLE INSTANTIATION - - -# CLASSES -class Model_View_Store_Basket(Model_View_Store): - # Attributes - # product_categories: list # (str) - form_delivery: Form_Billing - form_billing: Form_Billing - forms_delivery_method: list # [] - is_collapsed_info_billing: bool - is_collapsed_info_delivery: bool - # Global constants - # category_products: dict { category_enum_id: List[Product] } - hash_page_store_checkout = '/store/checkout' - hash_page_store_checkout_session = '/store/checkout_session' - hash_store_basket_info = '/store/basket_info' - id_container_info_billing = 'containerInfoBilling' - id_container_info_delivery = 'containerInfoDelivery' - id_overlay_info_delivery = 'overlayInfoDelivery' - id_overlay_info_billing = 'overlayInfoBilling' - key_address1 = 'address_1' - key_address2 = 'address_2' - key_city = 'city' - key_county = 'county' - key_id_checkout = 'checkout-session-id' - key_info_billing = 'billing-info' - key_info_delivery = 'delivery-info' - key_info_identical = 'identical' - key_info_type = 'type-info' - key_is_subscription = 'is-subscription' - key_name_full = 'name_full' - key_phone_number = 'phone_number' - key_postcode = 'postcode' - key_region = 'region' - key_url_checkout = 'checkout-url' - - # Attributes - @property - def title(self): - return 'Store Basket' - - def __init__(self, id_currency, id_region_delivery, is_included_VAT, hash_page_current=Model_View_Store.HASH_PAGE_STORE_BASKET): - # Constructor - super().__init__(hash_page_current=hash_page_current, id_currency=id_currency, id_region_delivery=id_region_delivery, is_included_VAT=is_included_VAT) - # self.product_categories = Model_View_Store_Basket.get_many_product(get_all_category = True, get_all_product = True) - self.form_billing = Form_Billing() - self.form_billing.form_type_billing_not_delivery = True - self.form_delivery = Form_Billing() - # if logged in: - # else: - self.is_collapsed_info_billing = False - self.is_collapsed_info_delivery = False - """ - self.forms_product = {} - for cat in self.product_categories: - for product in cat: - if len(list(product.variations.keys())) == 0: - new_form = Form_Product() - if new_form.validate_on_submit(): - # Handle form submission - self.add_2_basket(product.id, ) - self.forms[str(product.id)] = new_form - """ \ No newline at end of file diff --git a/models/model_view_store_checkout.py b/models/model_view_store_checkout.py deleted file mode 100644 index e93c49f5..00000000 --- a/models/model_view_store_checkout.py +++ /dev/null @@ -1,71 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Checkout View Model - -Description: -Data model for store checkout view -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# METHODS - -# IMPORTS -# internal -from models.model_view_store import Model_View_Store -from models.model_view_store_basket import Model_View_Store_Basket -# from routes import bp_home -from business_objects.store.product import Product -from forms.forms import Form_Billing # Form_Product -import lib.argument_validation as av -# from datastores.datastore_store_base import DataStore_Store -# external -import os -import stripe - -# VARIABLE INSTANTIATION - - -# CLASSES -class Model_View_Store_Checkout(Model_View_Store_Basket): - # Attributes - key_secret_stripe: str - key_public_stripe: str - # Global constants - key_id_price = 'price_id' - @property - def title(self): - return 'Store Checkout' - - def __init__(self, id_currency, id_region_delivery, is_included_VAT, hash_page_current=Model_View_Store.HASH_PAGE_STORE_CHECKOUT): - # Constructor - super().__init__(hash_page_current=hash_page_current, id_currency=id_currency, id_region_delivery=id_region_delivery, is_included_VAT=is_included_VAT) - self.key_secret_stripe = os.environ.get("KEY_SECRET_STRIPE") - self.key_public_stripe = os.environ.get("KEY_PUBLIC_STRIPE") - - # For sample support and debugging, not required for production: - stripe.set_app_info( - 'stripe-samples/checkout-one-time-payments', - version='0.0.1', - url='https://github.com/stripe-samples/checkout-one-time-payments') - - stripe.api_key = self.key_secret_stripe - - - """ - def create_product(self, product): # _name, product_description): - return DataStore_Store().create_product(product) # _name, product_description) - - def create_price(self, product, currency): - return DataStore_Store().create_price(product, currency) - - def get_many_product_new(self): - return DataStore_Store().get_many_product_new() - - def get_price_id(product_ids): - return DataStore_Store().get_many_id_price(product_ids) - """ diff --git a/models/model_view_store_checkout_success.py b/models/model_view_store_checkout_success.py deleted file mode 100644 index 9edb0d0d..00000000 --- a/models/model_view_store_checkout_success.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Checkout Success View Model - -Description: -Data model for store checkout success view -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# METHODS - -# IMPORTS -# internal -from models.model_view_store import Model_View_Store -from models.model_view_store_checkout import Model_View_Store_Checkout -# from routes import bp_home -from business_objects.store.product import Product -from forms.forms import Form_Billing # Form_Product -import lib.argument_validation as av -# from datastores.datastore_store_base import DataStore_Store -# external -import os - -# VARIABLE INSTANTIATION - - -# CLASSES -class Model_View_Store_Checkout_Success(Model_View_Store_Checkout): - # Attributes - key_secret_stripe: str - key_public_stripe: str - # Global constants - key_id_price = 'price_id' - - @property - def title(self): - return 'Store Checkout Success' - - def __init__(self, id_checkout_session, checkout_items, id_currency, id_region_delivery, is_included_VAT, hash_page_current=Model_View_Store.HASH_PAGE_STORE_CHECKOUT_SUCCESS): - # Constructor - super().__init__(hash_page_current=hash_page_current, id_currency=id_currency, id_region_delivery=id_region_delivery, is_included_VAT=is_included_VAT) - self.checkout_items = checkout_items - self.id_checkout_session = id_checkout_session - self.order = self.get_many_user_order('', 1, id_checkout_session) \ No newline at end of file diff --git a/models/model_view_store_home.py b/models/model_view_store_home.py deleted file mode 100644 index a5bb1b7a..00000000 --- a/models/model_view_store_home.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Home View Model - -Description: -Data model for store home view -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# METHODS - -# IMPORTS -# internal -from models.model_view_store import Model_View_Store -# from routes import bp_home -from business_objects.store.product import Product -from forms.forms import Form_Basket_Add, Form_Basket_Edit # Form_Product -# external -from typing import ClassVar - -# VARIABLE INSTANTIATION - - -# CLASSES -class Model_View_Store_Home(Model_View_Store): - # Global constants - MAX_PRODUCTS_PER_CATEGORY: ClassVar[int] = -1 - # Attributes - product_categories: list # (str) - forms_product: dict - forms_basket: dict - # category_products: dict { category_enum_id: List[Product] } - # Attributes - @property - def title(self): - return 'Store Home' - - def __init__(self, id_currency, id_region_delivery, is_included_VAT, hash_page_current=Model_View_Store.HASH_PAGE_STORE_HOME): - # Constructor - super().__init__(id_currency, id_region_delivery, is_included_VAT) - # self.categories = Model_View_Store_Home.get_many_product(self.db, get_all_category = True, get_all_product = True) - # self.get_many_product(get_all_category = True, get_all_product = True) - """ - self.forms_product = {} - for cat in self.product_categories: - for product in cat: - if len(list(product.variations.keys())) == 0: - new_form = Form_Product() - if new_form.validate_on_submit(): - # Handle form submission - self.add_2_basket(product.id, ) - self.forms[str(product.id)] = new_form - """ - diff --git a/models/model_view_store_manufacturing_purchase_order.py b/models/model_view_store_manufacturing_purchase_order.py deleted file mode 100644 index 0c5693a1..00000000 --- a/models/model_view_store_manufacturing_purchase_order.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Manufacturing Purchase Order View Model - -Description: -Data model for manufacturing purchase order view page -""" - -# internal -from models.model_view_store import Model_View_Store -from datastores.datastore_store_manufacturing_purchase_order import DataStore_Store_Manufacturing_Purchase_Order -from business_objects.store.product import Product, Parameters_Product -from business_objects.store.product_category import Product_Category_Container -from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order, Parameters_Manufacturing_Purchase_Order, Manufacturing_Purchase_Order_Product_Link -from forms.store.manufacturing_purchase_order import Filters_Manufacturing_Purchase_Order -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from typing import ClassVar - -class Model_View_Store_Manufacturing_Purchase_Order(Model_View_Store): - FLAG_QUANTITY_PRODUCED: ClassVar[str] = Manufacturing_Purchase_Order_Product_Link.FLAG_QUANTITY_PRODUCED - FLAG_QUANTITY_USED: ClassVar[str] = Manufacturing_Purchase_Order_Product_Link.FLAG_QUANTITY_USED - category_list_filters: Product_Category_Container = None - currencies: list = None - currency_options: list = None - form_filters: Filters_Manufacturing_Purchase_Order = None - form_filters_old: Filters_Manufacturing_Purchase_Order - manufacturing_purchase_orders: list = None - units_measurement: list = None - units_measurement_time: list = None - variation_types: list = None - variations: list = None - - @property - def title(self): - return 'Store Manufacturing Purchase Order' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS): - _m = 'Model_View_Store_Manufacturing.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) - self.form_filters = form_filters_old # Filters_Manufacturing_Purchase_Order.from_json(form_filters_old.to_json()) - parameters_manufacturing_purchase_order = Parameters_Manufacturing_Purchase_Order.from_filters_manufacturing_purchase_order(form_filters_old) - datastore_manufacturing_purchase_order = DataStore_Store_Manufacturing_Purchase_Order() - self.manufacturing_purchase_orders, errors = datastore_manufacturing_purchase_order.get_many_manufacturing_purchase_order(parameters_manufacturing_purchase_order) - self.category_list_filters, errors = DataStore_Store_Manufacturing_Purchase_Order.get_many_product(Parameters_Product.get_default()) - self.variation_types, self.variations, errors = self.get_many_product_variation() - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - - @classmethod - def save_manufacturing_purchase_orders(cls, comment, list_orders): - _m = f'{cls.__name__}.save_manufacturing_purchase_orders' - return DataStore_Store_Manufacturing_Purchase_Order().save_manufacturing_purchase_orders(comment, list_orders) \ No newline at end of file diff --git a/models/model_view_store_product.py b/models/model_view_store_product.py deleted file mode 100644 index 948b254f..00000000 --- a/models/model_view_store_product.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Product View Model - -Description: -Data model for store product view -""" - -# internal -from business_objects.store.product import Product, Parameters_Product -from business_objects.store.product_category import Product_Category_Container -from datastores.datastore_store_product import DataStore_Store_Product -from forms.access_level import Filters_Access_Level -from forms.store.product import Filters_Product -from helpers.helper_app import Helper_App -from models.model_view_store import Model_View_Store -# from routes import bp_home -import lib.argument_validation as av -# external -from typing import ClassVar - -class Model_View_Store_Product(Model_View_Store): - access_levels: list = None - category_list: Product_Category_Container = None - category_list_filters: Product_Category_Container = None - currencies: list = None - currency_options: list = None - form_filters: Filters_Product = None - form_filters_old: Filters_Product - list_options_product: list = None - # product_blank: Product = None - units_measurement: list = None - units_measurement_time: list = None - variations: list = None - variation_types: list = None - - @property - def title(self): - return 'Products' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_PRODUCTS): - _m = 'Model_View_Store_Product.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) - self.form_filters = form_filters_old - self.access_levels = self.get_many_access_level(Filters_Access_Level()) - parameters_product = Parameters_Product.from_form_filters_product(self.form_filters) - datastore_store = DataStore_Store_Product() - self.category_list, errors = datastore_store.get_many_product(parameters_product) - countProducts = 0 - for category in self.category_list.categories: - countProducts += len(category.products) - Helper_App.console_log(f'category count: {len(self.category_list.categories)}\nproduct count: {countProducts}') - self.category_list_filters, errors_filters = datastore_store.get_many_product( - Parameters_Product( - get_all_product_category = True, - get_inactive_product_category = False, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - ids_image = '', - get_products_quantity_stock_below_min = parameters_product.get_products_quantity_stock_below_min - ) - ) - Helper_App.console_log(f'category filters: {self.category_list_filters.categories}') - self.form_filters.id_category.choices += [(str(category.id_category), category.name) for category in self.category_list_filters.categories] - Helper_App.console_log(f'category options: {self.form_filters.id_category.choices}') - self.variation_types, self.variations, errors = self.get_many_product_variation() - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - - Helper_App.console_log(f'category count: {len(self.category_list.categories)}\nproduct count: {countProducts}') - @staticmethod - def save_products(comment, list_products): - _m = 'Model_View_Store_Product.save_products' - return DataStore_Store_Product.save_products(comment, list_products) \ No newline at end of file diff --git a/models/model_view_store_product_category.py b/models/model_view_store_product_category.py deleted file mode 100644 index 2ef26582..00000000 --- a/models/model_view_store_product_category.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Permutations View Model - -Description: -Data model for store permutations view -""" - -# internal -from models.model_view_store import Model_View_Store -# from datastores.datastore_store_base import DataStore_Store_Base -from datastores.datastore_store_product_category import DataStore_Store_Product_Category -from business_objects.store.product import Parameters_Product -from business_objects.store.product_category import Product_Category_Container # , Filters_Product_Category -from forms.access_level import Filters_Access_Level -# from forms.store.product_permutation import Filters_Product_Permutation -from forms.store.product_category import Filters_Product_Category -# from routes import bp_home -from helpers.helper_app import Helper_App -import lib.argument_validation as av - -# external -from pydantic import BaseModel -from typing import ClassVar - -class Model_View_Store_Product_Category(Model_View_Store): - # KEY_CATEGORIES: ClassVar[str] = 'categories' - - access_levels: list = None - category_list: Product_Category_Container = None # (str) - # filters_category: Filters_Product_Category - form_filters: Filters_Product_Category = None - form_filters_old: Filters_Product_Category - - @property - def title(self): - return 'Product Category' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_PRODUCT_CATEGORIES): - _m = 'Model_View_Store_Product_Category.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) # filters_category=filters_category) - self.form_filters = form_filters_old - # BaseModel.__init__(self, app=app, filters_product=filters_product, **kwargs) - self.access_levels = self.get_many_access_level(Filters_Access_Level()) - datastore_store = DataStore_Store_Product_Category() - # self.form_filters = Filters_Product_Category.from_filters(filters_category) - filters_product = Parameters_Product.from_filters_product_category(self.form_filters) - self.category_list, errors = datastore_store.get_many_product(filters_product) - - @classmethod - def save_categories(cls, comment, list_categories): - _m = f'{cls.__name__}.save_categories' - return DataStore_Store_Product_Category().save_categories(comment, list_categories) \ No newline at end of file diff --git a/models/model_view_store_product_permutation.py b/models/model_view_store_product_permutation.py deleted file mode 100644 index 24e5fe2e..00000000 --- a/models/model_view_store_product_permutation.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Permutations View Model - -Description: -Data model for store permutations view -""" - -# internal -from models.model_view_store import Model_View_Store -from datastores.datastore_store_product_permutation import DataStore_Store_Product_Permutation -from business_objects.store.product_category import Product_Category_Container -from forms.store.product_permutation import Filters_Product_Permutation -# from routes import bp_home -from business_objects.store.product import Product, Parameters_Product, Product_Permutation -from helpers.helper_app import Helper_App -import lib.argument_validation as av - -# external -from pydantic import BaseModel -from typing import ClassVar - -class Model_View_Store_Product_Permutation(Model_View_Store): - category_list: Product_Category_Container = None - category_list_filters: Product_Category_Container = None - currencies: list = None - currency_options: list = None - # filters_product: Parameters_Product = None - form_filters: Filters_Product_Permutation = None - form_filters_old: Filters_Product_Permutation - list_options_product: list = None - units_measurement: list = None - units_measurement_time: list = None - variations: list = None - variation_types: list = None - - @property - def title(self): - return 'Product Permutations' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS): - _m = 'Model_View_Store_Permutation.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) - self.form_filters = form_filters_old - # self.form_filters = Filters_Product_Permutation() - filters_product = Parameters_Product.from_form_filters_product_permutation(self.form_filters) - datastore_store = DataStore_Store_Product_Permutation() - self.category_list, errors = datastore_store.get_many_product(filters_product) - self.category_list_filters, errors_filters = datastore_store.get_many_product( - Parameters_Product( - get_all_product_category = True, - get_inactive_product_category = False, - ids_product_category = '', - get_all_product = True, - get_inactive_product = False, - ids_product = '', - get_all_permutation = True, - get_inactive_permutation = False, - ids_permutation = '', - get_all_image = False, - get_inactive_image = False, - ids_image = '', - get_products_quantity_stock_below_min = filters_product.get_products_quantity_stock_below_min - ) - ) - Helper_App.console_log(f'category filters: {self.category_list_filters.categories}') - self.form_filters.id_category.choices += [(str(category.id_category), category.name) for category in self.category_list_filters.categories] - Helper_App.console_log(f'category options: {self.form_filters.id_category.choices}') - self.list_options_product = self.category_list_filters.to_product_option_list() - Helper_App.console_log(f'product options: {self.list_options_product}') - self.form_filters.id_product.choices += [(str(product['value']), product['text']) for product in self.list_options_product] - self.variation_types, self.variations, errors = self.get_many_product_variation() - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - - @staticmethod - def save_permutations(comment, list_permutations): - _m = 'Model_View_Store_Permutation.save_permutations' - DataStore_Store_Product_Permutation.save_permutations(comment, list_permutations) \ No newline at end of file diff --git a/models/model_view_store_product_variation.py b/models/model_view_store_product_variation.py deleted file mode 100644 index cf4de7f0..00000000 --- a/models/model_view_store_product_variation.py +++ /dev/null @@ -1,54 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Product View Model - -Description: -Data model for store product view -""" - -# IMPORTS -# VARIABLE INSTANTIATION -# METHODS - -# IMPORTS -# internal -from business_objects.store.product_variation import Product_Variation, Parameters_Product_Variation -from business_objects.store.product_category import Product_Category_Container -from datastores.datastore_store_product_variation import DataStore_Store_Product_Variation -from forms.access_level import Filters_Access_Level -from forms.store.product_variation import Filters_Product_Variation -from helpers.helper_app import Helper_App -from models.model_view_store import Model_View_Store -# from routes import bp_home -import lib.argument_validation as av -# external -from typing import ClassVar - - -class Model_View_Store_Product_Variation(Model_View_Store): - form_filters: Filters_Product_Variation = None - form_filters_old: Filters_Product_Variation - variation_types: list = None - variations: list = None - - @property - def title(self): - return 'Store Product Variation' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_PRODUCT_VARIATIONS): - _m = 'Model_View_Store_Product_Variation.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) - self.form_filters = form_filters_old - parameters_variation = Parameters_Product_Variation.from_filters_product_variation(self.form_filters) - datastore_variation = DataStore_Store_Product_Variation() - self.variation_types, self.variations, errors = datastore_variation.get_many_product_variation(parameters_variation) - - @classmethod - def save_product_variations(cls, comment, list_orders): - _m = f'{cls.__name__}.save_product_variations' - return DataStore_Store_Product_Variation().save_product_variations(comment, list_orders) \ No newline at end of file diff --git a/models/model_view_store_stock_item.py b/models/model_view_store_stock_item.py deleted file mode 100644 index 0976295b..00000000 --- a/models/model_view_store_stock_item.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Store Stock Items View Model - -Description: -Data model for store stock items view -""" - -# internal -from models.model_view_store import Model_View_Store -from datastores.datastore_store_stock_item import DataStore_Store_Stock_Item -from business_objects.store.product_category import Product_Category_Container -# from routes import bp_home -from business_objects.store.product import Product, Parameters_Product, Product_Permutation -from business_objects.store.stock_item import Stock_Item, Parameters_Stock_Item -from forms.store.stock_item import Filters_Stock_Item -from helpers.helper_app import Helper_App -import lib.argument_validation as av - -# external -from pydantic import BaseModel -from typing import ClassVar - -class Model_View_Store_Stock_Item(Model_View_Store): - category_list: Product_Category_Container = None - category_list_filters: Product_Category_Container = None - currencies: list = None - currency_options: list = None - form_filters: Filters_Stock_Item = None - form_filters_old: Filters_Stock_Item - list_options_product: list = None - plants: list = None - storage_locations: list = None - units_measurement: list = None - units_measurement_time: list = None - variations: list = None - variation_types: list = None - - @property - def title(self): - return 'Store Stock Items' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_STOCK_ITEMS): - _m = 'Model_View_Store_Stock_Item.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) - # BaseModel.__init__(self, app=app, form_filters_old=form_filters_old, **kwargs) - self.form_filters = form_filters_old # Filters_Stock_Item.from_json(form_filters_old.to_json()) # .from_form_stock_item(form_filters_old) - datastore_store = DataStore_Store_Stock_Item() - tmp_category_list_stock_item, errors = datastore_store.get_many_product(Parameters_Product.from_filters_stock_item(self.form_filters)) - self.category_list, errors = datastore_store.get_many_stock_item(Parameters_Stock_Item.from_form_stock_item(self.form_filters), tmp_category_list_stock_item) - self.category_list_filters, errors_filters = datastore_store.get_many_product(Parameters_Product.get_default()) - """ - Parameters_Stock_Item( - # self.info_user['sub'], - True, False, False, '', # get_all_category, get_inactive_category, get_first_category_only, ids_category - True, False, False, '', # get_all_product, get_inactive_product, get_first_product_only, ids_product - True, False, False, '', # get_all_permutation, get_inactive_permutation, get_first_permutation_only, ids_permutation - False, False, False, '', # get_all_stock_item, get_inactive_stock_item, get_first_stock_item_only, ids_stock_item - False, False, False, '', # get_all_region_storage, get_inactive_region_storage, get_first_region_storage_only, ids_region_storage - False, False, False, '', # get_all_plant_storage, get_inactive_plant_storage, get_first_plant_storage_only, ids_plant_storage - False, False, False, '', # get_all_location_storage, get_inactive_location_storage, get_first_location_storage_only, ids_location_storage - None, # date_received_to - False, False, # get_sealed_stock_item_only, get_unsealed_stock_item_only - False, False, # get_expired_stock_item_only, get_nonexpired_stock_item_only - False, False # get_consumed_stock_item_only, get_nonconsumed_stock_item_only - ) - """ - - Helper_App.console_log(f'category_list_filters: {self.category_list_filters.categories}') - self.form_filters.id_category.choices += [(str(category.id_category), category.name) for category in self.category_list_filters.categories] # [Filters_Stock_Item.get_choice_all()] + - Helper_App.console_log(f'category options: {self.form_filters.id_category.choices}') - product_list = self.category_list_filters.to_product_option_list() - filtered_product_list = [] - if product_list is not None: - for product in product_list: - # Helper_App.console_log(f'product: {product}\n{product[Stock_Item.ATTR_ID_PRODUCT_CATEGORY]}\n{self.form_filters.id_category.data}\n{str(type(product[Stock_Item.ATTR_ID_PRODUCT_CATEGORY]))}\n{str(type(self.form_filters.id_category.data))}') - if (self.form_filters.id_category.data == '' or str(product[Stock_Item.ATTR_ID_PRODUCT_CATEGORY]) == self.form_filters.id_category.data): - filtered_product_list.append(product) - Helper_App.console_log(f'product_list: {product_list}\nfiltered_product_list: {filtered_product_list}') - self.form_filters.id_product.choices += [(str(product['value']), product['text']) for product in filtered_product_list] # [Filters_Stock_Item.get_choice_all()] + - # self.form_filters.import_values(form_filters_old) - self.variation_types, self.variations, errors = self.get_many_product_variation() - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - self.plants = self.get_many_plant(False) - self.storage_locations = self.get_many_storage_location(False) - - @classmethod - def save_stock_items(cls, comment, list_stock_items): - _m = f'{cls.__name__}.save_stock_items' - return DataStore_Store_Stock_Item().save_stock_items(comment, list_stock_items) \ No newline at end of file diff --git a/models/model_view_store_supplier.py b/models/model_view_store_supplier.py deleted file mode 100644 index f44cae90..00000000 --- a/models/model_view_store_supplier.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Supplier View Model - -Description: -Data model for supplier view page -""" - -# internal -from models.model_view_store import Model_View_Store -from datastores.datastore_store_supplier import DataStore_Store_Supplier -from business_objects.store.supplier import Supplier, Parameters_Supplier -from forms.store.supplier import Filters_Supplier -from helpers.helper_app import Helper_App -import lib.argument_validation as av -# external -from typing import ClassVar - -class Model_View_Store_Supplier(Model_View_Store): - FLAG_DEPARTMENT_CONTACT: ClassVar[str] = Supplier.FLAG_DEPARTMENT_CONTACT - FLAG_NAME_COMPANY: ClassVar[str] = Supplier.FLAG_NAME_COMPANY - FLAG_NAME_CONTACT: ClassVar[str] = Supplier.FLAG_NAME_CONTACT - supplier_addresses: list = None - currencies: list = None - currency_options: list = None - form_filters: Filters_Supplier = None - form_filters_old: Filters_Supplier - regions: list = None - suppliers: list = None - units_measurement: list = None - units_measurement_time: list = None - - @property - def title(self): - return 'Store Supplier' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_SUPPLIERS): - _m = 'Model_View_Store_Supplier.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) - self.form_filters = form_filters_old # Filters_Supplier.from_json(form_filters_old.to_json()) - parameters_supplier = Parameters_Supplier.from_filters_supplier(self.form_filters) - datastore_supplier = DataStore_Store_Supplier() - self.suppliers, errors = datastore_supplier.get_many_supplier(parameters_supplier) - - """ - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - """ - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - self.supplier_addresses = {} - for supplier in self.suppliers: - self.supplier_addresses[supplier.id_supplier] = [address.to_json() for address in supplier.addresses] if supplier.addresses else [] - self.regions = self.get_many_region() - @classmethod - def save_suppliers(cls, comment, list_suppliers): - _m = f'{cls.__name__}.save_suppliers' - return DataStore_Store_Supplier().save_suppliers(comment, list_suppliers) \ No newline at end of file diff --git a/models/model_view_store_supplier_purchase_order.py b/models/model_view_store_supplier_purchase_order.py deleted file mode 100644 index 86b0e3d1..00000000 --- a/models/model_view_store_supplier_purchase_order.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Project: PARTS Website -Author: Edward Middleton-Smith - Precision And Research Technology Systems Limited - -Technology: View Models -Feature: Supplier Purchase Order View Model - -Description: -Data model for supplier purchase order view page -""" - -# internal -from models.model_view_store import Model_View_Store -from datastores.datastore_store_supplier import DataStore_Store_Supplier -from datastores.datastore_store_supplier_purchase_order import DataStore_Store_Supplier_Purchase_Order -from business_objects.store.product import Product, Parameters_Product -from business_objects.store.product_category import Product_Category_Container -from business_objects.store.supplier import Supplier, Parameters_Supplier -from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order, Parameters_Supplier_Purchase_Order -from forms.store.supplier_purchase_order import Filters_Supplier_Purchase_Order -from helpers.helper_app import Helper_App -import lib.argument_validation as av - -class Model_View_Store_Supplier_Purchase_Order(Model_View_Store): - category_list_filters: Product_Category_Container = None - currencies: list = None - currency_options: list = None - form_filters: Filters_Supplier_Purchase_Order = None - form_filters_old: Filters_Supplier_Purchase_Order - supplier_purchase_orders: list = None - suppliers: list = None - units_measurement: list = None - units_measurement_time: list = None - variation_types: list = None - variations: list = None - - @property - def title(self): - return 'Store Supplier Purchase Order' - - def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS): - _m = 'Model_View_Store_Supplier.__init__' - Helper_App.console_log(f'{_m}\nstarting...') - super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) - self.form_filters = form_filters_old # Filters_Supplier_Purchase_Order.from_json(form_filters_old.to_json()) - parameters_supplier_purchase_order = Parameters_Supplier_Purchase_Order.from_filters_supplier_purchase_order(self.form_filters) - datastore_supplier_purchase_order = DataStore_Store_Supplier_Purchase_Order() - self.supplier_purchase_orders, errors = datastore_supplier_purchase_order.get_many_supplier_purchase_order(parameters_supplier_purchase_order) - - self.suppliers, errors = DataStore_Store_Supplier.get_many_supplier(Parameters_Supplier.get_default()) - self.category_list_filters, errors = DataStore_Store_Supplier_Purchase_Order.get_many_product(Parameters_Product.get_default()) - self.variation_types, self.variations, errors = self.get_many_product_variation() - self.units_measurement = self.get_many_unit_measurement() - self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] - self.currencies = self.get_many_currency() - self.currency_options = [currency.to_json_option() for currency in self.currencies] - - @classmethod - def save_supplier_purchase_orders(cls, comment, list_orders): - _m = f'{cls.__name__}.save_supplier_purchase_orders' - return DataStore_Store_Supplier_Purchase_Order().save_supplier_purchase_orders(comment, list_orders) \ No newline at end of file diff --git a/models/model_view_user.py b/models/model_view_user.py index eb851254..b5a9e446 100644 --- a/models/model_view_user.py +++ b/models/model_view_user.py @@ -12,13 +12,12 @@ Data model for user view # internal from datastores.datastore_user import DataStore_User -# from models.model_view_base import Model_View_Base -from models.model_view_store import Model_View_Store +from models.model_view_base import Model_View_Base # from routes import bp_home # external from typing import ClassVar -class Model_View_User(Model_View_Store): +class Model_View_User(Model_View_Base): FLAG_ERROR_OAUTH: ClassVar[str] = 'error' FLAG_ERROR_DESCRIPTION_OAUTH: ClassVar[str] = 'error_description' FLAG_FIRSTNAME: ClassVar[str] = 'firstname' @@ -32,7 +31,7 @@ class Model_View_User(Model_View_Store): def title(self): return 'User' - def __init__(self, hash_page_current=Model_View_Store.HASH_PAGE_USER_ACCOUNT): + def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_USER_ACCOUNT): # Constructor super().__init__(hash_page_current=hash_page_current, form_filters_old = None) datastore_user = DataStore_User() diff --git a/package-lock.json b/package-lock.json index 02310043..8b32eaea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "app", "version": "1.0.0", "license": "ISC", + "dependencies": { + "aos": "^2.3.4" + }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/plugin-syntax-dynamic-import": "^7.8.3", @@ -26,6 +29,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -35,12 +39,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -48,30 +54,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -86,64 +94,46 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -151,27 +141,19 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -181,23 +163,15 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -207,20 +181,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -233,41 +199,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -277,35 +245,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -315,14 +286,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -331,108 +303,87 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -442,13 +393,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -458,12 +410,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -473,12 +426,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -488,14 +442,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -505,13 +460,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -525,45 +481,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -576,6 +494,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -583,25 +502,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -611,138 +519,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -756,6 +539,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -768,12 +552,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -783,15 +568,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -801,14 +586,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -818,12 +604,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -833,12 +620,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -848,13 +636,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -864,14 +653,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -881,16 +670,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -901,13 +691,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -917,12 +708,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -932,13 +724,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -948,12 +741,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -963,13 +757,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -979,13 +774,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -995,13 +790,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1011,13 +806,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1027,13 +822,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1043,14 +839,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1060,13 +857,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1076,12 +873,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1091,13 +889,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1107,12 +905,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1122,13 +921,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1138,14 +938,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1155,15 +955,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1173,13 +974,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1189,13 +991,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1205,12 +1008,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1220,13 +1024,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1236,13 +1040,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1252,15 +1056,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1270,13 +1074,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1286,13 +1091,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1302,14 +1107,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1319,12 +1124,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1334,13 +1140,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1350,15 +1157,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1368,12 +1175,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1383,12 +1191,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1398,13 +1207,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1414,12 +1241,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1429,13 +1257,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1445,12 +1274,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1460,12 +1290,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1475,12 +1306,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1490,12 +1322,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1505,13 +1338,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1521,13 +1355,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1537,13 +1372,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1553,93 +1389,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", - "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -1649,20 +1472,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -1672,17 +1487,12 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1691,30 +1501,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1723,14 +1535,14 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1741,6 +1553,7 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -1750,6 +1563,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1763,10 +1577,11 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1781,6 +1596,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1790,6 +1606,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1799,6 +1616,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -1808,192 +1626,224 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "optional": true, - "engines": { - "node": ">=14" + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "22.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.20.0" } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2002,6 +1852,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -2015,6 +1866,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -2028,6 +1880,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -2045,19 +1898,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2065,25 +1921,17 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2095,6 +1943,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -2107,35 +1956,17 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/ansi-regex": { @@ -2143,6 +1974,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2151,22 +1983,35 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aos": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", + "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", + "license": "MIT", + "dependencies": { + "classlist-polyfill": "^1.0.3", + "lodash.debounce": "^4.0.6", + "lodash.throttle": "^4.0.1" } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -2179,87 +2024,27 @@ "webpack": ">=5" } }, - "node_modules/babel-loader/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/babel-loader/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/babel-loader/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.10.6", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2", "core-js-compat": "^3.38.0" @@ -2269,12 +2054,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -2284,21 +2070,23 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -2314,11 +2102,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2331,12 +2120,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -2351,57 +2141,31 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + ], + "license": "CC-BY-4.0" }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, + "node_modules/classlist-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", + "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==", + "license": "Unlicense" + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -2412,51 +2176,61 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -2464,10 +2238,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2482,6 +2257,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -2512,11 +2288,25 @@ } } }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -2525,10 +2315,11 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2545,25 +2336,29 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.18", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", - "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==", - "dev": true + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2573,10 +2368,11 @@ } }, "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -2585,34 +2381,28 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2626,6 +2416,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2638,6 +2429,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2647,6 +2439,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2656,6 +2449,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2665,6 +2459,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -2673,25 +2468,39 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", + "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } @@ -2701,6 +2510,7 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, + "license": "MIT", "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -2712,11 +2522,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/find-up": { + "node_modules/find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -2728,93 +2539,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -2824,6 +2554,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -2840,6 +2571,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2849,15 +2581,17 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^4.0.1", @@ -2880,13 +2614,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2895,13 +2631,15 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2911,6 +2649,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2923,6 +2662,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -2935,6 +2675,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2949,20 +2690,101 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -2978,6 +2800,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2987,6 +2810,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -2998,22 +2822,25 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -3022,9 +2849,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jest-worker": { @@ -3032,6 +2856,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -3045,37 +2870,42 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -3088,6 +2918,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3097,33 +2928,45 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -3132,13 +2975,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3148,6 +2993,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3156,10 +3002,11 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", - "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -3175,64 +3022,12 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/minimatch": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3248,6 +3043,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3256,12 +3052,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -3269,6 +3066,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -3280,39 +3078,46 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -3320,23 +3125,26 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-key": { @@ -3344,6 +3152,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3352,13 +3161,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -3371,36 +3182,42 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", - "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", "dev": true, + "license": "ISC", "engines": { "node": "20 || >=22" } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "find-up": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -3416,10 +3233,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3430,6 +3248,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -3438,13 +3257,14 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -3455,12 +3275,13 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -3474,6 +3295,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -3485,10 +3307,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3501,13 +3324,15 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3517,6 +3342,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -3526,6 +3352,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -3537,13 +3364,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -3555,27 +3384,30 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -3583,25 +3415,37 @@ "node": ">=4" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/require-from-string": { @@ -3609,23 +3453,28 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3635,6 +3484,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -3647,6 +3497,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3669,17 +3520,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -3690,15 +3544,13 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/serialize-javascript": { @@ -3706,6 +3558,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -3715,6 +3568,7 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -3727,6 +3581,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3739,6 +3594,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3748,6 +3604,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -3760,6 +3617,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3769,6 +3627,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3778,6 +3637,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3788,6 +3648,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3806,6 +3667,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3820,6 +3682,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3828,13 +3691,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3847,6 +3712,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3863,6 +3729,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3875,6 +3742,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3884,6 +3752,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18.12.0" }, @@ -3900,6 +3769,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3915,6 +3785,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3927,15 +3798,17 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", - "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -3950,16 +3823,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -3983,26 +3857,19 @@ } } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4012,6 +3879,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -4021,10 +3889,11 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4034,14 +3903,15 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -4057,9 +3927,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -4073,6 +3944,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -4081,13 +3953,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -4097,18 +3971,19 @@ } }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -4147,6 +4022,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -4192,6 +4068,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -4201,6 +4078,7 @@ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -4215,15 +4093,70 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4238,13 +4171,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -4263,6 +4198,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4280,6 +4216,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4289,6 +4226,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4299,35 +4237,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4342,6 +4264,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4349,29 +4272,19 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, diff --git a/package.json b/package.json index 9aa4ab71..3497ad3e 100644 --- a/package.json +++ b/package.json @@ -33,5 +33,8 @@ "style-loader": "^4.0.0", "webpack": "^5.94.0", "webpack-cli": "^5.1.4" + }, + "dependencies": { + "aos": "^2.3.4" } } diff --git a/static/css/components/button.css b/static/css/components/button.css index 3243556c..fb55ad03 100644 --- a/static/css/components/button.css +++ b/static/css/components/button.css @@ -1,24 +1,31 @@ - -button, .button-submit, input[type="submit"] { - font-size: 20px; - font-weight: bold; - border: 4px solid; - border-radius: 2vh; - padding: 1vh 2vh 1vh 2vh; - margin: 0.5vh; - background-color: var(--c_purple_pastel); - color: var(--c_purple_dark); - border-color: var(--c_purple_dark); +.button { + display: inline-block; + padding: 0.75rem 1.5rem; + border-radius: 6px; + text-decoration: none; + font-weight: 500; + transition: all 0.3s ease; + width: fit-content; } -button.navContactUs { - border: 4px solid var(--c_purple_dark); - background-color: var(--c_purple_pastel); - color: var(--c_purple_dark) !important; - border-radius: 2vh; - width: 180px !important; +.button-primary { + background: var(--primary); + color: white; } -button:hover, input[type="submit"]:hover { - text-decoration: underline; +.button-primary:hover { + background: var(--secondary); } + +.button-light { + background: white; + color: var(--primary); +} + +.button-light:hover { + background: var(--light); +} + +.logo:hover{ + cursor: pointer; +} \ No newline at end of file diff --git a/static/css/components/card.css b/static/css/components/card.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/components/dialog.css b/static/css/components/dialog.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/components/form.css b/static/css/components/form.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/components/image.css b/static/css/components/image.css deleted file mode 100644 index 589ed1c1..00000000 --- a/static/css/components/image.css +++ /dev/null @@ -1,4 +0,0 @@ - -img, video { - border-radius: 3vh; -} diff --git a/static/css/components/label.css b/static/css/components/label.css deleted file mode 100644 index b1c40294..00000000 --- a/static/css/components/label.css +++ /dev/null @@ -1,26 +0,0 @@ - -h1 { - font-size: min(24px, calc(1vh * 6)); -} - -h2 { - font-size: min(20px, calc(1vh * 5)); -} - -h3 { - font-size: min(16px, calc(1vh * 4)); - margin-top: 1vh; -} - -h4 { - font-size: 13px; - margin: 1vh; - text-align: center; - margin-left: auto; - margin-right: auto; -} - -h5 { - font-size: 11px; - margin: 1vh; -} diff --git a/static/css/components/modal.css b/static/css/components/modal.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/components/navigation.css b/static/css/components/navigation.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/components/overlay.css b/static/css/components/overlay.css deleted file mode 100644 index 6ad963a6..00000000 --- a/static/css/components/overlay.css +++ /dev/null @@ -1,86 +0,0 @@ - - -/* Overlay modal */ -.overlay { - /* - display: none; - */ - position: fixed; - top: 15vh; - right: 0; - width: 100px; - /* height: 50%; */ - background: var(--c_purple_pastel); - justify-content: right; - align-items: right; - align-self: right; - z-index: 999; -} -.overlay.expanded { - display: block; -} -.collapsed { - display: none; -} - -/* Hamburger menu overlay */ -#buttonHamburger:hover { - text-decoration: none; -} -#overlayHamburger { - overflow-x: hidden; - overflow-y: auto; - max-height: 80%; -} -.hamburger { - border: 2px solid var(--c_purple_dark); - border-radius: 4px; -} -.hamburger:first-child { - border-top-left-radius: 12px; - border-top-right-radius: 12px; -} -.hamburger:last-child { - border-bottom-left-radius: 12px; - border-bottom-right-radius: 12px; -} - -.hamburger > * { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - width: 100%; - color: var(--c_purple_dark); - font-weight: bold; - font-size: 18px; - /* height: 18px; */ -} -.hamburger > :hover { - background-color: var(--c_purple_light); - color: var(--c_purple_dark); -} -.hamburger > * > * { - width: 100%; - /* - margin-top: 4.5px; - margin-bottom: 4.5px; - */ -} -.hamburger > .container { - padding-top: 4.5px; - padding-bottom: 4.5px; -} - -#overlayHamburger .row *:hover { - text-decoration: underline; -} - -/* Confirm overlay */ -#overlayConfirm { - position: absolute; - left: 25vw; - width: 50vw; - height: 50vh; -} \ No newline at end of file diff --git a/static/css/components/table.css b/static/css/components/table.css deleted file mode 100644 index a93db554..00000000 --- a/static/css/components/table.css +++ /dev/null @@ -1,66 +0,0 @@ - -#formFilters .container { - max-width: fit-content; -} - -thead, tbody { - padding-top: 0px !important; - padding-bottom: 0px !important; -} - -th { - background-color: var(--c_purple_pastel); -} -td { - font-size: min(12px, calc(1vh * 3)); -} - -th, td { - min-width: fit-content; -} -tr:not(:last-child) > td { - border-bottom: 1px dashed var(--c_purple_dark); -} -td > table > tbody > tr > td { - border: none !important; -} -th.collapsed, td.collapsed { - display: table-cell !important; -} -td.dirty { - background-color: var(--c_purple_dark); -} -td:not(.dirty) { - /* color: var(--c_purple_dark); */ - background-color: var(--c_purple_pastel); -} - -tr { - min-height: 1px; - border-bottom: 1px solid var(--c_purple_dark); - border-top: 1px solid var(--c_purple_dark); - background-color: transparent; -} - -/* -.row-new { - visibility: hidden; -} -*/ - -table button { - margin: 0.25vh; - padding: 0.5vh 1vh; -} - -table button.active { - background-color: var(--c_purple_pastel); -} - -tr.delete, tr.delete > td { - background-color: red; -} - -table div { - align-content: center; -} \ No newline at end of file diff --git a/static/css/layouts/footer.css b/static/css/layouts/footer.css index 8493cada..7ab45171 100644 --- a/static/css/layouts/footer.css +++ b/static/css/layouts/footer.css @@ -1,23 +1,57 @@ -/* Footer */ .footer { - padding: 1vh; - padding-left: 1vw; - padding-right: 1vw; - text-align: center; - margin: 0; - height: 8vh !important; - overflow-y: auto; - background-color: var(--c_purple_pastel); - border-top-left-radius: 2.5vh; - border-top-right-radius: 2.5vh; - position: absolute; - /* top: 2.5vh; */ - bottom: 0; - width: 98vw; + background: #1f2937; + color: #f3f4f6; + padding: 4rem 0 2rem; } -.footer > h4, h5 { +.footer-content { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; + margin-bottom: 2rem; +} + +.footer-section h3 { + color: #fff; + margin-bottom: 1rem; + font-size: 1.2rem; +} + +.footer-section ul { + list-style: none; padding: 0; - margin: 0; +} + +.footer-section ul li { + margin-bottom: 0.5rem; +} + +.footer-section a { + color: #f3f4f6; + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-section a:hover { + color: #fff; + text-decoration: underline; +} + +.footer-bottom { + border-top: 1px solid #374151; + padding-top: 2rem; + text-align: center; + font-size: 0.9rem; +} + +.footer-bottom a { + color: aquamarine; +} + +@media (max-width: 768px) { + .footer-content { + grid-template-columns: 1fr; + text-align: center; + } } \ No newline at end of file diff --git a/static/css/layouts/header.css b/static/css/layouts/header.css index eb486b3b..a0d16567 100644 --- a/static/css/layouts/header.css +++ b/static/css/layouts/header.css @@ -1,104 +1,37 @@ - -/* Navigation */ -.topnav { - border-bottom-left-radius: 2.5vh; - border-bottom-right-radius: 2.5vh; - display: flex; - flex-wrap: wrap; - flex: 1; - flex-direction: row; - font-weight: bold; - font-size: 1vh; - max-height: 15vh; - height: 15vh; - align-items: flex-start; -} -.topnav a, .topnav label, .topnav p, .topnav h1 { - float: left; - display: flex; - color: white; - text-align: center; - text-decoration: none; +header { + background: white; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + /* position: fixed; + top: 0; */ width: 100%; - max-height: 15vh; - font-weight: normal; - justify-content: center; -} -.topnav a:hover { - background-color: var(--c_purple_light); - color: var(--c_purple_dark); + z-index: 1000; } -.topnav > .container { - max-width: 50%; - height: 100%; - align-items: center; - align-self: center; - /* align-content: center; */ - /* width: fit-content; */ +.navbar { display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; } -.topnav select { - padding: 1vh; - margin: 1vh; - border-radius: 1vh; - /* background-color: var(--c_purple_light); */ - color: var(--c_purple_dark); - border: 2px solid white; + +.logo { + font-size: 1.5rem; font-weight: bold; - text-align: center; -} -.topnav select .collapsed { - width: 5vw; -} -.topnav select .expanded { - width: 25vw; + color: var(--primary); } -.company-name { - font-size: min(28px, calc(1vh * 7)); +.nav-links { + display: flex; + gap: 2rem; +} + +.nav-links a { + text-decoration: none; + color: var(--text); + font-weight: 500; + align-content: center; +} +.nav-links a.button { color: white; -} -@media screen and (max-width: 450px) { - .company-name { - font-size: min(24px, calc(1vh * 7)); - } -} - -/* Page Filters */ -#formFilters * { - font-size: 12px; -} - -#formFilters .container { - max-width: fit-content; -} -#formFilters .container-input { - padding: 0 0.5vh; -} - -#formFilters .container-input input { - max-width: 5vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} -#formFilters .container-input.filter.is_not_empty { - width: 12vh; -} - -button.collapsed { - display: block; - opacity: 0; -} - -form.filter button.save, form.filter button.button-cancel { - margin-top: 0; - margin-bottom: 0; -} -form.filter button.save, form.filter button.button-cancel { - margin-top: 0; - margin-bottom: 0; } \ No newline at end of file diff --git a/static/css/layouts/table-main.css b/static/css/layouts/table-main.css deleted file mode 100644 index c4628d34..00000000 --- a/static/css/layouts/table-main.css +++ /dev/null @@ -1,41 +0,0 @@ - -#tableMain { - overflow-x: auto; - padding: 1vh; - max-width: 95vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ - width: fit-content; - margin: 1vh 2vh; - align-items: normal; - justify-content: normal; -} - -#tableMain * { - padding: 0.25vh 0.5vh; -} - -#tableMain select, #tableMain input:not([type="checkbox"]), #tableMain textarea, #tableMain div { - box-sizing: border-box; - width: 100%; - height: 100%; -} - -#tableMain thead tr th, #tableMain tbody tr td { - width: 20vh; - min-width: 20vh; - padding: 0 0.5vh; -} -#tableMain tbody tr td { - height: 5vh; - padding-top: 0.5vh; -} -#tableMain tbody tr:not(:last-of-type) td { - padding-bottom: 0.5vh; -} -#tableMain thead tr th.active, #tableMain tbody tr td.active { - width: 6vh; - min-width: 6vh; -} -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} diff --git a/static/css/lib/utils.css b/static/css/lib/utils.css index e69de29b..d2aba3e8 100644 --- a/static/css/lib/utils.css +++ b/static/css/lib/utils.css @@ -0,0 +1,22 @@ +.text-center { + text-align: center; +} + +.section-title { + font-size: 2rem; + margin-bottom: 1rem; +} + +.section-subtitle { + margin-bottom: 2rem; +} + +@media (max-width: 768px) { + .hero h1 { + font-size: 2.5rem; + } + + .nav-links { + display: none; + } +} \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css index b56c8995..84180ab7 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -1,282 +1,33 @@ :root { - /* Declare global variables */ - --c_purple: #5B29FF; - --c_purple_pastel: #D1D1FF; - --c_purple_light: #C6BDFF; - --c_purple_dark: #4700B3; - --c_blue: #0044FF; - --c_blue_pastel: #B8E0FF; - --c_blue_light: #73E8FF; - --c_blue_dark: #003ADB; -} - -html { - height: 100%; -} - -body { - background-color: var(--background-color); - color: var(--text-color); - font-family: var(--font-family-base); - font-family: Arial; - padding: 0; - margin: 0; - border: 0; - background: linear-gradient(to bottom right, var(--c_purple), #dc2430); /* var(--c_purple_pastel); */ - height: 100vh; - max-height: 100%; + --primary: #2563eb; + --secondary: #1e40af; + --text: #1f2937; + --subheading: #4b5563; + --light: #f3f4f6; } * { margin: 0; -} - -script, link { - display: none !important; -} - -#pageBody { - height: 69vh !important; - padding: 1vh; - padding-left: 1vw; - padding-right: 1vw; - margin: 1vh; - margin-left: 0; - margin-right: 0; - border: 0; - align-content: center; - justify-content: flex-start; - display: flex; - flex-direction: column; - align-items: flex-start; - overflow-y: auto; - overflow-x: hidden; - position: absolute; - width: 98vw; -} - -.page-body > * { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - width: 100%; - align-self: center; - font-size: min(16px, calc(1vh * 4)); -} -#pageBody > * > * { - align-self: center; - padding-top: 0.5vh; - padding-bottom: 0.5vh; - color: var(--c_purple_dark); -} -#pageBody > .card { - height: fit-content; - margin-top: 1vh; -} -#pageBody > .card:first-of-type{ - margin-top: 0vh; - top: 0; -} - -/* Create two unequal columns that floats next to each other * -/* Left column * -.leftcolumn { - float: left; - width: 70%; - display: flex; - flex-wrap: wrap; - /* min-width: fit-content; * - align-items: center; - justify-content: center; -} - -/* Right column * -.rightcolumn { - float: left; - width: 30%; - display: flex; - flex-wrap: wrap; - /* min-width: fit-content; only on store?? * - /* background-color: #f1f1f1; * - padding-left: 20px; - height: fit-content; - align-items: center; - justify-content: center; -} -*/ - -/* Fake image -.fakeimg { - background-color: var(--c_purple_light); - width: 100%; - padding: 20px; -} -*/ - - -/* header image */ -img.header-logo { - max-height: 15vh; - max-width: 20vw; - cursor: pointer; - border-radius: 5vh !important; -} - -/* icon images */ -.img-icon { - max-width: 16vh; - max-height: 8vh; - border-radius: 0; -} - -/* -.container-icon-label { padding: 0; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; + box-sizing: border-box; + font-family: system-ui, -apple-system, sans-serif; } -.container-icon-label > * { - display: inline-flex; - margin-left: 1vh; - margin-right: 1vh; -} - -.header > .container:first-of-type { - max-width: 25%; - justify-self: left; -} -.header > .container:last-of-type { - max-width: 75%; - justify-self: left; -} -*/ - -/* Add a card effect for articles */ -.card { - background-color: var(--c_purple_pastel); - padding: 1vh; - margin: 1vh; - display: flex !important; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - border-radius: 4vh; - /* min-width: fit-content; */ - position: relative; - height: fit-content; - max-width: 80vw; - padding-left: 2.5vw; - padding-right: 2.5vw; -} - -.header.card { - border-radius: 2.5vh; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; +body { + line-height: 1.6; + color: var(--text); } .container { - flex: 1; - margin: 0px; - align-items: flex-start; - justify-content: flex-start; - text-align: flex-start; - /* max-width: 100%; */ - /* min-width: fit-content; */ + max-width: 1200px; + margin: 0 auto; + padding: 0 1.5rem; } -.column { - display: flex; - flex-direction: column; - align-items: center; - margin: auto 0; -} - -.row { - display: flex; - flex-direction: row; - width: 100%; - /* min-width: fit-content; */ -} - -.container > .card:first-of-type { - margin-top: none; -} - - /* -/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other * -@media screen and (max-width: 800px) { - .leftcolumn, .rightcolumn { - width: 100%; - /* padding: 0; * - } +.page_body { + position: fixed; + top: } - -/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other * -@media screen and (max-width: 400px) { - .topnav a { - float: none; - width: 100%; - } -} -*/ - -.container-input { - padding: 1vh; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; -} - -.container-input > label { - width: 100%; - margin-bottom: 1vh; - margin-top: 0; -} - -.container-input:not(:nth-child(3)) > label { - margin-top: 1vh; -} - -.container-input > input, .container-input > textarea { - border: 2px solid var(--c_purple); - padding: 1vh; -} - -.label-title { - width: 100%; -} - - -ul { - max-width: 90%; - padding: 5px 0 10px 0; -} -li { - text-align: left; - font-size: 18px; -} - - -:not(input,textarea,select,button).dirty { - background-color: var(--c_purple_dark); -} -input.dirty, textarea.dirty, select.dirty { - border-color: var(--c_purple_dark); -} - - -#pageBody > *, button { - font-size: min(12px, calc(1vh * 3)); -} \ No newline at end of file +*/ \ No newline at end of file diff --git a/static/css/pages/core/admin_home.css b/static/css/pages/core/admin_home.css deleted file mode 100644 index 1a767856..00000000 --- a/static/css/pages/core/admin_home.css +++ /dev/null @@ -1,7 +0,0 @@ -#pageBody > .card:first-of-type { - width: 80%; -} - -.container.row { - width: auto; -} \ No newline at end of file diff --git a/static/css/pages/core/contact.css b/static/css/pages/core/contact.css index f97d13cb..11152a23 100644 --- a/static/css/pages/core/contact.css +++ b/static/css/pages/core/contact.css @@ -1,27 +1,173 @@ - -#pageBody > .card:first-of-type{ - flex-grow: 1; -} -#pageBody > .card:last-of-type { -} -#pageBody > .card:not(:first-of-type) { +/* +h1, h2, h3 { + margin-bottom: 1rem; + align-self: center; + justify-self: center; + margin: 0 auto; + width: fit-content; } -#pageBody label { - font-size: min(16px, calc(1vh * 4)); +section { + display: flex; + margin: 0 auto; + width: 100vw; } -#email { - /* min-width: 40vw; */ - width: 40vw; +.container { + display: flex; + flex-direction: column; + align-content: center; } -#name { +.container-input { + display: flex; + flex-direction: column; + align-items: center; +} +.container-input label { + width: 100%; + margin: 0 auto; +} + +/* Contact Form Section * / +.contact-form { + padding: 8rem 0 4rem; + background: linear-gradient(45deg, #f8fafc, #eff6ff); +} + +.contact-form-content { width: 50vw; } -#message { - width: 60vw; + +.contact-form h1 { + font-size: 3rem; + line-height: 1.2; + margin-bottom: 1.5rem; + color: var(--text); } -input, textarea { - max-width: 65vw; +.contact-form p { + font-size: 1.25rem; + margin-bottom: 2rem; + color: var(--subheading); +} + +table { + margin: 0 auto; +} + +th.lhs, +td.lhs { + min-width: 8vw; + max-width: 8vw; +} + +th.rhs, +td.rhs { + min-width: 36vw; + max-width: 36vw; +} + +td input, +td textarea { + width: 100%; +} + +textarea { + resize: vertical; +} + +.container-checkbox.receive_marketing { + margin-left: 22.25vw; +} + +*/ + +.contact-section { + padding: 2rem 2rem 4rem; +} + +.contact-form { + max-width: 800px; + margin: 0 auto; + background: #fff; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.form-grid { + display: grid; + grid-template-columns: 200px 1fr; + gap: 1.5rem; + margin-bottom: 1.5rem; +} + +.form-label { + padding-top: 0.5rem; + font-weight: 500; +} + +.form-input { + width: 100%; + padding: 0.5rem; + border: 1px solid #d1d5db; + border-radius: 4px; + font-size: 1rem; +} + +textarea.form-input { + min-height: 120px; +} + +.marketing-consent { + margin: 2rem 0; + padding-left: 200px; +} + +input[type="submit"] { + margin-left: 40%; + padding: 0.75rem 1.5rem; + background: #2563eb; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; +} + +input[type="submit"]:hover { + background: #1d4ed8; +} + +.data-notice { + margin-top: 3rem; + padding: 1.5rem; + background: #f3f4f6; + border-radius: 4px; + font-size: 0.95rem; +} + +.data-notice h3 { + margin-bottom: 1rem; + font-size: 1.1rem; +} + +@media (max-width: 768px) { + .form-grid { + grid-template-columns: 1fr; + gap: 0.5rem; + } + + .form-label { + padding-top: 0; + } + + .marketing-consent { + padding-left: 0; + } + + .submit-button { + margin-left: 0; + width: 100%; + } } \ No newline at end of file diff --git a/static/css/pages/core/home.css b/static/css/pages/core/home.css index 642e9327..7d5fa20d 100644 --- a/static/css/pages/core/home.css +++ b/static/css/pages/core/home.css @@ -1,35 +1,126 @@ -#pageBody > * > * { - width: 100%; -} -#pageBody > * { - height: 100%; -} -#pageBody > * :first-child{ - margin-top: 25vh; -} -#pageBody > * :last-child { - margin-bottom: 35vh; +/* Hero Section */ +.hero { + padding: 8rem 0 4rem; + background: linear-gradient(45deg, #f8fafc, #eff6ff); } -.img-demo { - max-width: 50%; - min-width: 500px; +.hero-content { + max-width: 600px; } -.img-featured { - width: 100%; +.hero h1 { + font-size: 3rem; + line-height: 1.2; + margin-bottom: 1.5rem; + color: var(--text); } -/* -img { - background-image: url("/static/images/Tag_Molly1.png"); +.hero p { + font-size: 1.25rem; + margin-bottom: 2rem; + color: var(--subheading); } -*/ -#pageBody h2 { - width: 100%; +/* Services Section */ +.services { + padding: 6rem 0; + background: white; } -#pageBody button.navContact { - width: fit-content; + +.services-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-top: 3rem; } + +.service-card { + padding: 2rem; + background: var(--light); + border-radius: 8px; + transition: transform 0.3s ease; +} + +.service-card:hover { + transform: translateY(-5px); +} + +/* Testimonial Section */ +.testimonial { + padding: 6rem 0; + background: var(--light); +} + +.testimonial-card { + background: white; + padding: 2rem; + border-radius: 8px; + max-width: 800px; + margin: 3rem auto 0; + box-shadow: 0 4px 6px rgba(0,0,0,0.1); +} + +/* Pricing Section */ +.pricing { + padding: 6rem 0; + background: white; +} + +.pricing-card { + background: var(--light); + padding: 2rem; + border-radius: 8px; + text-align: center; + max-width: 400px; + margin: 3rem auto 0; +} + +.price { + font-size: 2.5rem; + color: var(--primary); + font-weight: bold; + margin: 1rem 0; +} + +/* CTA Section */ +.cta { + padding: 6rem 0; + background: var(--primary); + color: white; + text-align: center; +} + + +/* Animations */ +/* Fallback styles to ensure content is visible without JS */ +.reveal { + opacity: 1; /* Default visible state */ +} + +/* Only hide elements if browser supports Intersection Observer */ +@supports (animation-name: fade) { + .reveal { + opacity: 0; + } + + .reveal.active { + animation: fade-up 0.8s ease-out forwards; + } +} + +@keyframes fade-up { + 0% { + opacity: 0; + transform: translateY(30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.delay-1 { animation-delay: 0.1s; } +.delay-2 { animation-delay: 0.2s; } +.delay-3 { animation-delay: 0.3s; } +.delay-4 { animation-delay: 0.4s; } \ No newline at end of file diff --git a/static/css/pages/core/services.css b/static/css/pages/core/services.css deleted file mode 100644 index e65bae53..00000000 --- a/static/css/pages/core/services.css +++ /dev/null @@ -1,29 +0,0 @@ -#pageBody > .card { - padding-left: 5vw; - padding-right: 5vw; - max-width: 80vw; -} - -#pageBody .card h1, -#pageBody .card h2, -#pageBody .card p { - width: 100%; -} - -#pageBody .card p { - font-size: min(16px, calc(1vh * 4)); -} - -table { - left: 5vw; - max-width: 70vw; - width: fit-content !important; -} - -table td { - padding: 10px; -} - -table th { - font-size: min(16px, calc(1vh * 4)); -} diff --git a/static/css/pages/store/home.css b/static/css/pages/store/home.css deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/pages/store/manufacturing_purchase_order.css b/static/css/pages/store/manufacturing_purchase_order.css deleted file mode 100644 index cd3dfd63..00000000 --- a/static/css/pages/store/manufacturing_purchase_order.css +++ /dev/null @@ -1,94 +0,0 @@ - -#formFilters { - width: 100vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} -#formFilters .container-input.filter.date_from, -#formFilters .container-input.filter.date_to { - width: 8vh; -} - - -#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, -#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl { - width: 10vh; - min-width: 10vh; -} - -#tableMain thead tr th.order_items.collapsed, -#tableMain tbody tr td.order_items.collapsed { - width: 15vh; - min-width: 15vh; -} -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.collapsed) thead tr th.order_items, -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.collapsed) tbody tr td.order_items { - width: 100vh; /* 95vh */ - min-width: 100vh; -} -#tableMain thead tr th.order_items, -#tableMain tbody tr td.order_items { - width: 110vh; - min-width: 110vh; -} -#tableMain tbody tr td.order_items table thead tr th, #tableMain tbody tr td.order_items table tbody tr td { - width: 12vh; - min-width: 12vh; -} -#tableMain tbody tr td.order_items table thead tr th.display_order, #tableMain tbody tr td.order_items table tbody tr td.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.order_items table thead tr th.id_unit_measurement_quantity, #tableMain tbody tr td.order_items table tbody tr td.id_unit_measurement_quantity, -#tableMain tbody tr td.order_items table thead tr th.unit_measurement_latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.unit_measurement_latency_manufacture { - width: 6vh; - min-width: 6vh; -} - -#tableMain tbody tr td.order_items table thead tr th.product_variations.collapsed, #tableMain tbody tr td.order_items table tbody tr td.product_variations.collapsed { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.order_items table thead tr th.product_variations, #tableMain tbody tr td.order_items table tbody tr td.product_variations { - width: 20vh; - min-width: 20vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td:last-of-type { - width: 4vh; - min-width: 4vh; -} - -#tableMain tbody tr td.order_items table thead tr th.quantity_used, #tableMain tbody tr td.order_items table tbody tr td.quantity_used, -#tableMain tbody tr td.order_items table thead tr th.quantity_produced, #tableMain tbody tr td.order_items table tbody tr td.quantity_produced, -#tableMain tbody tr td.order_items table thead tr th.latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.latency_manufacture { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table thead tr th.active, #tableMain tbody tr td.order_items table tbody tr td.active, -#tableMain tbody tr td.order_items table thead tr th.add, #tableMain tbody tr td.order_items table tbody tr td.delete { - width: 4vh; - min-width: 4vh; -} - -#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.currency, #tableMain tbody tr td.currency { - width: 11vh; - min-width: 11vh; -} - -#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, -#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl, -#tableMain tbody tr td.price_total_local_vat_excl, #tableMain thead tr th.price_total_local_vat_excl, -#tableMain tbody tr td.price_total_local_vat_incl, #tableMain thead tr th.price_total_local_vat_incl { - width: 5vh; - min-width: 5vh; -} \ No newline at end of file diff --git a/static/css/pages/store/product_categories.css b/static/css/pages/store/product_categories.css deleted file mode 100644 index 7d80d358..00000000 --- a/static/css/pages/store/product_categories.css +++ /dev/null @@ -1,62 +0,0 @@ - -#formFilters { - width: 50vh; -} - -#formFilters .container { - max-width: fit-content; -} - -#formFilters .container-input.filter.is_not_empty { - width: 10vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} - -#tableMain { - max-width: min(calc(1vh * 79), calc(1vw * 90)); -} - -/* -#tableMain thead tr th, #tableMain tbody tr td { - margin-left: 1vh; - margin-right: 1vh; -} -*/ - -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.code, #tableMain thead tr th.code { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.name, #tableMain thead tr th.name { - width: 15vh; - min-width: 15vh; -} -#tableMain tbody tr td.description, #tableMain thead tr th.description { - width: 25vh; - min-width: 25vh; -} -#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level { - width: 7vh; - min-width: 7vh; -} -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} - -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { - border: 2px solid var(--c_purple); - border-radius: 0.5vh; -} - -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { - width: 47.5%; -} - diff --git a/static/css/pages/store/product_permutations.css b/static/css/pages/store/product_permutations.css deleted file mode 100644 index bf8b4fa9..00000000 --- a/static/css/pages/store/product_permutations.css +++ /dev/null @@ -1,120 +0,0 @@ - -#formFilters { - width: 95vh; -} - -#tableMain { - max-width: 90vw; -} -#tableMain thead tr th.category, #tableMain tbody tr td.category { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.product, #tableMain tbody tr td.product { - width: 10vh; - min-width: 10vh; -} -#tableMain thead tr th.product_variations.collapsed, #tableMain tbody tr td.product_variations.collapsed { - width: 10vh; - min-width: 10vh; - display: table-cell !important; -} -#tableMain thead tr th.product_variations, #tableMain tbody tr td.product_variations { - width: 24vh; - min-width: 24vh; -} -#tableMain tbody tr td.product_variations table thead tr th.product_variation_type, #tableMain tbody tr td.product_variations table tbody tr td.product_variation_type, -#tableMain tbody tr td.product_variations table thead tr th.product_variation, #tableMain tbody tr td.product_variations table tbody tr td.product_variation { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.product_variations table thead tr th.add, #tableMain tbody tr td.product_variations table tbody tr td.delete { - width: 4vh; - min-width: 4vh; -} -#tableMain thead tr th.description, #tableMain tbody tr td.description { -} -#tableMain thead tr th.quantity_stock, #tableMain tbody tr td.quantity_stock { - width: 6vh; - min-width: 6vh; -} -#tableMain thead tr th.quantity_min, #tableMain tbody tr td.quantity_min { - width: 6vh; - min-width: 6vh; -} -#tableMain thead tr th.quantity_max, #tableMain tbody tr td.quantity_max { - width: 6vh; - min-width: 6vh; -} -#tableMain thead tr th.count_unit_measurement_per_quantity_step, #tableMain tbody tr td.count_unit_measurement_per_quantity_step { - width: 6vh; - min-width: 6vh; -} -#tableMain thead tr th.id_unit_measurement_quantity, #tableMain tbody tr td.id_unit_measurement_quantity { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.is_subscription, #tableMain tbody tr td.is_subscription { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.count_interval_recurrence, #tableMain tbody tr td.count_interval_recurrence { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.id_unit_measurement_interval_recurrence, #tableMain tbody tr td.id_unit_measurement_interval_recurrence { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.id_stripe_product, #tableMain tbody tr td.id_stripe_product { - width: 10vh; - min-width: 10vh; -} -#tableMain thead tr th.does_expire_faster_once_unsealed, #tableMain tbody tr td.does_expire_faster_once_unsealed { - width: 7vh; - min-width: 7vh; -} -#tableMain thead tr th.count_interval_expiration_unsealed, #tableMain tbody tr td.count_interval_expiration_unsealed { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.id_unit_measurement_interval_expiration_unsealed, #tableMain tbody tr td.id_unit_measurement_interval_expiration_unsealed { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.cost_local, #tableMain tbody tr td.cost_local { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.id_currency_cost, #tableMain tbody tr td.id_currency_cost { - width: 6vh; - min-width: 6vh; -} -#tableMain thead tr th.profit_local_min, #tableMain tbody tr td.profit_local_min { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.latency_manufacture, #tableMain tbody tr td.latency_manufacture { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.active, #tableMain tbody tr td.active { - width: 6vh; - min-width: 6vh; -} - - -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { - border: 2px solid var(--c_purple); - border-radius: 0.5vh; -} - -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { - width: 47.5%; -} - -/* -select.id_variation, select.id_variation_type { - max-width: 40% !important; -} -*/ diff --git a/static/css/pages/store/product_variations.css b/static/css/pages/store/product_variations.css deleted file mode 100644 index ff9c3cbd..00000000 --- a/static/css/pages/store/product_variations.css +++ /dev/null @@ -1,46 +0,0 @@ - -/* -#formFilters { - width: 50vh; -} -*/ - - -#tableMain:has(thead tr th.product_variations.collapsed) { - max-width: 66vh; -} -#tableMain { - max-width: 97vh; -} - -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order, -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 6vh; - min-width: 6vh; -} -#tableMain tbody tr td.code, #tableMain thead tr th.code, -#tableMain tbody tr td.name, #tableMain thead tr th.name, -#tableMain tbody tr td.name_plural, #tableMain thead tr th.name_plural { - width: 12vh; - min-width: 12vh; -} - -#tableMain thead tr th.product_variations.collapsed, #tableMain tbody tr td.product_variations.collapsed { - width: 8vh; - min-width: 8vh; -} -#tableMain thead tr th.product_variations, #tableMain tbody tr td.product_variations { - width: 41vh; - min-width: 41vh; -} - -#tableMain tbody tr td.product_variations table thead tr th.code, #tableMain tbody tr td.product_variations table tbody tr td.code, -#tableMain tbody tr td.product_variations table thead tr th.name, #tableMain tbody tr td.product_variations table tbody tr td.name { - width: 12vh; - min-width: 12vh; -} -#tableMain tbody tr td.product_variations table thead tr th.display_order, #tableMain tbody tr td.product_variations table tbody tr td.display_order, -#tableMain tbody tr td.product_variations table thead tr th.active, #tableMain tbody tr td.product_variations table tbody tr td.active { - width: 6vh; - min-width: 6vh; -} diff --git a/static/css/pages/store/products.css b/static/css/pages/store/products.css deleted file mode 100644 index 9219df7c..00000000 --- a/static/css/pages/store/products.css +++ /dev/null @@ -1,56 +0,0 @@ - -#formFilters { - width: 50vh; -} - -#formFilters .container { - max-width: fit-content; -} - -#formFilters .container-input.filter.is_not_empty { - width: 10vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} - - -#tableMain { - max-width: min(calc(1vh * 65), calc(1vw * 90)); -} - -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.product_category, #tableMain thead tr th.product_category { - width: 15vh; - min-width: 15vh; -} -#tableMain tbody tr td.name, #tableMain thead tr th.name { - width: 15vh; - min-width: 15vh; -} -#tableMain thead tr th.has_variations, #tableMain tbody tr td.has_variations { - width: 5vh; - min-width: 5vh; -} -#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level { - width: 7vh; - min-width: 7vh; -} -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} - -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { - border: 2px solid var(--c_purple); - border-radius: 0.5vh; -} - -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { - width: 47.5%; -} - diff --git a/static/css/pages/store/stock_items.css b/static/css/pages/store/stock_items.css deleted file mode 100644 index f8330705..00000000 --- a/static/css/pages/store/stock_items.css +++ /dev/null @@ -1,87 +0,0 @@ - -th, td { - min-width: fit-content; -} - - -#tableMain { - max-width: 90vw; -} -#tableMain thead tr th.product_category, #tableMain tbody tr td.product_category { - width: 12vh; - min-width: 12vh; -} -#tableMain thead tr th.product, #tableMain tbody tr td.product, -#tableMain thead tr th.storage_location, #tableMain tbody tr td.storage_location { - width: 10vh; - min-width: 10vh; -} - -#tableMain thead tr th.product_variations.collapsed, #tableMain tbody tr td.product_variations.collapsed { - width: 10vh; - min-width: 10vh; - display: table-cell !important; -} -#tableMain thead tr th.product_variations, #tableMain tbody tr td.product_variations { - width: 24vh; - min-width: 24vh; -} -#tableMain tbody tr td.product_variations table thead tr th.product_variation_type, #tableMain tbody tr td.product_variations table tbody tr td.product_variation_type, -#tableMain tbody tr td.product_variations table thead tr th.product_variation, #tableMain tbody tr td.product_variations table tbody tr td.product_variation { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.product_variations table thead tr th.add, #tableMain tbody tr td.product_variations table tbody tr td.delete { - width: 4vh; - min-width: 4vh; -} - -#tableMain thead tr th.id_currency_cost.collapsed, #tableMain tbody tr td.id_currency_cost.collapsed { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.id_currency_cost, #tableMain tbody tr td.id_currency_cost { - width: 11vh; - min-width: 11vh; -} - -#tableMain thead tr th.cost_unit_local_vat_excl, #tableMain tbody tr td.cost_unit_local_vat_excl, -#tableMain thead tr th.cost_unit_local_vat_incl, #tableMain tbody tr td.cost_unit_local_vat_incl { - width: 9vh; - min-width: 9vh; -} - -#tableMain thead tr th.storage_location.collapsed, #tableMain tbody tr td.storage_location.collapsed { - width: 10vh; - min-width: 10vh; -} -#tableMain thead tr th.storage_location, #tableMain tbody tr td.storage_location { - width: 20vh; - min-width: 20vh; -} -#tableMain tbody tr td.storage_location table thead tr th, -#tableMain tbody tr td.storage_location table tbody tr td { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.storage_location table thead tr th:last-of-type, -#tableMain tbody tr td.storage_location table tbody tr td:last-of-type { - width: 4vh; - min-width: 4vh; -} - -#tableMain thead tr th.active, #tableMain tbody tr td.active, -#tableMain thead tr th.is_sealed, #tableMain tbody tr td.is_sealed, -#tableMain thead tr th.is_consumed, #tableMain tbody tr td.is_consumed { - width: 6vh; - min-width: 6vh; -} - -#tableMain thead tr th.date_purchased, #tableMain tbody tr td.date_purchased, -#tableMain thead tr th.date_received, #tableMain tbody tr td.date_received, -#tableMain thead tr th.date_unsealed, #tableMain tbody tr td.date_unsealed, -#tableMain thead tr th.date_expiration, #tableMain tbody tr td.date_expiration, -#tableMain thead tr th.date_consumed, #tableMain tbody tr td.date_consumed { - width: 15vh; - min-width: 15vh; -} \ No newline at end of file diff --git a/static/css/pages/store/supplier.css b/static/css/pages/store/supplier.css deleted file mode 100644 index 25b14d44..00000000 --- a/static/css/pages/store/supplier.css +++ /dev/null @@ -1,59 +0,0 @@ - -#formFilters { - width: 50vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} - -#tableMain tbody tr td.name_company, #tableMain thead tr th.name_company, -#tableMain tbody tr td.name_contact, #tableMain thead tr th.name_contact, -#tableMain tbody tr td.department_contact, #tableMain thead tr th.department_contact, -#tableMain tbody tr td.phone_number, #tableMain thead tr th.phone_number { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.email, #tableMain thead tr th.email, -#tableMain tbody tr td.website, #tableMain thead tr th.website { - width: 15vh; - min-width: 15vh; -} - -#tableMain thead tr th.address.collapsed, #tableMain tbody tr td.address.collapsed { - width: 9vh; - min-width: 9vh; - display: table-cell !important; -} -#tableMain thead tr th.address, #tableMain tbody tr td.address { - width: 108vh; - min-width: 108vh; -} -#tableMain tbody tr td.address table thead tr th.postcode, #tableMain tbody tr td.address table tbody tr td.postcode, -#tableMain tbody tr td.address table thead tr th.address_line_1, #tableMain tbody tr td.address table tbody tr td.address_line_1, -#tableMain tbody tr td.address table thead tr th.address_line_2, #tableMain tbody tr td.address table tbody tr td.address_line_2, -#tableMain tbody tr td.address table thead tr th.city, #tableMain tbody tr td.address table tbody tr td.city, -#tableMain tbody tr td.address table thead tr th.county, #tableMain tbody tr td.address table tbody tr td.county, -#tableMain tbody tr td.address table thead tr th.region, #tableMain tbody tr td.address table tbody tr td.region { - width: 15vh; - min-width: 15vh; -} -#tableMain tbody tr td.address table thead tr th.active, #tableMain tbody tr td.address table tbody tr td.active, -#tableMain tbody tr td.address table thead tr th.add, #tableMain tbody tr td.address table tbody tr td.delete { - width: 5vh; - min-width: 5vh; -} - -#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.currency, #tableMain tbody tr td.currency { - width: 11vh; - min-width: 11vh; -} - -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} diff --git a/static/css/pages/store/supplier_purchase_order.css b/static/css/pages/store/supplier_purchase_order.css deleted file mode 100644 index 97dbb219..00000000 --- a/static/css/pages/store/supplier_purchase_order.css +++ /dev/null @@ -1,101 +0,0 @@ - -#formFilters { - width: 100vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} -#formFilters .container-input.filter.date_from, -#formFilters .container-input.filter.date_to { - width: 8vh; -} - -#tableMain tbody tr td.supplier, #tableMain thead tr th.supplier { - width: 15vh; - min-width: 15vh; -} - -#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { - width: 9vh; - min-width: 9vh; -} -#tableMain thead tr th.currency, #tableMain tbody tr td.currency { - width: 11vh; - min-width: 11vh; -} - -#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, -#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl { - width: 10vh; - min-width: 10vh; -} - -#tableMain tbody tr td.order_items, #tableMain thead tr th.items { - width: 40vh; - min-width: 40vh; -} -#tableMain thead tr th.order_items.collapsed, #tableMain tbody tr td.order_items.collapsed { - width: 15vh; - min-width: 15vh; -} -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.collapsed) thead tr th.order_items, -#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.collapsed) tbody tr td.order_items { - width: 126vh; - min-width: 126vh; -} -#tableMain thead tr th.order_items, -#tableMain tbody tr td.order_items { - width: 136vh; - min-width: 136vh; -} -#tableMain tbody tr td.order_items table thead tr th, #tableMain tbody tr td.order_items table tbody tr td { - width: 12vh; - min-width: 12vh; -} -#tableMain tbody tr td.order_items table thead tr th.display_order, #tableMain tbody tr td.order_items table tbody tr td.display_order, -#tableMain tbody tr td.order_items table thead tr th.add, #tableMain tbody tr td.order_items table tbody tr td.delete { - width: 5vh; - min-width: 5vh; -} - -#tableMain tbody tr td.order_items table thead tr th.product_variations.collapsed, #tableMain tbody tr td.order_items table tbody tr td.product_variations.collapsed { - width: 10vh; - min-width: 10vh; -} -#tableMain tbody tr td.order_items table thead tr th.product_variations, #tableMain tbody tr td.order_items table tbody tr td.product_variations { - width: 20vh; - min-width: 20vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td:last-of-type { - width: 4vh; - min-width: 4vh; -} - -#tableMain tbody tr td.order_items table thead tr th.id_unit_measurement_quantity, #tableMain tbody tr td.order_items table tbody tr td.id_unit_measurement_quantity { - width: 6vh; - min-width: 6vh; -} -#tableMain tbody tr td.order_items table thead tr th.quantity_ordered, #tableMain tbody tr td.order_items table tbody tr td.quantity_ordered, -#tableMain tbody tr td.order_items table thead tr th.quantity_received, #tableMain tbody tr td.order_items table tbody tr td.quantity_received, -#tableMain tbody tr td.order_items table thead tr th.cost_total_local_vat_excl, #tableMain tbody tr td.order_items table tbody tr td.cost_total_local_vat_excl, -#tableMain tbody tr td.order_items table thead tr th.cost_total_local_vat_incl, #tableMain tbody tr td.order_items table tbody tr td.cost_total_local_vat_incl, -#tableMain tbody tr td.order_items table thead tr th.cost_unit_local_vat_excl, #tableMain tbody tr td.order_items table tbody tr td.cost_unit_local_vat_excl, -#tableMain tbody tr td.order_items table thead tr th.cost_unit_local_vat_incl, #tableMain tbody tr td.order_items table tbody tr td.cost_unit_local_vat_incl, -#tableMain tbody tr td.order_items table thead tr th.latency_delivery_days, #tableMain tbody tr td.order_items table tbody tr td.latency_delivery_days { - width: 8vh; - min-width: 8vh; -} -#tableMain tbody tr td.order_items table thead tr th.active, #tableMain tbody tr td.order_items table tbody tr td.active { - width: 4vh; - min-width: 4vh; -} - -#tableMain tbody tr td.active, #tableMain thead tr th.active { - width: 5vh; - min-width: 5vh; -} diff --git a/static/css/sections/store.css b/static/css/sections/store.css deleted file mode 100644 index a8c1974b..00000000 --- a/static/css/sections/store.css +++ /dev/null @@ -1,56 +0,0 @@ - -.img-product { - max-width: 20vh; - max-height: 20vh; - border-radius: 3vh; - justify-self: left; -} - -.img-thumbnail { - max-width: 10vh; - max-height: 10vh; - border-radius: 3vh; - justify-self: left; -} - -.buttonAddToBasket { - background-color: var(--c_blue_pastel); - color: var(--c_blue_dark); - border-color: var(--c_blue_dark); -} - -#buttonCheckout, .buttonBuyNow { - background-color: var(--c_purple_pastel); - color: var(--c_purple_dark); - border-color: var(--c_purple_dark); -} - -.button-increment, .button-decrement { - border: 2px solid darkgrey; - background-color: lightgray; - margin: 1vh 1vh; - width: 2.5vh; - height: 2.5vh; - border-radius: 1.25vh; - font-size: 2vh; -} - -.container-input > input { - padding: 0vh 1vh; - border-radius: 0.5vh; - max-width: 7vh; -} - -#basket { - max-width: 100%; -} - - - -/* Right column */ -.rightcolumn { - min-width: fit-content; -} - -/* Main Table */ - diff --git a/static/css/themes/light.css b/static/css/themes/light.css index e46bc225..c1faf9af 100644 --- a/static/css/themes/light.css +++ b/static/css/themes/light.css @@ -1,45 +1 @@ -:root { - --background-color: #ffffff; - --text-color: #333333; - --primary-color: #007bff; - --secondary-color: #6c757d; - --success-color: #28a745; - --danger-color: #dc3545; - --warning-color: #ffc107; - --info-color: #17a2b8; - --light-color: #f8f9fa; - --dark-color: #343a40; - --border-color: #dee2e6; - --shadow-color: rgba(0, 0, 0, 0.1); - - /* Header */ - --header-bg: #f8f9fa; - --header-text: #333333; - - /* Footer */ - --footer-bg: #f8f9fa; - --footer-text: #6c757d; - - /* Navigation */ - --nav-bg: #ffffff; - --nav-text: #333333; - --nav-hover-bg: #f1f3f5; - --nav-hover-text: #007bff; - - /* Buttons */ - --Button-primary-bg: #007bff; - --Button-primary-text: #ffffff; - --Button-secondary-bg: #6c757d; - --Button-secondary-text: #ffffff; - - /* Forms */ - --input-bg: #ffffff; - --input-border: #ced4da; - --input-text: #495057; - --input-focus-border: #80bdff; - - /* Cards */ - --card-bg: #ffffff; - --card-border: #dee2e6; - --card-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); -} \ No newline at end of file +/* Default */ \ No newline at end of file diff --git a/static/dist/css/core_contact.bundle.css b/static/dist/css/core_contact.bundle.css index b8d0d4ae..b3749ebd 100644 --- a/static/dist/css/core_contact.bundle.css +++ b/static/dist/css/core_contact.bundle.css @@ -1,29 +1,175 @@ - -#pageBody > .card:first-of-type{ - flex-grow: 1; -} -#pageBody > .card:last-of-type { -} -#pageBody > .card:not(:first-of-type) { +/* +h1, h2, h3 { + margin-bottom: 1rem; + align-self: center; + justify-self: center; + margin: 0 auto; + width: fit-content; } -#pageBody label { - font-size: min(16px, calc(1vh * 4)); +section { + display: flex; + margin: 0 auto; + width: 100vw; } -#email { - /* min-width: 40vw; */ - width: 40vw; +.container { + display: flex; + flex-direction: column; + align-content: center; } -#name { +.container-input { + display: flex; + flex-direction: column; + align-items: center; +} +.container-input label { + width: 100%; + margin: 0 auto; +} + +/* Contact Form Section * / +.contact-form { + padding: 8rem 0 4rem; + background: linear-gradient(45deg, #f8fafc, #eff6ff); +} + +.contact-form-content { width: 50vw; } -#message { - width: 60vw; + +.contact-form h1 { + font-size: 3rem; + line-height: 1.2; + margin-bottom: 1.5rem; + color: var(--text); } -input, textarea { - max-width: 65vw; +.contact-form p { + font-size: 1.25rem; + margin-bottom: 2rem; + color: var(--subheading); +} + +table { + margin: 0 auto; +} + +th.lhs, +td.lhs { + min-width: 8vw; + max-width: 8vw; +} + +th.rhs, +td.rhs { + min-width: 36vw; + max-width: 36vw; +} + +td input, +td textarea { + width: 100%; +} + +textarea { + resize: vertical; +} + +.container-checkbox.receive_marketing { + margin-left: 22.25vw; +} + +*/ + +.contact-section { + padding: 8rem 2rem 4rem; +} + +.contact-form { + max-width: 800px; + margin: 0 auto; + background: #fff; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.form-grid { + display: grid; + grid-template-columns: 200px 1fr; + gap: 1.5rem; + margin-bottom: 1.5rem; +} + +.form-label { + padding-top: 0.5rem; + font-weight: 500; +} + +.form-input { + width: 100%; + padding: 0.5rem; + border: 1px solid #d1d5db; + border-radius: 4px; + font-size: 1rem; +} + +textarea.form-input { + min-height: 120px; +} + +.marketing-consent { + margin: 2rem 0; + padding-left: 200px; +} + +input[type="submit"] { + margin-left: 40%; + padding: 0.75rem 1.5rem; + background: #2563eb; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; +} + +input[type="submit"]:hover { + background: #1d4ed8; +} + +.data-notice { + margin-top: 3rem; + padding: 1.5rem; + background: #f3f4f6; + border-radius: 4px; + font-size: 0.95rem; +} + +.data-notice h3 { + margin-bottom: 1rem; + font-size: 1.1rem; +} + +@media (max-width: 768px) { + .form-grid { + grid-template-columns: 1fr; + gap: 0.5rem; + } + + .form-label { + padding-top: 0; + } + + .marketing-consent { + padding-left: 0; + } + + .submit-button { + margin-left: 0; + width: 100%; + } } /*# sourceMappingURL=core_contact.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/css/core_home.bundle.css b/static/dist/css/core_home.bundle.css index d0514284..da36690b 100644 --- a/static/dist/css/core_home.bundle.css +++ b/static/dist/css/core_home.bundle.css @@ -1,38 +1,128 @@ -#pageBody > * > * { - width: 100%; -} -#pageBody > * { - height: 100%; -} -#pageBody > * :first-child{ - margin-top: 25vh; -} -#pageBody > * :last-child { - margin-bottom: 35vh; +/* Hero Section */ +.hero { + padding: 8rem 0 4rem; + background: linear-gradient(45deg, #f8fafc, #eff6ff); } -.img-demo { - max-width: 50%; - min-width: 500px; +.hero-content { + max-width: 600px; } -.img-featured { - width: 100%; +.hero h1 { + font-size: 3rem; + line-height: 1.2; + margin-bottom: 1.5rem; + color: var(--text); } -/* -img { - background-image: url("/static/images/Tag_Molly1.png"); -} -*/ - -#pageBody h2 { - width: 100%; -} -#pageBody button.navContact { - width: fit-content; +.hero p { + font-size: 1.25rem; + margin-bottom: 2rem; + color: var(--subheading); } +/* Services Section */ +.services { + padding: 6rem 0; + background: white; +} + +.services-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-top: 3rem; +} + +.service-card { + padding: 2rem; + background: var(--light); + border-radius: 8px; + transition: transform 0.3s ease; +} + +.service-card:hover { + transform: translateY(-5px); +} + +/* Testimonial Section */ +.testimonial { + padding: 6rem 0; + background: var(--light); +} + +.testimonial-card { + background: white; + padding: 2rem; + border-radius: 8px; + max-width: 800px; + margin: 3rem auto 0; + box-shadow: 0 4px 6px rgba(0,0,0,0.1); +} + +/* Pricing Section */ +.pricing { + padding: 6rem 0; + background: white; +} + +.pricing-card { + background: var(--light); + padding: 2rem; + border-radius: 8px; + text-align: center; + max-width: 400px; + margin: 3rem auto 0; +} + +.price { + font-size: 2.5rem; + color: var(--primary); + font-weight: bold; + margin: 1rem 0; +} + +/* CTA Section */ +.cta { + padding: 6rem 0; + background: var(--primary); + color: white; + text-align: center; +} + + +/* Animations */ +/* Fallback styles to ensure content is visible without JS */ +.reveal { + opacity: 1; /* Default visible state */ +} + +/* Only hide elements if browser supports Intersection Observer */ +@supports (animation-name: fade) { + .reveal { + opacity: 0; + } + + .reveal.active { + animation: fade-up 0.8s ease-out forwards; + } +} + +@keyframes fade-up { + 0% { + opacity: 0; + transform: translateY(30px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.delay-1 { animation-delay: 0.1s; } +.delay-2 { animation-delay: 0.2s; } +.delay-3 { animation-delay: 0.3s; } +.delay-4 { animation-delay: 0.4s; } /*# sourceMappingURL=core_home.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/css/main.bundle.css b/static/dist/css/main.bundle.css index 4a91ab5c..72ffa405 100644 --- a/static/dist/css/main.bundle.css +++ b/static/dist/css/main.bundle.css @@ -1,716 +1,186 @@ :root { - /* Declare global variables */ - --c_purple: #5B29FF; - --c_purple_pastel: #D1D1FF; - --c_purple_light: #C6BDFF; - --c_purple_dark: #4700B3; - --c_blue: #0044FF; - --c_blue_pastel: #B8E0FF; - --c_blue_light: #73E8FF; - --c_blue_dark: #003ADB; -} - -html { - height: 100%; -} - -body { - background-color: var(--background-color); - color: var(--text-color); - font-family: var(--font-family-base); - font-family: Arial; - padding: 0; - margin: 0; - border: 0; - background: linear-gradient(to bottom right, var(--c_purple), #dc2430); /* var(--c_purple_pastel); */ - height: 100vh; - max-height: 100%; + --primary: #2563eb; + --secondary: #1e40af; + --text: #1f2937; + --subheading: #4b5563; + --light: #f3f4f6; } * { margin: 0; -} - -script, link { - display: none !important; -} - -#pageBody { - height: 69vh !important; - padding: 1vh; - padding-left: 1vw; - padding-right: 1vw; - margin: 1vh; - margin-left: 0; - margin-right: 0; - border: 0; - align-content: center; - justify-content: flex-start; - display: flex; - flex-direction: column; - align-items: flex-start; - overflow-y: auto; - overflow-x: hidden; - position: absolute; - width: 98vw; -} - -.page-body > * { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - width: 100%; - align-self: center; - font-size: min(16px, calc(1vh * 4)); -} -#pageBody > * > * { - align-self: center; - padding-top: 0.5vh; - padding-bottom: 0.5vh; - color: var(--c_purple_dark); -} -#pageBody > .card { - height: fit-content; - margin-top: 1vh; -} -#pageBody > .card:first-of-type{ - margin-top: 0vh; - top: 0; -} - -/* Create two unequal columns that floats next to each other * -/* Left column * -.leftcolumn { - float: left; - width: 70%; - display: flex; - flex-wrap: wrap; - /* min-width: fit-content; * - align-items: center; - justify-content: center; -} - -/* Right column * -.rightcolumn { - float: left; - width: 30%; - display: flex; - flex-wrap: wrap; - /* min-width: fit-content; only on store?? * - /* background-color: #f1f1f1; * - padding-left: 20px; - height: fit-content; - align-items: center; - justify-content: center; -} -*/ - -/* Fake image -.fakeimg { - background-color: var(--c_purple_light); - width: 100%; - padding: 20px; -} -*/ - - -/* header image */ -img.header-logo { - max-height: 15vh; - max-width: 20vw; - cursor: pointer; - border-radius: 5vh !important; -} - -/* icon images */ -.img-icon { - max-width: 16vh; - max-height: 8vh; - border-radius: 0; -} - -/* -.container-icon-label { padding: 0; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; + box-sizing: border-box; + font-family: system-ui, -apple-system, sans-serif; } -.container-icon-label > * { - display: inline-flex; - margin-left: 1vh; - margin-right: 1vh; -} - -.header > .container:first-of-type { - max-width: 25%; - justify-self: left; -} -.header > .container:last-of-type { - max-width: 75%; - justify-self: left; -} -*/ - -/* Add a card effect for articles */ -.card { - background-color: var(--c_purple_pastel); - padding: 1vh; - margin: 1vh; - display: flex !important; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - border-radius: 4vh; - /* min-width: fit-content; */ - position: relative; - height: fit-content; - max-width: 80vw; - padding-left: 2.5vw; - padding-right: 2.5vw; -} - -.header.card { - border-radius: 2.5vh; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; +body { + line-height: 1.6; + color: var(--text); } .container { - flex: 1; - margin: 0px; - align-items: flex-start; - justify-content: flex-start; - text-align: flex-start; - /* max-width: 100%; */ - /* min-width: fit-content; */ + max-width: 1200px; + margin: 0 auto; + padding: 0 1.5rem; } -.column { - display: flex; - flex-direction: column; - align-items: center; - margin: auto 0; -} - -.row { - display: flex; - flex-direction: row; - width: 100%; - /* min-width: fit-content; */ -} - -.container > .card:first-of-type { - margin-top: none; -} - - /* -/* Responsive layout - when the screen is less than 800px wide, make the two columns stack on top of each other instead of next to each other * -@media screen and (max-width: 800px) { - .leftcolumn, .rightcolumn { - width: 100%; - /* padding: 0; * - } -} - -/* Responsive layout - when the screen is less than 400px wide, make the navigation links stack on top of each other instead of next to each other * -@media screen and (max-width: 400px) { - .topnav a { - float: none; - width: 100%; - } -} -*/ - -.container-input { - padding: 1vh; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; -} - -.container-input > label { - width: 100%; - margin-bottom: 1vh; - margin-top: 0; -} - -.container-input:not(:nth-child(3)) > label { - margin-top: 1vh; -} - -.container-input > input, .container-input > textarea { - border: 2px solid var(--c_purple); - padding: 1vh; -} - -.label-title { - width: 100%; -} - - -ul { - max-width: 90%; - padding: 5px 0 10px 0; -} -li { - text-align: left; - font-size: 18px; -} - - -:not(input,textarea,select,button).dirty { - background-color: var(--c_purple_dark); -} -input.dirty, textarea.dirty, select.dirty { - border-color: var(--c_purple_dark); -} - - -#pageBody > *, button { - font-size: min(12px, calc(1vh * 3)); -} - -button, .button-submit, input[type="submit"] { - font-size: 20px; - font-weight: bold; - border: 4px solid; - border-radius: 2vh; - padding: 1vh 2vh 1vh 2vh; - margin: 0.5vh; - background-color: var(--c_purple_pastel); - color: var(--c_purple_dark); - border-color: var(--c_purple_dark); -} - -button.navContactUs { - border: 4px solid var(--c_purple_dark); - background-color: var(--c_purple_pastel); - color: var(--c_purple_dark) !important; - border-radius: 2vh; - width: 180px !important; -} - -button:hover, input[type="submit"]:hover { - text-decoration: underline; -} - - - - - -img, video { - border-radius: 3vh; -} - - -h1 { - font-size: min(24px, calc(1vh * 6)); -} - -h2 { - font-size: min(20px, calc(1vh * 5)); -} - -h3 { - font-size: min(16px, calc(1vh * 4)); - margin-top: 1vh; -} - -h4 { - font-size: 13px; - margin: 1vh; - text-align: center; - margin-left: auto; - margin-right: auto; -} - -h5 { - font-size: 11px; - margin: 1vh; -} - - - - - -/* Overlay modal */ -.overlay { - /* - display: none; - */ +.page_body { position: fixed; - top: 15vh; - right: 0; - width: 100px; - /* height: 50%; */ - background: var(--c_purple_pastel); - justify-content: right; - align-items: right; - align-self: right; - z-index: 999; -} -.overlay.expanded { - display: block; -} -.collapsed { - display: none; -} - -/* Hamburger menu overlay */ -#buttonHamburger:hover { - text-decoration: none; -} -#overlayHamburger { - overflow-x: hidden; - overflow-y: auto; - max-height: 80%; -} -.hamburger { - border: 2px solid var(--c_purple_dark); - border-radius: 4px; -} -.hamburger:first-child { - border-top-left-radius: 12px; - border-top-right-radius: 12px; -} -.hamburger:last-child { - border-bottom-left-radius: 12px; - border-bottom-right-radius: 12px; -} - -.hamburger > * { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - text-align: center; - width: 100%; - color: var(--c_purple_dark); - font-weight: bold; - font-size: 18px; - /* height: 18px; */ -} -.hamburger > :hover { - background-color: var(--c_purple_light); - color: var(--c_purple_dark); -} -.hamburger > * > * { - width: 100%; - /* - margin-top: 4.5px; - margin-bottom: 4.5px; - */ -} -.hamburger > .container { - padding-top: 4.5px; - padding-bottom: 4.5px; -} - -#overlayHamburger .row *:hover { - text-decoration: underline; -} - -/* Confirm overlay */ -#overlayConfirm { - position: absolute; - left: 25vw; - width: 50vw; - height: 50vh; -} - -#formFilters .container { - max-width: fit-content; -} - -thead, tbody { - padding-top: 0px !important; - padding-bottom: 0px !important; -} - -th { - background-color: var(--c_purple_pastel); -} -td { - font-size: min(12px, calc(1vh * 3)); -} - -th, td { - min-width: fit-content; -} -tr:not(:last-child) > td { - border-bottom: 1px dashed var(--c_purple_dark); -} -td > table > tbody > tr > td { - border: none !important; -} -th.collapsed, td.collapsed { - display: table-cell !important; -} -td.dirty { - background-color: var(--c_purple_dark); -} -td:not(.dirty) { - /* color: var(--c_purple_dark); */ - background-color: var(--c_purple_pastel); -} - -tr { - min-height: 1px; - border-bottom: 1px solid var(--c_purple_dark); - border-top: 1px solid var(--c_purple_dark); - background-color: transparent; -} - -/* -.row-new { - visibility: hidden; + top: } */ - -table button { - margin: 0.25vh; - padding: 0.5vh 1vh; +.button { + display: inline-block; + padding: 0.75rem 1.5rem; + border-radius: 6px; + text-decoration: none; + font-weight: 500; + transition: all 0.3s ease; + width: fit-content; } -table button.active { - background-color: var(--c_purple_pastel); +.button-primary { + background: var(--primary); + color: white; } -tr.delete, tr.delete > td { - background-color: red; +.button-primary:hover { + background: var(--secondary); } -table div { +.button-light { + background: white; + color: var(--primary); +} + +.button-light:hover { + background: var(--light); +} + +.logo:hover{ + cursor: pointer; +} + +header { + background: white; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + /* position: fixed; + top: 0; */ + width: 100%; + z-index: 1000; +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; +} + +.logo { + font-size: 1.5rem; + font-weight: bold; + color: var(--primary); +} + +.nav-links { + display: flex; + gap: 2rem; +} + +.nav-links a { + text-decoration: none; + color: var(--text); + font-weight: 500; align-content: center; } - - -/* Navigation */ -.topnav { - border-bottom-left-radius: 2.5vh; - border-bottom-right-radius: 2.5vh; - display: flex; - flex-wrap: wrap; - flex: 1; - flex-direction: row; - font-weight: bold; - font-size: 1vh; - max-height: 15vh; - height: 15vh; - align-items: flex-start; -} -.topnav a, .topnav label, .topnav p, .topnav h1 { - float: left; - display: flex; +.nav-links a.button { color: white; - text-align: center; +} + +.footer { + background: #1f2937; + color: #f3f4f6; + padding: 4rem 0 2rem; +} + +.footer-content { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; + margin-bottom: 2rem; +} + +.footer-section h3 { + color: #fff; + margin-bottom: 1rem; + font-size: 1.2rem; +} + +.footer-section ul { + list-style: none; + padding: 0; +} + +.footer-section ul li { + margin-bottom: 0.5rem; +} + +.footer-section a { + color: #f3f4f6; text-decoration: none; - width: 100%; - max-height: 15vh; - font-weight: normal; - justify-content: center; -} -.topnav a:hover { - background-color: var(--c_purple_light); - color: var(--c_purple_dark); + transition: color 0.3s ease; } -.topnav > .container { - max-width: 50%; - height: 100%; - align-items: center; - align-self: center; - /* align-content: center; */ - /* width: fit-content; */ - display: flex; +.footer-section a:hover { + color: #fff; + text-decoration: underline; } -.topnav select { - padding: 1vh; - margin: 1vh; - border-radius: 1vh; - /* background-color: var(--c_purple_light); */ - color: var(--c_purple_dark); - border: 2px solid white; - font-weight: bold; + +.footer-bottom { + border-top: 1px solid #374151; + padding-top: 2rem; text-align: center; -} -.topnav select .collapsed { - width: 5vw; -} -.topnav select .expanded { - width: 25vw; + font-size: 0.9rem; } -.company-name { - font-size: min(28px, calc(1vh * 7)); - color: white; +.footer-bottom a { + color: aquamarine; } -@media screen and (max-width: 450px) { - .company-name { - font-size: min(24px, calc(1vh * 7)); + +@media (max-width: 768px) { + .footer-content { + grid-template-columns: 1fr; + text-align: center; } } -/* Page Filters */ -#formFilters * { - font-size: 12px; -} -#formFilters .container { - max-width: fit-content; -} -#formFilters .container-input { - padding: 0 0.5vh; -} - -#formFilters .container-input input { - max-width: 5vh; -} - -#formFilters .container-input.filter.active { - width: 8vh; -} -#formFilters .container-input.filter.is_not_empty { - width: 12vh; -} - -button.collapsed { - display: block; - opacity: 0; -} - -form.filter button.save, form.filter button.button-cancel { - margin-top: 0; - margin-bottom: 0; -} -form.filter button.save, form.filter button.button-cancel { - margin-top: 0; - margin-bottom: 0; -} - -/* Footer */ -.footer { - padding: 1vh; - padding-left: 1vw; - padding-right: 1vw; +.text-center { text-align: center; - margin: 0; - height: 8vh !important; - overflow-y: auto; - background-color: var(--c_purple_pastel); - border-top-left-radius: 2.5vh; - border-top-right-radius: 2.5vh; - position: absolute; - /* top: 2.5vh; */ - bottom: 0; - width: 98vw; } -.footer > h4, h5 { - padding: 0; - margin: 0; +.section-title { + font-size: 2rem; + margin-bottom: 1rem; } -#tableMain { - overflow-x: auto; - padding: 1vh; - max-width: 95vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ - width: fit-content; - margin: 1vh 2vh; - align-items: normal; - justify-content: normal; +.section-subtitle { + margin-bottom: 2rem; } -#tableMain * { - padding: 0.25vh 0.5vh; -} - -#tableMain select, #tableMain input:not([type="checkbox"]), #tableMain textarea, #tableMain div { - box-sizing: border-box; - width: 100%; - height: 100%; -} - -#tableMain thead tr th, #tableMain tbody tr td { - width: 20vh; - min-width: 20vh; - padding: 0 0.5vh; -} -#tableMain tbody tr td { - height: 5vh; - padding-top: 0.5vh; -} -#tableMain tbody tr:not(:last-of-type) td { - padding-bottom: 0.5vh; -} -#tableMain thead tr th.active, #tableMain tbody tr td.active { - width: 6vh; - min-width: 6vh; -} -#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { - width: 5vh; - min-width: 5vh; -} - - - - - -:root { - --background-color: #ffffff; - --text-color: #333333; - --primary-color: #007bff; - --secondary-color: #6c757d; - --success-color: #28a745; - --danger-color: #dc3545; - --warning-color: #ffc107; - --info-color: #17a2b8; - --light-color: #f8f9fa; - --dark-color: #343a40; - --border-color: #dee2e6; - --shadow-color: rgba(0, 0, 0, 0.1); +@media (max-width: 768px) { + .hero h1 { + font-size: 2.5rem; + } - /* Header */ - --header-bg: #f8f9fa; - --header-text: #333333; - - /* Footer */ - --footer-bg: #f8f9fa; - --footer-text: #6c757d; - - /* Navigation */ - --nav-bg: #ffffff; - --nav-text: #333333; - --nav-hover-bg: #f1f3f5; - --nav-hover-text: #007bff; - - /* Buttons */ - --Button-primary-bg: #007bff; - --Button-primary-text: #ffffff; - --Button-secondary-bg: #6c757d; - --Button-secondary-text: #ffffff; - - /* Forms */ - --input-bg: #ffffff; - --input-border: #ced4da; - --input-text: #495057; - --input-focus-border: #80bdff; - - /* Cards */ - --card-bg: #ffffff; - --card-border: #dee2e6; - --card-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + .nav-links { + display: none; + } } +/* Default */ + /*# sourceMappingURL=main.bundle.css.map*/ \ No newline at end of file diff --git a/static/dist/js/core_admin_home.bundle.js b/static/dist/js/core_admin_home.bundle.js index b7f572da..6e543b60 100644 --- a/static/dist/js/core_admin_home.bundle.js +++ b/static/dist/js/core_admin_home.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 497: +/***/ 561: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 647: +/***/ 711: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 780: 0, -/******/ 564: 0 +/******/ 466: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [564], () => (__webpack_require__(647))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [564], () => (__webpack_require__(497))) +/******/ __webpack_require__.O(undefined, [466], () => (__webpack_require__(711))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [466], () => (__webpack_require__(561))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/core_contact.bundle.js b/static/dist/js/core_contact.bundle.js index f171a7ec..9d39c392 100644 --- a/static/dist/js/core_contact.bundle.js +++ b/static/dist/js/core_contact.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 206: +/***/ 278: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 647: +/***/ 711: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 775: 0, -/******/ 564: 0 +/******/ 466: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [564], () => (__webpack_require__(647))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [564], () => (__webpack_require__(206))) +/******/ __webpack_require__.O(undefined, [466], () => (__webpack_require__(711))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [466], () => (__webpack_require__(278))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/core_home.bundle.js b/static/dist/js/core_home.bundle.js index 81cafc5f..53bb722c 100644 --- a/static/dist/js/core_home.bundle.js +++ b/static/dist/js/core_home.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 469: +/***/ 805: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 647: +/***/ 711: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 664: 0, -/******/ 564: 0 +/******/ 466: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [564], () => (__webpack_require__(647))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [564], () => (__webpack_require__(469))) +/******/ __webpack_require__.O(undefined, [466], () => (__webpack_require__(711))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [466], () => (__webpack_require__(805))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/core_services.bundle.js b/static/dist/js/core_services.bundle.js index b26c5ab7..ea715ef1 100644 --- a/static/dist/js/core_services.bundle.js +++ b/static/dist/js/core_services.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 396: +/***/ 188: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 647: +/***/ 711: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 405: 0, -/******/ 564: 0 +/******/ 466: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [564], () => (__webpack_require__(647))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [564], () => (__webpack_require__(396))) +/******/ __webpack_require__.O(undefined, [466], () => (__webpack_require__(711))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [466], () => (__webpack_require__(188))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/legal_accessibility_statement.bundle.js b/static/dist/js/legal_accessibility_statement.bundle.js index 6a4f7c11..6412d1ae 100644 --- a/static/dist/js/legal_accessibility_statement.bundle.js +++ b/static/dist/js/legal_accessibility_statement.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 132: +/***/ 780: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 807: +/***/ 359: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 841: 0, -/******/ 830: 0 +/******/ 416: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [830], () => (__webpack_require__(807))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [830], () => (__webpack_require__(132))) +/******/ __webpack_require__.O(undefined, [416], () => (__webpack_require__(359))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [416], () => (__webpack_require__(780))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/legal_license.bundle.js b/static/dist/js/legal_license.bundle.js index 2c4f3a66..303e433f 100644 --- a/static/dist/js/legal_license.bundle.js +++ b/static/dist/js/legal_license.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 527: +/***/ 623: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 807: +/***/ 359: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 690: 0, -/******/ 830: 0 +/******/ 416: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [830], () => (__webpack_require__(807))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [830], () => (__webpack_require__(527))) +/******/ __webpack_require__.O(undefined, [416], () => (__webpack_require__(359))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [416], () => (__webpack_require__(623))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/legal_privacy_policy.bundle.js b/static/dist/js/legal_privacy_policy.bundle.js index 260c6aeb..fc95391f 100644 --- a/static/dist/js/legal_privacy_policy.bundle.js +++ b/static/dist/js/legal_privacy_policy.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 649: +/***/ 713: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 807: +/***/ 359: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 364: 0, -/******/ 830: 0 +/******/ 416: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [830], () => (__webpack_require__(807))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [830], () => (__webpack_require__(649))) +/******/ __webpack_require__.O(undefined, [416], () => (__webpack_require__(359))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [416], () => (__webpack_require__(713))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/legal_retention_schedule.bundle.js b/static/dist/js/legal_retention_schedule.bundle.js index 6faac6c5..1a032edc 100644 --- a/static/dist/js/legal_retention_schedule.bundle.js +++ b/static/dist/js/legal_retention_schedule.bundle.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 954: +/***/ 930: /***/ (() => { // extracted by mini-css-extract-plugin @@ -10,7 +10,7 @@ /***/ }), -/***/ 807: +/***/ 359: /***/ (() => { // extracted by mini-css-extract-plugin @@ -94,7 +94,7 @@ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ 607: 0, -/******/ 830: 0 +/******/ 416: 0 /******/ }; /******/ /******/ // no chunk on demand loading @@ -144,8 +144,8 @@ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, [830], () => (__webpack_require__(807))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [830], () => (__webpack_require__(954))) +/******/ __webpack_require__.O(undefined, [416], () => (__webpack_require__(359))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [416], () => (__webpack_require__(930))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/static/dist/js/main.bundle.js b/static/dist/js/main.bundle.js index b403cae4..18566f3b 100644 --- a/static/dist/js/main.bundle.js +++ b/static/dist/js/main.bundle.js @@ -1,18 +1,614 @@ /******/ (() => { // webpackBootstrap -/******/ "use strict"; -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +/******/ var __webpack_modules__ = ({ + +/***/ 431: +/***/ (function(module) { + +!function (e, t) { + true ? module.exports = t() : 0; +}(this, function () { + return function (e) { + function t(o) { + if (n[o]) return n[o].exports; + var i = n[o] = { + exports: {}, + id: o, + loaded: !1 + }; + return e[o].call(i.exports, i, i.exports, t), i.loaded = !0, i.exports; + } + var n = {}; + return t.m = e, t.c = n, t.p = "dist/", t(0); + }([function (e, t, n) { + "use strict"; + + function o(e) { + return e && e.__esModule ? e : { + default: e + }; + } + var i = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]); + } + return e; + }, + r = n(1), + a = (o(r), n(6)), + u = o(a), + c = n(7), + s = o(c), + f = n(8), + d = o(f), + l = n(9), + p = o(l), + m = n(10), + b = o(m), + v = n(11), + y = o(v), + g = n(14), + h = o(g), + w = [], + k = !1, + x = { + offset: 120, + delay: 0, + easing: "ease", + duration: 400, + disable: !1, + once: !1, + startEvent: "DOMContentLoaded", + throttleDelay: 99, + debounceDelay: 50, + disableMutationObserver: !1 + }, + j = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; + if (e && (k = !0), k) return w = (0, y.default)(w, x), (0, b.default)(w, x.once), w; + }, + O = function () { + w = (0, h.default)(), j(); + }, + M = function () { + w.forEach(function (e, t) { + e.node.removeAttribute("data-aos"), e.node.removeAttribute("data-aos-easing"), e.node.removeAttribute("data-aos-duration"), e.node.removeAttribute("data-aos-delay"); + }); + }, + S = function (e) { + return e === !0 || "mobile" === e && p.default.mobile() || "phone" === e && p.default.phone() || "tablet" === e && p.default.tablet() || "function" == typeof e && e() === !0; + }, + _ = function (e) { + x = i(x, e), w = (0, h.default)(); + var t = document.all && !window.atob; + return S(x.disable) || t ? M() : (x.disableMutationObserver || d.default.isSupported() || (console.info('\n aos: MutationObserver is not supported on this browser,\n code mutations observing has been disabled.\n You may have to call "refreshHard()" by yourself.\n '), x.disableMutationObserver = !0), document.querySelector("body").setAttribute("data-aos-easing", x.easing), document.querySelector("body").setAttribute("data-aos-duration", x.duration), document.querySelector("body").setAttribute("data-aos-delay", x.delay), "DOMContentLoaded" === x.startEvent && ["complete", "interactive"].indexOf(document.readyState) > -1 ? j(!0) : "load" === x.startEvent ? window.addEventListener(x.startEvent, function () { + j(!0); + }) : document.addEventListener(x.startEvent, function () { + j(!0); + }), window.addEventListener("resize", (0, s.default)(j, x.debounceDelay, !0)), window.addEventListener("orientationchange", (0, s.default)(j, x.debounceDelay, !0)), window.addEventListener("scroll", (0, u.default)(function () { + (0, b.default)(w, x.once); + }, x.throttleDelay)), x.disableMutationObserver || d.default.ready("[data-aos]", O), w); + }; + e.exports = { + init: _, + refresh: j, + refreshHard: O + }; + }, function (e, t) {},,,,, function (e, t) { + (function (t) { + "use strict"; + + function n(e, t, n) { + function o(t) { + var n = b, + o = v; + return b = v = void 0, k = t, g = e.apply(o, n); + } + function r(e) { + return k = e, h = setTimeout(f, t), M ? o(e) : g; + } + function a(e) { + var n = e - w, + o = e - k, + i = t - n; + return S ? j(i, y - o) : i; + } + function c(e) { + var n = e - w, + o = e - k; + return void 0 === w || n >= t || n < 0 || S && o >= y; + } + function f() { + var e = O(); + return c(e) ? d(e) : void (h = setTimeout(f, a(e))); + } + function d(e) { + return h = void 0, _ && b ? o(e) : (b = v = void 0, g); + } + function l() { + void 0 !== h && clearTimeout(h), k = 0, b = w = v = h = void 0; + } + function p() { + return void 0 === h ? g : d(O()); + } + function m() { + var e = O(), + n = c(e); + if (b = arguments, v = this, w = e, n) { + if (void 0 === h) return r(w); + if (S) return h = setTimeout(f, t), o(w); + } + return void 0 === h && (h = setTimeout(f, t)), g; + } + var b, + v, + y, + g, + h, + w, + k = 0, + M = !1, + S = !1, + _ = !0; + if ("function" != typeof e) throw new TypeError(s); + return t = u(t) || 0, i(n) && (M = !!n.leading, S = "maxWait" in n, y = S ? x(u(n.maxWait) || 0, t) : y, _ = "trailing" in n ? !!n.trailing : _), m.cancel = l, m.flush = p, m; + } + function o(e, t, o) { + var r = !0, + a = !0; + if ("function" != typeof e) throw new TypeError(s); + return i(o) && (r = "leading" in o ? !!o.leading : r, a = "trailing" in o ? !!o.trailing : a), n(e, t, { + leading: r, + maxWait: t, + trailing: a + }); + } + function i(e) { + var t = "undefined" == typeof e ? "undefined" : c(e); + return !!e && ("object" == t || "function" == t); + } + function r(e) { + return !!e && "object" == ("undefined" == typeof e ? "undefined" : c(e)); + } + function a(e) { + return "symbol" == ("undefined" == typeof e ? "undefined" : c(e)) || r(e) && k.call(e) == d; + } + function u(e) { + if ("number" == typeof e) return e; + if (a(e)) return f; + if (i(e)) { + var t = "function" == typeof e.valueOf ? e.valueOf() : e; + e = i(t) ? t + "" : t; + } + if ("string" != typeof e) return 0 === e ? e : +e; + e = e.replace(l, ""); + var n = m.test(e); + return n || b.test(e) ? v(e.slice(2), n ? 2 : 8) : p.test(e) ? f : +e; + } + var c = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + }, + s = "Expected a function", + f = NaN, + d = "[object Symbol]", + l = /^\s+|\s+$/g, + p = /^[-+]0x[0-9a-f]+$/i, + m = /^0b[01]+$/i, + b = /^0o[0-7]+$/i, + v = parseInt, + y = "object" == ("undefined" == typeof t ? "undefined" : c(t)) && t && t.Object === Object && t, + g = "object" == ("undefined" == typeof self ? "undefined" : c(self)) && self && self.Object === Object && self, + h = y || g || Function("return this")(), + w = Object.prototype, + k = w.toString, + x = Math.max, + j = Math.min, + O = function () { + return h.Date.now(); + }; + e.exports = o; + }).call(t, function () { + return this; + }()); + }, function (e, t) { + (function (t) { + "use strict"; + + function n(e, t, n) { + function i(t) { + var n = b, + o = v; + return b = v = void 0, O = t, g = e.apply(o, n); + } + function r(e) { + return O = e, h = setTimeout(f, t), M ? i(e) : g; + } + function u(e) { + var n = e - w, + o = e - O, + i = t - n; + return S ? x(i, y - o) : i; + } + function s(e) { + var n = e - w, + o = e - O; + return void 0 === w || n >= t || n < 0 || S && o >= y; + } + function f() { + var e = j(); + return s(e) ? d(e) : void (h = setTimeout(f, u(e))); + } + function d(e) { + return h = void 0, _ && b ? i(e) : (b = v = void 0, g); + } + function l() { + void 0 !== h && clearTimeout(h), O = 0, b = w = v = h = void 0; + } + function p() { + return void 0 === h ? g : d(j()); + } + function m() { + var e = j(), + n = s(e); + if (b = arguments, v = this, w = e, n) { + if (void 0 === h) return r(w); + if (S) return h = setTimeout(f, t), i(w); + } + return void 0 === h && (h = setTimeout(f, t)), g; + } + var b, + v, + y, + g, + h, + w, + O = 0, + M = !1, + S = !1, + _ = !0; + if ("function" != typeof e) throw new TypeError(c); + return t = a(t) || 0, o(n) && (M = !!n.leading, S = "maxWait" in n, y = S ? k(a(n.maxWait) || 0, t) : y, _ = "trailing" in n ? !!n.trailing : _), m.cancel = l, m.flush = p, m; + } + function o(e) { + var t = "undefined" == typeof e ? "undefined" : u(e); + return !!e && ("object" == t || "function" == t); + } + function i(e) { + return !!e && "object" == ("undefined" == typeof e ? "undefined" : u(e)); + } + function r(e) { + return "symbol" == ("undefined" == typeof e ? "undefined" : u(e)) || i(e) && w.call(e) == f; + } + function a(e) { + if ("number" == typeof e) return e; + if (r(e)) return s; + if (o(e)) { + var t = "function" == typeof e.valueOf ? e.valueOf() : e; + e = o(t) ? t + "" : t; + } + if ("string" != typeof e) return 0 === e ? e : +e; + e = e.replace(d, ""); + var n = p.test(e); + return n || m.test(e) ? b(e.slice(2), n ? 2 : 8) : l.test(e) ? s : +e; + } + var u = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; + }, + c = "Expected a function", + s = NaN, + f = "[object Symbol]", + d = /^\s+|\s+$/g, + l = /^[-+]0x[0-9a-f]+$/i, + p = /^0b[01]+$/i, + m = /^0o[0-7]+$/i, + b = parseInt, + v = "object" == ("undefined" == typeof t ? "undefined" : u(t)) && t && t.Object === Object && t, + y = "object" == ("undefined" == typeof self ? "undefined" : u(self)) && self && self.Object === Object && self, + g = v || y || Function("return this")(), + h = Object.prototype, + w = h.toString, + k = Math.max, + x = Math.min, + j = function () { + return g.Date.now(); + }; + e.exports = n; + }).call(t, function () { + return this; + }()); + }, function (e, t) { + "use strict"; + + function n(e) { + var t = void 0, + o = void 0, + i = void 0; + for (t = 0; t < e.length; t += 1) { + if (o = e[t], o.dataset && o.dataset.aos) return !0; + if (i = o.children && n(o.children)) return !0; + } + return !1; + } + function o() { + return window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; + } + function i() { + return !!o(); + } + function r(e, t) { + var n = window.document, + i = o(), + r = new i(a); + u = t, r.observe(n.documentElement, { + childList: !0, + subtree: !0, + removedNodes: !0 + }); + } + function a(e) { + e && e.forEach(function (e) { + var t = Array.prototype.slice.call(e.addedNodes), + o = Array.prototype.slice.call(e.removedNodes), + i = t.concat(o); + if (n(i)) return u(); + }); + } + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var u = function () {}; + t.default = { + isSupported: i, + ready: r + }; + }, function (e, t) { + "use strict"; + + function n(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + function o() { + return navigator.userAgent || navigator.vendor || window.opera || ""; + } + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var i = function () { + function e(e, t) { + for (var n = 0; n < t.length; n++) { + var o = t[n]; + o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, o.key, o); + } + } + return function (t, n, o) { + return n && e(t.prototype, n), o && e(t, o), t; + }; + }(), + r = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i, + a = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i, + u = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i, + c = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i, + s = function () { + function e() { + n(this, e); + } + return i(e, [{ + key: "phone", + value: function () { + var e = o(); + return !(!r.test(e) && !a.test(e.substr(0, 4))); + } + }, { + key: "mobile", + value: function () { + var e = o(); + return !(!u.test(e) && !c.test(e.substr(0, 4))); + } + }, { + key: "tablet", + value: function () { + return this.mobile() && !this.phone(); + } + }]), e; + }(); + t.default = new s(); + }, function (e, t) { + "use strict"; + + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var n = function (e, t, n) { + var o = e.node.getAttribute("data-aos-once"); + t > e.position ? e.node.classList.add("aos-animate") : "undefined" != typeof o && ("false" === o || !n && "true" !== o) && e.node.classList.remove("aos-animate"); + }, + o = function (e, t) { + var o = window.pageYOffset, + i = window.innerHeight; + e.forEach(function (e, r) { + n(e, i + o, t); + }); + }; + t.default = o; + }, function (e, t, n) { + "use strict"; + + function o(e) { + return e && e.__esModule ? e : { + default: e + }; + } + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var i = n(12), + r = o(i), + a = function (e, t) { + return e.forEach(function (e, n) { + e.node.classList.add("aos-init"), e.position = (0, r.default)(e.node, t.offset); + }), e; + }; + t.default = a; + }, function (e, t, n) { + "use strict"; + + function o(e) { + return e && e.__esModule ? e : { + default: e + }; + } + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var i = n(13), + r = o(i), + a = function (e, t) { + var n = 0, + o = 0, + i = window.innerHeight, + a = { + offset: e.getAttribute("data-aos-offset"), + anchor: e.getAttribute("data-aos-anchor"), + anchorPlacement: e.getAttribute("data-aos-anchor-placement") + }; + switch (a.offset && !isNaN(a.offset) && (o = parseInt(a.offset)), a.anchor && document.querySelectorAll(a.anchor) && (e = document.querySelectorAll(a.anchor)[0]), n = (0, r.default)(e).top, a.anchorPlacement) { + case "top-bottom": + break; + case "center-bottom": + n += e.offsetHeight / 2; + break; + case "bottom-bottom": + n += e.offsetHeight; + break; + case "top-center": + n += i / 2; + break; + case "bottom-center": + n += i / 2 + e.offsetHeight; + break; + case "center-center": + n += i / 2 + e.offsetHeight / 2; + break; + case "top-top": + n += i; + break; + case "bottom-top": + n += e.offsetHeight + i; + break; + case "center-top": + n += e.offsetHeight / 2 + i; + } + return a.anchorPlacement || a.offset || isNaN(t) || (o = t), n + o; + }; + t.default = a; + }, function (e, t) { + "use strict"; + + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var n = function (e) { + for (var t = 0, n = 0; e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop);) t += e.offsetLeft - ("BODY" != e.tagName ? e.scrollLeft : 0), n += e.offsetTop - ("BODY" != e.tagName ? e.scrollTop : 0), e = e.offsetParent; + return { + top: n, + left: t + }; + }; + t.default = n; + }, function (e, t) { + "use strict"; + + Object.defineProperty(t, "__esModule", { + value: !0 + }); + var n = function (e) { + return e = e || document.querySelectorAll("[data-aos]"), Array.prototype.map.call(e, function (e) { + return { + node: e + }; + }); + }; + t.default = n; + }]); +}); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // UNUSED EXPORTS: default -;// CONCATENATED MODULE: ./static/js/lib/validation.js +;// ./static/js/lib/validation.js function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -var validation_Validation = /*#__PURE__*/function () { +var Validation = /*#__PURE__*/function () { function Validation() { _classCallCheck(this, Validation); } @@ -158,7 +754,7 @@ var validation_Validation = /*#__PURE__*/function () { }]); }(); -;// CONCATENATED MODULE: ./static/js/dom.js +;// ./static/js/dom.js function dom_typeof(o) { "@babel/helpers - typeof"; return dom_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, dom_typeof(o); } function _defineProperty(e, r, t) { return (r = dom_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function dom_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } @@ -210,7 +806,7 @@ var DOM = /*#__PURE__*/function () { }, { key: "setElementValueCurrentIfEmpty", value: function setElementValueCurrentIfEmpty(element, data) { - if (validation_Validation.isEmpty(DOM.getElementValueCurrent(element))) { + if (Validation.isEmpty(DOM.getElementValueCurrent(element))) { DOM.setElementValueCurrent(element, data); } } @@ -222,7 +818,7 @@ var DOM = /*#__PURE__*/function () { }, { key: "getRowFromElement", value: function getRowFromElement(element, flagRow) { - var selector = validation_Validation.isEmpty(flagRow) ? 'tr' : 'tr.' + flagRow; + var selector = Validation.isEmpty(flagRow) ? 'tr' : 'tr.' + flagRow; return element.closest(selector); } }, { @@ -241,7 +837,7 @@ var DOM = /*#__PURE__*/function () { key: "convertForm2JSON", value: function convertForm2JSON(elementForm) { var dataForm = {}; - if (validation_Validation.isEmpty(elementForm)) { + if (Validation.isEmpty(elementForm)) { return dataForm; } var containersFilter = elementForm.querySelectorAll('.' + flagContainerInput + '.' + flagFilter); @@ -312,7 +908,7 @@ var DOM = /*#__PURE__*/function () { key: "getElementValueCurrent", value: function getElementValueCurrent(element) { var returnVal = ''; - if (!validation_Validation.isEmpty(element)) { + if (!Validation.isEmpty(element)) { if (element.type === "checkbox") { returnVal = element.checked; } @@ -330,15 +926,16 @@ var DOM = /*#__PURE__*/function () { returnVal = element.textContent; } } - if (validation_Validation.isEmpty(returnVal)) returnVal = ''; + if (Validation.isEmpty(returnVal)) returnVal = ''; return returnVal; } }, { key: "getElementAttributeValueCurrent", value: function getElementAttributeValueCurrent(element) { - if (validation_Validation.isEmpty(element)) return null; + debugger; + if (Validation.isEmpty(element)) return null; return element.getAttribute(attrValueCurrent); - if (!validation_Validation.isEmpty(value) && element.type === "checkbox") { + if (!Validation.isEmpty(value) && element.type === "checkbox") { value = value === 'true'; } return value; @@ -346,9 +943,9 @@ var DOM = /*#__PURE__*/function () { }, { key: "getElementAttributeValuePrevious", value: function getElementAttributeValuePrevious(element) { - if (validation_Validation.isEmpty(element)) return null; + if (Validation.isEmpty(element)) return null; return element.getAttribute(attrValuePrevious); - if (!validation_Validation.isEmpty(value) && element.type === "checkbox") { + if (!Validation.isEmpty(value) && element.type === "checkbox") { value = value === 'true'; } return value; @@ -412,7 +1009,7 @@ var DOM = /*#__PURE__*/function () { }, { key: "createOption", value: function createOption(optionJson) { - if (validation_Validation.isEmpty(optionJson)) optionJson = { + if (Validation.isEmpty(optionJson)) optionJson = { text: 'Select', value: 0 }; @@ -425,7 +1022,7 @@ var DOM = /*#__PURE__*/function () { }]); }(); -;// CONCATENATED MODULE: ./static/js/lib/events.js +;// ./static/js/lib/events.js function events_typeof(o) { "@babel/helpers - typeof"; return events_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, events_typeof(o); } function events_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function events_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, events_toPropertyKey(o.key), o); } } @@ -448,7 +1045,7 @@ var Events = /*#__PURE__*/function () { }]); }(); -;// CONCATENATED MODULE: ./static/js/lib/local_storage.js +;// ./static/js/lib/local_storage.js function local_storage_typeof(o) { "@babel/helpers - typeof"; return local_storage_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, local_storage_typeof(o); } function local_storage_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function local_storage_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, local_storage_toPropertyKey(o.key), o); } } @@ -524,7 +1121,448 @@ var LocalStorage = /*#__PURE__*/function () { }]); }(); -;// CONCATENATED MODULE: ./static/js/api.js +;// ./static/js/components/common/temporary/overlay_confirm.js +function overlay_confirm_typeof(o) { "@babel/helpers - typeof"; return overlay_confirm_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, overlay_confirm_typeof(o); } +function overlay_confirm_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function overlay_confirm_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, overlay_confirm_toPropertyKey(o.key), o); } } +function overlay_confirm_createClass(e, r, t) { return r && overlay_confirm_defineProperties(e.prototype, r), t && overlay_confirm_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function overlay_confirm_toPropertyKey(t) { var i = overlay_confirm_toPrimitive(t, "string"); return "symbol" == overlay_confirm_typeof(i) ? i : i + ""; } +function overlay_confirm_toPrimitive(t, r) { if ("object" != overlay_confirm_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != overlay_confirm_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var OverlayConfirm = /*#__PURE__*/function () { + function OverlayConfirm() { + overlay_confirm_classCallCheck(this, OverlayConfirm); + } + return overlay_confirm_createClass(OverlayConfirm, null, [{ + key: "hookup", + value: function hookup(callbackSuccess) { + Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagCancel, flagInitialised, function (buttonCancel) { + buttonCancel.addEventListener('click', function () { + var overlay = document.querySelector(idOverlayConfirm); + overlay.style.visibility = 'hidden'; + }); + }); + Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagSubmit, flagInitialised, function (buttonConfirm) { + buttonConfirm.addEventListener('click', function () { + var overlay = document.querySelector(idOverlayConfirm); + var textarea = overlay.querySelector('textarea'); + overlay.style.visibility = 'hidden'; + callbackSuccess(textarea.value); + }); + }); + } + }, { + key: "show", + value: function show() { + var overlay = document.querySelector(idOverlayConfirm); + overlay.classList.remove(flagCollapsed); + overlay.style.visibility = 'visible'; + } + }]); +}(); + +;// ./static/js/pages/base.js +function base_typeof(o) { "@babel/helpers - typeof"; return base_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, base_typeof(o); } +function base_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function base_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, base_toPropertyKey(o.key), o); } } +function base_createClass(e, r, t) { return r && base_defineProperties(e.prototype, r), t && base_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function base_toPropertyKey(t) { var i = base_toPrimitive(t, "string"); return "symbol" == base_typeof(i) ? i : i + ""; } +function base_toPrimitive(t, r) { if ("object" != base_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != base_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + + + + + + + +var BasePage = /*#__PURE__*/function () { + function BasePage(router) { + base_classCallCheck(this, BasePage); + if (!router) { + throw new Error("Router is required"); + } else { + if (_verbose) { + console.log("initialising with router: ", router); + } + } + this.router = router; + this.title = titlePageCurrent; + // this.hash = hashPageCurrent; + if (this.constructor === BasePage) { + throw new Error("Cannot instantiate abstract class"); + } + if (!this.constructor.hash) { + throw new Error("Class ".concat(this.constructor.name, " must have a static hash attribute.")); + } + } + return base_createClass(BasePage, [{ + key: "initialize", + value: function initialize() { + throw new Error("Method 'initialize()' must be implemented."); + } + }, { + key: "sharedInitialize", + value: function sharedInitialize() { + this.logInitialisation(); + this.hookupCommonElements(); + } + }, { + key: "logInitialisation", + value: function logInitialisation() { + if (_verbose) { + console.log('Initializing ' + this.title + ' page'); + } + } + }, { + key: "hookupCommonElements", + value: function hookupCommonElements() { + // hookupVideos(); + this.hookupLogos(); + this.hookupOverlays(); + } + }, { + key: "hookupEventHandler", + value: function hookupEventHandler(eventType, selector, callback) { + Events.initialiseEventHandler(selector, flagInitialised, function (element) { + element.addEventListener(eventType, function (event) { + event.stopPropagation(); + callback(event, element); + }); + }); + } + }, { + key: "hookupLogos", + value: function hookupLogos() { + var _this = this; + this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, function (event, element) { + if (_verbose) { + console.log('clicking logo'); + } + _this.router.navigateToHash(hashPageHome); + }); + } + }, { + key: "hookupOverlays", + value: function hookupOverlays() { + this.hookupOverlayFromId(idOverlayConfirm); + this.hookupOverlayFromId(idOverlayError); + } + }, { + key: "hookupOverlayFromId", + value: function hookupOverlayFromId(idOverlay) { + Events.initialiseEventHandler(idOverlay, flagInitialised, function (overlay) { + overlay.querySelector('button.' + flagCancel).addEventListener("click", function (event) { + event.stopPropagation(); + overlay.style.display = 'none'; + }); + }); + } + }, { + key: "hookupButtonSave", + value: function hookupButtonSave() { + var _this2 = this; + Events.initialiseEventHandler('form.' + flagFilter + ' button.' + flagSave, flagInitialised, function (button) { + button.addEventListener("click", function (event) { + event.stopPropagation(); + if (_verbose) { + console.log('saving page: ', _this2.title); + } + OverlayConfirm.show(); + }); + // button.classList.add(flagCollapsed); + }); + } + }, { + key: "leave", + value: function leave() { + if (_verbose) { + console.log('Leaving ' + this.title + ' page'); + } + if (this.constructor === BasePage) { + throw new Error("Must implement leave() method."); + } + } + }, { + key: "setLocalStoragePage", + value: function setLocalStoragePage(dataPage) { + LocalStorage.setLocalStorage(this.hash, dataPage); + } + }, { + key: "getLocalStoragePage", + value: function getLocalStoragePage() { + return LocalStorage.getLocalStorage(this.hash); + } + }, { + key: "toggleShowButtonsSaveCancel", + value: function toggleShowButtonsSaveCancel(show) { + // , buttonSave = null, buttonCancel = null + var buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave); + var buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel); + if (show) { + buttonCancel.classList.remove(flagCollapsed); + buttonSave.classList.remove(flagCollapsed); + if (_verbose) { + console.log('showing buttons'); + } + } else { + buttonCancel.classList.add(flagCollapsed); + buttonSave.classList.add(flagCollapsed); + if (_verbose) { + console.log('hiding buttons'); + } + } + } + }], [{ + key: "isDirtyFilter", + value: function isDirtyFilter(filter) { + var isDirty = DOM.updateAndCheckIsElementDirty(filter); + if (isDirty) document.querySelectorAll(idTableMain + ' tbody tr').remove(); + return isDirty; + } + }]); +}(); + +// EXTERNAL MODULE: ./node_modules/aos/dist/aos.js +var aos = __webpack_require__(431); +var aos_default = /*#__PURE__*/__webpack_require__.n(aos); +;// ./static/js/pages/core/home.js +function home_typeof(o) { "@babel/helpers - typeof"; return home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, home_typeof(o); } +function home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, home_toPropertyKey(o.key), o); } } +function home_createClass(e, r, t) { return r && home_defineProperties(e.prototype, r), t && home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } +function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function home_defineProperty(e, r, t) { return (r = home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function home_toPropertyKey(t) { var i = home_toPrimitive(t, "string"); return "symbol" == home_typeof(i) ? i : i + ""; } +function home_toPrimitive(t, r) { if ("object" != home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +// internal + +// external + +var PageHome = /*#__PURE__*/function (_BasePage) { + function PageHome(router) { + home_classCallCheck(this, PageHome); + return _callSuper(this, PageHome, [router]); + } + _inherits(PageHome, _BasePage); + return home_createClass(PageHome, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + this.hookupButtonsNavContact(); + // this.initialiseAOS(); + this.initialiseAnimations(); + } + + /* AOS */ + }, { + key: "initialiseAOS", + value: function initialiseAOS() { + aos_default().init({ + duration: 1000, + once: true + }); + } + /* Manual animations * + initialiseAnimations() { + // Check if IntersectionObserver is supported + if ('IntersectionObserver' in window) { + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + } + }); + }, { + threshold: 0.1, + rootMargin: '50px' + }); + // Observe all elements with 'reveal' class + document.querySelectorAll('.reveal').forEach((element) => { + observer.observe(element); + }); + } else { + // If IntersectionObserver is not supported, make all elements visible + document.querySelectorAll('.reveal').forEach((element) => { + element.style.opacity = 1; + }); + } + } + */ + }, { + key: "leave", + value: function leave() { + _superPropGet(PageHome, "leave", this, 3)([]); + } + }]); +}(BasePage); +home_defineProperty(PageHome, "hash", hashPageHome); + +;// ./static/js/pages/core/contact.js +function contact_typeof(o) { "@babel/helpers - typeof"; return contact_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, contact_typeof(o); } +function contact_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function contact_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, contact_toPropertyKey(o.key), o); } } +function contact_createClass(e, r, t) { return r && contact_defineProperties(e.prototype, r), t && contact_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function contact_callSuper(t, o, e) { return o = contact_getPrototypeOf(o), contact_possibleConstructorReturn(t, contact_isNativeReflectConstruct() ? Reflect.construct(o, e || [], contact_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function contact_possibleConstructorReturn(t, e) { if (e && ("object" == contact_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return contact_assertThisInitialized(t); } +function contact_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function contact_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (contact_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function contact_getPrototypeOf(t) { return contact_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, contact_getPrototypeOf(t); } +function contact_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && contact_setPrototypeOf(t, e); } +function contact_setPrototypeOf(t, e) { return contact_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, contact_setPrototypeOf(t, e); } +function contact_defineProperty(e, r, t) { return (r = contact_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function contact_toPropertyKey(t) { var i = contact_toPrimitive(t, "string"); return "symbol" == contact_typeof(i) ? i : i + ""; } +function contact_toPrimitive(t, r) { if ("object" != contact_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != contact_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var PageContact = /*#__PURE__*/function (_BasePage) { + function PageContact(router) { + contact_classCallCheck(this, PageContact); + return contact_callSuper(this, PageContact, [router]); + } + contact_inherits(PageContact, _BasePage); + return contact_createClass(PageContact, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + this.hookupButtonSubmitFormContactUs(); + } + }, { + key: "hookupButtonSubmitFormContactUs", + value: function hookupButtonSubmitFormContactUs() { + var button = document.querySelector('form input[type="submit"]'); + button.classList.add(flagButton); + button.classList.add(flagButtonPrimary); + } + }]); +}(BasePage); +contact_defineProperty(PageContact, "hash", hashPageContact); + +;// ./static/js/pages/legal/accessibility_report.js +function accessibility_report_typeof(o) { "@babel/helpers - typeof"; return accessibility_report_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, accessibility_report_typeof(o); } +function accessibility_report_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function accessibility_report_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, accessibility_report_toPropertyKey(o.key), o); } } +function accessibility_report_createClass(e, r, t) { return r && accessibility_report_defineProperties(e.prototype, r), t && accessibility_report_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function accessibility_report_callSuper(t, o, e) { return o = accessibility_report_getPrototypeOf(o), accessibility_report_possibleConstructorReturn(t, accessibility_report_isNativeReflectConstruct() ? Reflect.construct(o, e || [], accessibility_report_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function accessibility_report_possibleConstructorReturn(t, e) { if (e && ("object" == accessibility_report_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return accessibility_report_assertThisInitialized(t); } +function accessibility_report_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function accessibility_report_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (accessibility_report_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function accessibility_report_superPropGet(t, o, e, r) { var p = accessibility_report_get(accessibility_report_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function accessibility_report_get() { return accessibility_report_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = accessibility_report_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, accessibility_report_get.apply(null, arguments); } +function accessibility_report_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = accessibility_report_getPrototypeOf(t));); return t; } +function accessibility_report_getPrototypeOf(t) { return accessibility_report_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, accessibility_report_getPrototypeOf(t); } +function accessibility_report_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && accessibility_report_setPrototypeOf(t, e); } +function accessibility_report_setPrototypeOf(t, e) { return accessibility_report_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, accessibility_report_setPrototypeOf(t, e); } +function accessibility_report_defineProperty(e, r, t) { return (r = accessibility_report_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function accessibility_report_toPropertyKey(t) { var i = accessibility_report_toPrimitive(t, "string"); return "symbol" == accessibility_report_typeof(i) ? i : i + ""; } +function accessibility_report_toPrimitive(t, r) { if ("object" != accessibility_report_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != accessibility_report_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var PageAccessibilityReport = /*#__PURE__*/function (_BasePage) { + function PageAccessibilityReport(router) { + accessibility_report_classCallCheck(this, PageAccessibilityReport); + return accessibility_report_callSuper(this, PageAccessibilityReport, [router]); + } + accessibility_report_inherits(PageAccessibilityReport, _BasePage); + return accessibility_report_createClass(PageAccessibilityReport, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + } + }, { + key: "leave", + value: function leave() { + accessibility_report_superPropGet(PageAccessibilityReport, "leave", this, 3)([]); + } + }]); +}(BasePage); +accessibility_report_defineProperty(PageAccessibilityReport, "hash", hashPageAccessibilityReport); + +;// ./static/js/pages/legal/accessibility_statement.js +function accessibility_statement_typeof(o) { "@babel/helpers - typeof"; return accessibility_statement_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, accessibility_statement_typeof(o); } +function accessibility_statement_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function accessibility_statement_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, accessibility_statement_toPropertyKey(o.key), o); } } +function accessibility_statement_createClass(e, r, t) { return r && accessibility_statement_defineProperties(e.prototype, r), t && accessibility_statement_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function accessibility_statement_callSuper(t, o, e) { return o = accessibility_statement_getPrototypeOf(o), accessibility_statement_possibleConstructorReturn(t, accessibility_statement_isNativeReflectConstruct() ? Reflect.construct(o, e || [], accessibility_statement_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function accessibility_statement_possibleConstructorReturn(t, e) { if (e && ("object" == accessibility_statement_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return accessibility_statement_assertThisInitialized(t); } +function accessibility_statement_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function accessibility_statement_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (accessibility_statement_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function accessibility_statement_superPropGet(t, o, e, r) { var p = accessibility_statement_get(accessibility_statement_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function accessibility_statement_get() { return accessibility_statement_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = accessibility_statement_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, accessibility_statement_get.apply(null, arguments); } +function accessibility_statement_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = accessibility_statement_getPrototypeOf(t));); return t; } +function accessibility_statement_getPrototypeOf(t) { return accessibility_statement_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, accessibility_statement_getPrototypeOf(t); } +function accessibility_statement_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && accessibility_statement_setPrototypeOf(t, e); } +function accessibility_statement_setPrototypeOf(t, e) { return accessibility_statement_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, accessibility_statement_setPrototypeOf(t, e); } +function accessibility_statement_defineProperty(e, r, t) { return (r = accessibility_statement_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function accessibility_statement_toPropertyKey(t) { var i = accessibility_statement_toPrimitive(t, "string"); return "symbol" == accessibility_statement_typeof(i) ? i : i + ""; } +function accessibility_statement_toPrimitive(t, r) { if ("object" != accessibility_statement_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != accessibility_statement_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var PageAccessibilityStatement = /*#__PURE__*/function (_BasePage) { + function PageAccessibilityStatement(router) { + accessibility_statement_classCallCheck(this, PageAccessibilityStatement); + return accessibility_statement_callSuper(this, PageAccessibilityStatement, [router]); + } + accessibility_statement_inherits(PageAccessibilityStatement, _BasePage); + return accessibility_statement_createClass(PageAccessibilityStatement, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + } + }, { + key: "leave", + value: function leave() { + accessibility_statement_superPropGet(PageAccessibilityStatement, "leave", this, 3)([]); + } + }]); +}(BasePage); +accessibility_statement_defineProperty(PageAccessibilityStatement, "hash", hashPageAccessibilityStatement); + +;// ./static/js/pages/legal/license.js +function license_typeof(o) { "@babel/helpers - typeof"; return license_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, license_typeof(o); } +function license_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function license_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, license_toPropertyKey(o.key), o); } } +function license_createClass(e, r, t) { return r && license_defineProperties(e.prototype, r), t && license_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function license_callSuper(t, o, e) { return o = license_getPrototypeOf(o), license_possibleConstructorReturn(t, license_isNativeReflectConstruct() ? Reflect.construct(o, e || [], license_getPrototypeOf(t).constructor) : o.apply(t, e)); } +function license_possibleConstructorReturn(t, e) { if (e && ("object" == license_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return license_assertThisInitialized(t); } +function license_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function license_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (license_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function license_superPropGet(t, o, e, r) { var p = license_get(license_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } +function license_get() { return license_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = license_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, license_get.apply(null, arguments); } +function license_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = license_getPrototypeOf(t));); return t; } +function license_getPrototypeOf(t) { return license_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, license_getPrototypeOf(t); } +function license_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && license_setPrototypeOf(t, e); } +function license_setPrototypeOf(t, e) { return license_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, license_setPrototypeOf(t, e); } +function license_defineProperty(e, r, t) { return (r = license_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } +function license_toPropertyKey(t) { var i = license_toPrimitive(t, "string"); return "symbol" == license_typeof(i) ? i : i + ""; } +function license_toPrimitive(t, r) { if ("object" != license_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != license_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var PageLicense = /*#__PURE__*/function (_BasePage) { + function PageLicense(router) { + license_classCallCheck(this, PageLicense); + return license_callSuper(this, PageLicense, [router]); + } + license_inherits(PageLicense, _BasePage); + return license_createClass(PageLicense, [{ + key: "initialize", + value: function initialize() { + this.sharedInitialize(); + } + }, { + key: "leave", + value: function leave() { + license_superPropGet(PageLicense, "leave", this, 3)([]); + } + }]); +}(BasePage); +license_defineProperty(PageLicense, "hash", hashPageLicense); + +;// ./static/js/api.js function api_typeof(o) { "@babel/helpers - typeof"; return api_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, api_typeof(o); } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == api_typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(api_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } @@ -540,7 +1578,7 @@ function api_toPrimitive(t, r) { if ("object" != api_typeof(t) || !t) return t; // Module for API calls -var api_API = /*#__PURE__*/function () { +var API = /*#__PURE__*/function () { function API() { api_classCallCheck(this, API); } @@ -909,5912 +1947,7 @@ document.addEventListener('DOMContentLoaded', () => { }); */ -;// CONCATENATED MODULE: ./static/js/components/common/temporary/overlay_confirm.js -function overlay_confirm_typeof(o) { "@babel/helpers - typeof"; return overlay_confirm_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, overlay_confirm_typeof(o); } -function overlay_confirm_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function overlay_confirm_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, overlay_confirm_toPropertyKey(o.key), o); } } -function overlay_confirm_createClass(e, r, t) { return r && overlay_confirm_defineProperties(e.prototype, r), t && overlay_confirm_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function overlay_confirm_toPropertyKey(t) { var i = overlay_confirm_toPrimitive(t, "string"); return "symbol" == overlay_confirm_typeof(i) ? i : i + ""; } -function overlay_confirm_toPrimitive(t, r) { if ("object" != overlay_confirm_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != overlay_confirm_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var OverlayConfirm = /*#__PURE__*/function () { - function OverlayConfirm() { - overlay_confirm_classCallCheck(this, OverlayConfirm); - } - return overlay_confirm_createClass(OverlayConfirm, null, [{ - key: "hookup", - value: function hookup(callbackSuccess) { - Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagCancel, flagInitialised, function (buttonCancel) { - buttonCancel.addEventListener('click', function () { - var overlay = document.querySelector(idOverlayConfirm); - overlay.style.visibility = 'hidden'; - }); - }); - Events.initialiseEventHandler(idOverlayConfirm + ' button.' + flagSubmit, flagInitialised, function (buttonConfirm) { - buttonConfirm.addEventListener('click', function () { - var overlay = document.querySelector(idOverlayConfirm); - var textarea = overlay.querySelector('textarea'); - overlay.style.visibility = 'hidden'; - callbackSuccess(textarea.value); - }); - }); - } - }, { - key: "show", - value: function show() { - var overlay = document.querySelector(idOverlayConfirm); - overlay.classList.remove(flagCollapsed); - overlay.style.visibility = 'visible'; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/pages/base.js -function base_typeof(o) { "@babel/helpers - typeof"; return base_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, base_typeof(o); } -function base_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function base_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, base_toPropertyKey(o.key), o); } } -function base_createClass(e, r, t) { return r && base_defineProperties(e.prototype, r), t && base_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function base_toPropertyKey(t) { var i = base_toPrimitive(t, "string"); return "symbol" == base_typeof(i) ? i : i + ""; } -function base_toPrimitive(t, r) { if ("object" != base_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != base_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - -var BasePage = /*#__PURE__*/function () { - function BasePage(router) { - base_classCallCheck(this, BasePage); - if (!router) { - throw new Error("Router is required"); - } else { - if (_verbose) { - console.log("initialising with router: ", router); - } - } - this.router = router; - this.title = titlePageCurrent; - // this.hash = hashPageCurrent; - if (this.constructor === BasePage) { - throw new Error("Cannot instantiate abstract class"); - } - if (!this.constructor.hash) { - throw new Error("Class ".concat(this.constructor.name, " must have a static hash attribute.")); - } - } - return base_createClass(BasePage, [{ - key: "initialize", - value: function initialize() { - throw new Error("Method 'initialize()' must be implemented."); - } - }, { - key: "sharedInitialize", - value: function sharedInitialize() { - this.logInitialisation(); - this.hookupCommonElements(); - } - }, { - key: "logInitialisation", - value: function logInitialisation() { - if (_verbose) { - console.log('Initializing ' + this.title + ' page'); - } - } - }, { - key: "hookupCommonElements", - value: function hookupCommonElements() { - // hookupVideos(); - this.hookupNavigation(); - this.hookupImagesLogo(); - this.hookupOverlays(); - } - }, { - key: "hookupNavigation", - value: function hookupNavigation() { - /* Can be removed: */ - var overlayHamburger = document.querySelector(idOverlayHamburger); - var hamburgerOptions = overlayHamburger.querySelectorAll('div.' + flagRow); - var countOptions = hamburgerOptions.length; - // console.log('count nav options: ', countOptions); - // overlayHamburger.css('height', (countOptions * 27) + 'px'); - /* end of can be removed */ - - this.hookupEventHandler("click", idButtonHamburger, function (event, element) { - var overlayHamburger = document.querySelector(idOverlayHamburger); - if (overlayHamburger.classList.contains(flagCollapsed)) { - overlayHamburger.classList.remove(flagCollapsed); - overlayHamburger.classList.add(flagExpanded); - } else { - overlayHamburger.classList.remove(flagExpanded); - overlayHamburger.classList.add(flagCollapsed); - } - // overlayHamburger.classList.add(flagInitialised); - }); - this.hookupButtonsNavHome(); - this.hookupButtonsNavServices(); - this.hookupButtonsNavContact(); - this.hookupButtonsNavUserAccount(); - this.hookupButtonsNavUserLogout(); - this.hookupButtonsNavUserLogin(); - this.hookupButtonsNavStoreHome(); - this.hookupButtonsNavStoreManufacturingPurchaseOrders(); - this.hookupButtonsNavStoreProductPermutations(); - this.hookupButtonsNavStoreStockItems(); - this.hookupButtonsNavStoreSuppliers(); - this.hookupButtonsNavStoreSupplierPurchaseOrders(); - this.hookupButtonsNavAdminHome(); - } - }, { - key: "hookupEventHandler", - value: function hookupEventHandler(eventType, selector, callback) { - Events.initialiseEventHandler(selector, flagInitialised, function (element) { - element.addEventListener(eventType, function (event) { - event.stopPropagation(); - callback(event, element); - }); - }); - } - }, { - key: "hookupButtonsNavHome", - value: function hookupButtonsNavHome() { - this.hookupButtonsNav('.' + flagNavHome, hashPageHome); - } - }, { - key: "hookupButtonsNav", - value: function hookupButtonsNav(buttonSelector, hashPageNav) { - var _this = this; - this.hookupEventHandler("click", buttonSelector, function (event, button) { - _this.router.navigateToHash(hashPageNav); - }); - } - }, { - key: "hookupButtonsNavServices", - value: function hookupButtonsNavServices() { - this.hookupButtonsNav('.' + flagNavServices, hashPageServices); - } - }, { - key: "hookupButtonsNavContact", - value: function hookupButtonsNavContact() { - this.hookupButtonsNav('.' + flagNavContact, hashPageContact); - } - }, { - key: "hookupButtonsNavUserAccount", - value: function hookupButtonsNavUserAccount() { - this.hookupButtonsNav('.' + flagNavUserAccount, hashPageUserAccount); - } - }, { - key: "hookupButtonsNavUserLogout", - value: function hookupButtonsNavUserLogout() { - this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout); - } - }, { - key: "hookupButtonsNavUserLogin", - value: function hookupButtonsNavUserLogin() { - var _this2 = this; - this.hookupEventHandler("click", '.' + flagNavUserLogin, function (event, navigator) { - event.stopPropagation(); - _this2.leave(); - api_API.loginUser().then(function (response) { - if (response.Success) { - // this.router.navigateToUrl(response[flagCallback], null, false); // window.app. - window.location.href = response[flagCallback]; - } else { - DOM.alertError("Error", response.Message); - } - }); - }); - } - }, { - key: "hookupButtonsNavStoreHome", - value: function hookupButtonsNavStoreHome() { - this.hookupButtonsNav('.' + flagNavStoreHome, hashPageStoreHome); - } - }, { - key: "hookupButtonsNavStoreManufacturingPurchaseOrders", - value: function hookupButtonsNavStoreManufacturingPurchaseOrders() { - this.hookupButtonsNav('.' + flagNavStoreManufacturingPurchaseOrders, hashPageStoreManufacturingPurchaseOrders); - } - }, { - key: "hookupButtonsNavStoreProductCategories", - value: function hookupButtonsNavStoreProductCategories() { - this.hookupButtonsNav('.' + flagNavStoreProductCategories, hashPageStoreProductCategories); - } - }, { - key: "hookupButtonsNavStoreProducts", - value: function hookupButtonsNavStoreProducts() { - this.hookupButtonsNav('.' + flagNavStoreProducts, hashPageStoreProducts); - } - }, { - key: "hookupButtonsNavStoreProductPermutations", - value: function hookupButtonsNavStoreProductPermutations() { - this.hookupButtonsNav('.' + flagNavStoreProductPermutations, hashPageStoreProductPermutations); - } - }, { - key: "hookupButtonsNavStoreProductPrices", - value: function hookupButtonsNavStoreProductPrices() { - this.hookupButtonsNav('.' + flagNavStoreProductPrices, hashPageStoreProductPrices); - } - }, { - key: "hookupButtonsNavStoreProductVariations", - value: function hookupButtonsNavStoreProductVariations() { - this.hookupButtonsNav('.' + flagNavStoreProductVariations, hashPageStoreProductVariations); - } - }, { - key: "hookupButtonsNavStoreStockItems", - value: function hookupButtonsNavStoreStockItems() { - this.hookupButtonsNav('.' + flagNavStoreStockItems, hashPageStoreStockItems); - } - }, { - key: "hookupButtonsNavAdminHome", - value: function hookupButtonsNavAdminHome() { - this.hookupButtonsNav('.' + flagNavAdminHome, hashPageAdminHome); - } - }, { - key: "hookupButtonsNavStoreSuppliers", - value: function hookupButtonsNavStoreSuppliers() { - this.hookupButtonsNav('.' + flagNavStoreSuppliers, hashPageStoreSuppliers); - } - }, { - key: "hookupButtonsNavStoreSupplierPurchaseOrders", - value: function hookupButtonsNavStoreSupplierPurchaseOrders() { - this.hookupButtonsNav('.' + flagNavStoreSupplierPurchaseOrders, hashPageStoreSupplierPurchaseOrders); - } - }, { - key: "hookupImagesLogo", - value: function hookupImagesLogo() { - this.hookupButtonsNav("img." + flagImageLogo, hashPageHome); - } - }, { - key: "hookupOverlays", - value: function hookupOverlays() { - this.hookupOverlayFromId(idOverlayConfirm); - this.hookupOverlayFromId(idOverlayError); - } - }, { - key: "hookupOverlayFromId", - value: function hookupOverlayFromId(idOverlay) { - Events.initialiseEventHandler(idOverlay, flagInitialised, function (overlay) { - overlay.querySelector('button.' + flagCancel).addEventListener("click", function (event) { - event.stopPropagation(); - overlay.style.display = 'none'; - }); - }); - } - }, { - key: "hookupButtonSave", - value: function hookupButtonSave() { - var _this3 = this; - Events.initialiseEventHandler('form.' + flagFilter + ' button.' + flagSave, flagInitialised, function (button) { - button.addEventListener("click", function (event) { - event.stopPropagation(); - if (_verbose) { - console.log('saving page: ', _this3.title); - } - OverlayConfirm.show(); - }); - // button.classList.add(flagCollapsed); - }); - } - }, { - key: "hookupVideos", - value: function hookupVideos() { - Events.initialiseEventHandler('video', flagInitialised, function (video) { - video.addEventListener("mouseover", videoPlay(video)); - video.addEventListener("mouseout", videoPause(video)); - }); - } - }, { - key: "leave", - value: function leave() { - if (_verbose) { - console.log('Leaving ' + this.title + ' page'); - } - if (this.constructor === BasePage) { - throw new Error("Must implement leave() method."); - } - } - }, { - key: "setLocalStoragePage", - value: function setLocalStoragePage(dataPage) { - LocalStorage.setLocalStorage(this.hash, dataPage); - } - }, { - key: "getLocalStoragePage", - value: function getLocalStoragePage() { - return LocalStorage.getLocalStorage(this.hash); - } - }, { - key: "toggleShowButtonsSaveCancel", - value: function toggleShowButtonsSaveCancel(show) { - // , buttonSave = null, buttonCancel = null - var buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave); - var buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel); - if (show) { - buttonCancel.classList.remove(flagCollapsed); - buttonSave.classList.remove(flagCollapsed); - if (_verbose) { - console.log('showing buttons'); - } - } else { - buttonCancel.classList.add(flagCollapsed); - buttonSave.classList.add(flagCollapsed); - if (_verbose) { - console.log('hiding buttons'); - } - } - } - }], [{ - key: "isDirtyFilter", - value: function isDirtyFilter(filter) { - var isDirty = DOM.updateAndCheckIsElementDirty(filter); - if (isDirty) document.querySelectorAll(idTableMain + ' tbody tr').remove(); - return isDirty; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/pages/core/admin_home.js -function admin_home_typeof(o) { "@babel/helpers - typeof"; return admin_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, admin_home_typeof(o); } -function admin_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function admin_home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, admin_home_toPropertyKey(o.key), o); } } -function admin_home_createClass(e, r, t) { return r && admin_home_defineProperties(e.prototype, r), t && admin_home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } -function _possibleConstructorReturn(t, e) { if (e && ("object" == admin_home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } -function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function _superPropGet(t, e, o, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } -function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));); return t; } -function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } -function admin_home_defineProperty(e, r, t) { return (r = admin_home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function admin_home_toPropertyKey(t) { var i = admin_home_toPrimitive(t, "string"); return "symbol" == admin_home_typeof(i) ? i : i + ""; } -function admin_home_toPrimitive(t, r) { if ("object" != admin_home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != admin_home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - -var PageAdminHome = /*#__PURE__*/function (_BasePage) { - function PageAdminHome(router) { - admin_home_classCallCheck(this, PageAdminHome); - return _callSuper(this, PageAdminHome, [router]); - } - _inherits(PageAdminHome, _BasePage); - return admin_home_createClass(PageAdminHome, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - this.hookupAdminStore(); - } - }, { - key: "hookupAdminStore", - value: function hookupAdminStore() { - this.hookupButtonsNavStoreProductCategories(); - this.hookupButtonsNavStoreProducts(); - this.hookupButtonsNavStoreProductPermutations(); - this.hookupButtonsNavStoreProductPrices(); - this.hookupButtonsNavStoreStockItems(); - this.hookupButtonsNavStoreProductVariations(); - this.hookupButtonsNavAdminStoreStripeProducts(); - this.hookupButtonsNavAdminStoreStripePrices(); - } - }, { - key: "hookupButtonsNavAdminStoreStripeProducts", - value: function hookupButtonsNavAdminStoreStripeProducts() { - Events.initialiseEventHandler('.' + flagNavAdminStoreStripeProducts, flagInitialised, function (navigator) { - navigator.addEventListener("click", function (event) { - this.router.navigateToHash(hashPageAdminStoreStripeProducts); - }); - }); - } - }, { - key: "hookupButtonsNavAdminStoreStripePrices", - value: function hookupButtonsNavAdminStoreStripePrices() { - Events.initialiseEventHandler('.' + flagNavAdminStoreStripePrices, flagInitialised, function (navigator) { - navigator.addEventListener("click", function (event) { - this.router.navigateToHash(hashPageAdminStoreStripePrices); - }); - }); - } - }, { - key: "leave", - value: function leave() { - _superPropGet(PageAdminHome, "leave", this, 3)([]); - } - }]); -}(BasePage); -admin_home_defineProperty(PageAdminHome, "hash", hashPageAdminHome); - -;// CONCATENATED MODULE: ./static/js/pages/core/home.js -function home_typeof(o) { "@babel/helpers - typeof"; return home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, home_typeof(o); } -function home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, home_toPropertyKey(o.key), o); } } -function home_createClass(e, r, t) { return r && home_defineProperties(e.prototype, r), t && home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function home_callSuper(t, o, e) { return o = home_getPrototypeOf(o), home_possibleConstructorReturn(t, home_isNativeReflectConstruct() ? Reflect.construct(o, e || [], home_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function home_possibleConstructorReturn(t, e) { if (e && ("object" == home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return home_assertThisInitialized(t); } -function home_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function home_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (home_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function home_superPropGet(t, e, o, r) { var p = home_get(home_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function home_get() { return home_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = home_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, home_get.apply(null, arguments); } -function home_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = home_getPrototypeOf(t));); return t; } -function home_getPrototypeOf(t) { return home_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, home_getPrototypeOf(t); } -function home_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && home_setPrototypeOf(t, e); } -function home_setPrototypeOf(t, e) { return home_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, home_setPrototypeOf(t, e); } -function home_defineProperty(e, r, t) { return (r = home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function home_toPropertyKey(t) { var i = home_toPrimitive(t, "string"); return "symbol" == home_typeof(i) ? i : i + ""; } -function home_toPrimitive(t, r) { if ("object" != home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageHome = /*#__PURE__*/function (_BasePage) { - function PageHome(router) { - home_classCallCheck(this, PageHome); - return home_callSuper(this, PageHome, [router]); - } - home_inherits(PageHome, _BasePage); - return home_createClass(PageHome, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - this.hookupButtonsNavContact(); - } - }, { - key: "leave", - value: function leave() { - home_superPropGet(PageHome, "leave", this, 3)([]); - } - }]); -}(BasePage); -home_defineProperty(PageHome, "hash", hashPageHome); - -;// CONCATENATED MODULE: ./static/js/pages/core/contact.js -function contact_typeof(o) { "@babel/helpers - typeof"; return contact_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, contact_typeof(o); } -function contact_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function contact_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, contact_toPropertyKey(o.key), o); } } -function contact_createClass(e, r, t) { return r && contact_defineProperties(e.prototype, r), t && contact_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function contact_callSuper(t, o, e) { return o = contact_getPrototypeOf(o), contact_possibleConstructorReturn(t, contact_isNativeReflectConstruct() ? Reflect.construct(o, e || [], contact_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function contact_possibleConstructorReturn(t, e) { if (e && ("object" == contact_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return contact_assertThisInitialized(t); } -function contact_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function contact_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (contact_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function contact_getPrototypeOf(t) { return contact_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, contact_getPrototypeOf(t); } -function contact_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && contact_setPrototypeOf(t, e); } -function contact_setPrototypeOf(t, e) { return contact_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, contact_setPrototypeOf(t, e); } -function contact_defineProperty(e, r, t) { return (r = contact_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function contact_toPropertyKey(t) { var i = contact_toPrimitive(t, "string"); return "symbol" == contact_typeof(i) ? i : i + ""; } -function contact_toPrimitive(t, r) { if ("object" != contact_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != contact_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageContact = /*#__PURE__*/function (_BasePage) { - function PageContact(router) { - contact_classCallCheck(this, PageContact); - return contact_callSuper(this, PageContact, [router]); - } - contact_inherits(PageContact, _BasePage); - return contact_createClass(PageContact, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }]); -}(BasePage); -contact_defineProperty(PageContact, "hash", hashPageContact); - -;// CONCATENATED MODULE: ./static/js/pages/core/services.js -function services_typeof(o) { "@babel/helpers - typeof"; return services_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, services_typeof(o); } -function services_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function services_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, services_toPropertyKey(o.key), o); } } -function services_createClass(e, r, t) { return r && services_defineProperties(e.prototype, r), t && services_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function services_callSuper(t, o, e) { return o = services_getPrototypeOf(o), services_possibleConstructorReturn(t, services_isNativeReflectConstruct() ? Reflect.construct(o, e || [], services_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function services_possibleConstructorReturn(t, e) { if (e && ("object" == services_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return services_assertThisInitialized(t); } -function services_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function services_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (services_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function services_superPropGet(t, e, o, r) { var p = services_get(services_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function services_get() { return services_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = services_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, services_get.apply(null, arguments); } -function services_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = services_getPrototypeOf(t));); return t; } -function services_getPrototypeOf(t) { return services_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, services_getPrototypeOf(t); } -function services_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && services_setPrototypeOf(t, e); } -function services_setPrototypeOf(t, e) { return services_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, services_setPrototypeOf(t, e); } -function services_defineProperty(e, r, t) { return (r = services_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function services_toPropertyKey(t) { var i = services_toPrimitive(t, "string"); return "symbol" == services_typeof(i) ? i : i + ""; } -function services_toPrimitive(t, r) { if ("object" != services_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != services_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageServices = /*#__PURE__*/function (_BasePage) { - function PageServices(router) { - services_classCallCheck(this, PageServices); - return services_callSuper(this, PageServices, [router]); - } - services_inherits(PageServices, _BasePage); - return services_createClass(PageServices, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "leave", - value: function leave() { - services_superPropGet(PageServices, "leave", this, 3)([]); - } - }]); -}(BasePage); -services_defineProperty(PageServices, "hash", hashPageServices); - -;// CONCATENATED MODULE: ./static/js/pages/legal/accessibility_report.js -function accessibility_report_typeof(o) { "@babel/helpers - typeof"; return accessibility_report_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, accessibility_report_typeof(o); } -function accessibility_report_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function accessibility_report_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, accessibility_report_toPropertyKey(o.key), o); } } -function accessibility_report_createClass(e, r, t) { return r && accessibility_report_defineProperties(e.prototype, r), t && accessibility_report_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function accessibility_report_callSuper(t, o, e) { return o = accessibility_report_getPrototypeOf(o), accessibility_report_possibleConstructorReturn(t, accessibility_report_isNativeReflectConstruct() ? Reflect.construct(o, e || [], accessibility_report_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function accessibility_report_possibleConstructorReturn(t, e) { if (e && ("object" == accessibility_report_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return accessibility_report_assertThisInitialized(t); } -function accessibility_report_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function accessibility_report_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (accessibility_report_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function accessibility_report_superPropGet(t, e, o, r) { var p = accessibility_report_get(accessibility_report_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function accessibility_report_get() { return accessibility_report_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = accessibility_report_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, accessibility_report_get.apply(null, arguments); } -function accessibility_report_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = accessibility_report_getPrototypeOf(t));); return t; } -function accessibility_report_getPrototypeOf(t) { return accessibility_report_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, accessibility_report_getPrototypeOf(t); } -function accessibility_report_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && accessibility_report_setPrototypeOf(t, e); } -function accessibility_report_setPrototypeOf(t, e) { return accessibility_report_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, accessibility_report_setPrototypeOf(t, e); } -function accessibility_report_defineProperty(e, r, t) { return (r = accessibility_report_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function accessibility_report_toPropertyKey(t) { var i = accessibility_report_toPrimitive(t, "string"); return "symbol" == accessibility_report_typeof(i) ? i : i + ""; } -function accessibility_report_toPrimitive(t, r) { if ("object" != accessibility_report_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != accessibility_report_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageAccessibilityReport = /*#__PURE__*/function (_BasePage) { - function PageAccessibilityReport(router) { - accessibility_report_classCallCheck(this, PageAccessibilityReport); - return accessibility_report_callSuper(this, PageAccessibilityReport, [router]); - } - accessibility_report_inherits(PageAccessibilityReport, _BasePage); - return accessibility_report_createClass(PageAccessibilityReport, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "leave", - value: function leave() { - accessibility_report_superPropGet(PageAccessibilityReport, "leave", this, 3)([]); - } - }]); -}(BasePage); -accessibility_report_defineProperty(PageAccessibilityReport, "hash", hashPageAccessibilityReport); - -;// CONCATENATED MODULE: ./static/js/pages/legal/accessibility_statement.js -function accessibility_statement_typeof(o) { "@babel/helpers - typeof"; return accessibility_statement_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, accessibility_statement_typeof(o); } -function accessibility_statement_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function accessibility_statement_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, accessibility_statement_toPropertyKey(o.key), o); } } -function accessibility_statement_createClass(e, r, t) { return r && accessibility_statement_defineProperties(e.prototype, r), t && accessibility_statement_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function accessibility_statement_callSuper(t, o, e) { return o = accessibility_statement_getPrototypeOf(o), accessibility_statement_possibleConstructorReturn(t, accessibility_statement_isNativeReflectConstruct() ? Reflect.construct(o, e || [], accessibility_statement_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function accessibility_statement_possibleConstructorReturn(t, e) { if (e && ("object" == accessibility_statement_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return accessibility_statement_assertThisInitialized(t); } -function accessibility_statement_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function accessibility_statement_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (accessibility_statement_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function accessibility_statement_superPropGet(t, e, o, r) { var p = accessibility_statement_get(accessibility_statement_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function accessibility_statement_get() { return accessibility_statement_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = accessibility_statement_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, accessibility_statement_get.apply(null, arguments); } -function accessibility_statement_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = accessibility_statement_getPrototypeOf(t));); return t; } -function accessibility_statement_getPrototypeOf(t) { return accessibility_statement_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, accessibility_statement_getPrototypeOf(t); } -function accessibility_statement_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && accessibility_statement_setPrototypeOf(t, e); } -function accessibility_statement_setPrototypeOf(t, e) { return accessibility_statement_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, accessibility_statement_setPrototypeOf(t, e); } -function accessibility_statement_defineProperty(e, r, t) { return (r = accessibility_statement_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function accessibility_statement_toPropertyKey(t) { var i = accessibility_statement_toPrimitive(t, "string"); return "symbol" == accessibility_statement_typeof(i) ? i : i + ""; } -function accessibility_statement_toPrimitive(t, r) { if ("object" != accessibility_statement_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != accessibility_statement_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageAccessibilityStatement = /*#__PURE__*/function (_BasePage) { - function PageAccessibilityStatement(router) { - accessibility_statement_classCallCheck(this, PageAccessibilityStatement); - return accessibility_statement_callSuper(this, PageAccessibilityStatement, [router]); - } - accessibility_statement_inherits(PageAccessibilityStatement, _BasePage); - return accessibility_statement_createClass(PageAccessibilityStatement, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "leave", - value: function leave() { - accessibility_statement_superPropGet(PageAccessibilityStatement, "leave", this, 3)([]); - } - }]); -}(BasePage); -accessibility_statement_defineProperty(PageAccessibilityStatement, "hash", hashPageAccessibilityStatement); - -;// CONCATENATED MODULE: ./static/js/pages/legal/license.js -function license_typeof(o) { "@babel/helpers - typeof"; return license_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, license_typeof(o); } -function license_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function license_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, license_toPropertyKey(o.key), o); } } -function license_createClass(e, r, t) { return r && license_defineProperties(e.prototype, r), t && license_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function license_callSuper(t, o, e) { return o = license_getPrototypeOf(o), license_possibleConstructorReturn(t, license_isNativeReflectConstruct() ? Reflect.construct(o, e || [], license_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function license_possibleConstructorReturn(t, e) { if (e && ("object" == license_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return license_assertThisInitialized(t); } -function license_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function license_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (license_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function license_superPropGet(t, e, o, r) { var p = license_get(license_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function license_get() { return license_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = license_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, license_get.apply(null, arguments); } -function license_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = license_getPrototypeOf(t));); return t; } -function license_getPrototypeOf(t) { return license_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, license_getPrototypeOf(t); } -function license_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && license_setPrototypeOf(t, e); } -function license_setPrototypeOf(t, e) { return license_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, license_setPrototypeOf(t, e); } -function license_defineProperty(e, r, t) { return (r = license_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function license_toPropertyKey(t) { var i = license_toPrimitive(t, "string"); return "symbol" == license_typeof(i) ? i : i + ""; } -function license_toPrimitive(t, r) { if ("object" != license_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != license_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageLicense = /*#__PURE__*/function (_BasePage) { - function PageLicense(router) { - license_classCallCheck(this, PageLicense); - return license_callSuper(this, PageLicense, [router]); - } - license_inherits(PageLicense, _BasePage); - return license_createClass(PageLicense, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "leave", - value: function leave() { - license_superPropGet(PageLicense, "leave", this, 3)([]); - } - }]); -}(BasePage); -license_defineProperty(PageLicense, "hash", hashPageLicense); - -;// CONCATENATED MODULE: ./static/js/pages/store/basket.js -function basket_typeof(o) { "@babel/helpers - typeof"; return basket_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, basket_typeof(o); } -function basket_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function basket_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, basket_toPropertyKey(o.key), o); } } -function basket_createClass(e, r, t) { return r && basket_defineProperties(e.prototype, r), t && basket_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function basket_callSuper(t, o, e) { return o = basket_getPrototypeOf(o), basket_possibleConstructorReturn(t, basket_isNativeReflectConstruct() ? Reflect.construct(o, e || [], basket_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function basket_possibleConstructorReturn(t, e) { if (e && ("object" == basket_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return basket_assertThisInitialized(t); } -function basket_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function basket_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (basket_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function basket_superPropGet(t, e, o, r) { var p = basket_get(basket_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function basket_get() { return basket_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = basket_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, basket_get.apply(null, arguments); } -function basket_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = basket_getPrototypeOf(t));); return t; } -function basket_getPrototypeOf(t) { return basket_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, basket_getPrototypeOf(t); } -function basket_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && basket_setPrototypeOf(t, e); } -function basket_setPrototypeOf(t, e) { return basket_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, basket_setPrototypeOf(t, e); } -function basket_defineProperty(e, r, t) { return (r = basket_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function basket_toPropertyKey(t) { var i = basket_toPrimitive(t, "string"); return "symbol" == basket_typeof(i) ? i : i + ""; } -function basket_toPrimitive(t, r) { if ("object" != basket_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != basket_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - -var PageStoreBasket = /*#__PURE__*/function (_BasePage) { - function PageStoreBasket(router) { - basket_classCallCheck(this, PageStoreBasket); - return basket_callSuper(this, PageStoreBasket, [router]); - } - basket_inherits(PageStoreBasket, _BasePage); - return basket_createClass(PageStoreBasket, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - this.hookupStoreCardsInfo(); - this.hookupOverlaysStoreBasketInfo(); - this.hookupButtonCheckoutSession(); - } - }, { - key: "hookupStoreCardsInfo", - value: function hookupStoreCardsInfo() { - document.querySelectorAll(idContainerInfoDelivery).addEventListener("click", function (event) { - if (_verbose) { - console.log("delivery modal display method"); - } - document.querySelectorAll(idOverlayInfoDelivery).css('display', 'block'); - }); - document.querySelectorAll(idContainerInfoBilling).addEventListener("click", function (event) { - if (_verbose) { - console.log("billing modal display method"); - } - document.querySelectorAll(idOverlayInfoBilling).css('display', 'block'); - }); - } - }, { - key: "hookupOverlaysStoreBasketInfo", - value: function hookupOverlaysStoreBasketInfo() { - var elOverlay, elForm; - - // Delivery - elOverlay = document.querySelectorAll(idOverlayInfoDelivery); - elForm = elOverlay.querySelector('form'); - hookupOverlay(elOverlay); - Events.initialiseEventHandler(elForm, flagInitialised, function () { - elForm.submit(function (event) { - elForm = document.querySelectorAll(elForm); - event.preventDefault(); - if (_verbose) { - console.log("delivery submit method"); - } - ajaxData = {}; - ajaxData[keyInfoType] = keyInfoDelivery; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoDelivery); - ajaxJSONData('info delivery', mapHashToController(hashStoreBasketInfo), ajaxData, loadInfoAddress, false); - // document.querySelectorAll(idOverlayInfoDelivery).css('display', 'none'); - }); - }); - - // Billing - elOverlay = document.querySelectorAll(idOverlayInfoBilling); - elForm = elOverlay.querySelector('form'); - hookupOverlay(elOverlay); - Events.initialiseEventHandler(elForm, flagInitialised, function () { - elForm.submit(function (event) { - event.preventDefault(); - if (_verbose) { - console.log("billing submit method"); - } - ajaxData = {}; - ajaxData[keyInfoType] = keyInfoBilling; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoBilling); // formData; // form.serialize(); - - ajaxJSONData('info billing', mapHashToController(hashStoreBasketInfo), ajaxData, loadInfoAddress, false); - // document.querySelectorAll(idOverlayInfoBilling).css('display', 'none'); - }); - }); - var keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyCity, keyCounty]; - for (var k in keys) { - elForm.querySelector('#' + keys[k]).removeAttr('required'); - } - } - }, { - key: "loadInfoAddress", - value: function loadInfoAddress(response) { - if (_verbose) { - console.log('response:'); - console.log(response.data); - } - var infoType = response.data[keyInfoType]; - var infoAddress = response.data[infoType]; - LocalStorage.setLocalStorage(infoType, infoAddress); - - // update webpage elements in background - if (infoType == keyInfoBilling) { - var container = document.querySelectorAll(idContainerInfoBilling); - if (infoAddress[keyInfoIdentical]) { - container.querySelector('div').innerHTML = "Same as delivery address"; - } else { - container.querySelector('div').innerHTML = "" + infoAddress[keyNameFull] + ' at ' + infoAddress[keyPostcode] + ""; - } - document.querySelectorAll(idOverlayInfoBilling).css('display', 'none'); - document.querySelectorAll(idOverlayInfoBilling).querySelector('form').classList.add(flagSubmitted); - } else { - var _container = document.querySelectorAll(idContainerInfoDelivery); - _container.querySelector('div').innerHTML = "" + infoAddress[keyNameFull] + ' at ' + infoAddress[keyPostcode] + ""; - document.querySelectorAll(idOverlayInfoDelivery).css('display', 'none'); - document.querySelectorAll(idOverlayInfoDelivery).querySelector('form').classList.add(flagSubmitted); - } - } - }, { - key: "convertFormBilling2JSON", - value: function convertFormBilling2JSON(ajaxData, idOverlayInfo) { - var elOverlay, elForm, elOverlayDelivery, elFormDelivery; - elOverlay = document.querySelectorAll(idOverlayInfo); - elForm = elOverlay.querySelector('form'); - elOverlay = document.querySelectorAll(idOverlayInfoDelivery); - elForm = elOverlay.querySelector('form'); - ajaxData[flagForm] = convertForm2JSON(elForm); // formData; // form.serialize(); - var keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyAddress2, keyCity, keyCounty]; - if (_verbose) { - console.log('converting billing form to json\nform ID: ' + elForm.id); - console.log('ajaxData:'); - console.log(ajaxData); - } - ajaxData[flagForm][keyInfoIdentical] = getElementValueCurrent(elForm.querySelector('#' + keyInfoIdentical)); - for (var k in keys) { - if (idOverlayInfo == idOverlayInfoBilling && ajaxData[flagForm][keyInfoIdentical]) { - ajaxData[flagForm][keys[k]] = getElementValueCurrent(elFormDelivery.querySelector('#' + keys[k])); - } else { - ajaxData[flagForm][keys[k]] = getElementValueCurrent(elForm.querySelector('#' + keys[k])); - } - } - if (_verbose) { - console.log('ajaxData:'); - console.log(ajaxData); - } - return ajaxData; - } - }, { - key: "hookupButtonCheckoutSession", - value: function hookupButtonCheckoutSession() { - var btnCheckout = document.querySelectorAll(idButtonCheckout); - btnCheckout.classList.remove(flagInitialised); - Events.initialiseEventHandler(idButtonCheckout, flagInitialised, function () { - btnCheckout.removeEventListener("click"); - btnCheckout.addEventListener("click", function (event) { - //setupPageLocalStorageNext(hashPageStoreBasket); - var basket = LocalStorage.getLocalStorage(keyBasket); - // goToPage(hashPageStoreBasket); - var ajaxData = {}; - ajaxData[keyBasket] = basket; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoDelivery); - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoBilling); - ajaxData[key_code_currency] = getCurrencySelected(); - // ajaxData[keyIsSubscription] = false; // only checkout one-time payment items for now - - ajaxJSONData('checkout session', mapHashToController(hashPageStoreCheckout), ajaxData, handleResponseCheckout, false); - }); - }); - } - }, { - key: "handleResponseCheckout", - value: function handleResponseCheckout(response) { - // let tmpData = {}; - // tmpData[keyIdCheckout] = response.data[keyIdCheckout] - // goToPage(hashPageStoreCheckoutSession, tmpData); - window.location.href = response.data[keyUrlCheckout]; - } - }, { - key: "hookupButtonFormBillingCopy", - value: function hookupButtonFormBillingCopy() { - // let elButton = document.querySelectorAll(idButtonFormBillingCopy); - - Events.initialiseEventHandler(idButtonFormBillingCopy, flagInitialised, function () { - document.querySelectorAll(idButtonFormBillingCopy).addEventListener("click", function (event) { - var keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyAddress2, keyCity, keyCounty]; - var elFormBilling = document.querySelectorAll(idOverlayInfoBilling).querySelector('form'); - var elFormDelivery = document.querySelectorAll(idOverlayInfoDelivery).querySelector('form'); - for (var k in keys) { - elFormBilling.querySelector('#' + keys[k]).value = getElementValueCurrent(elFormDelivery.querySelector('#' + keys[k])); - } - }); - }); - } - }, { - key: "leave", - value: function leave() { - basket_superPropGet(PageStoreBasket, "leave", this, 3)([]); - } - }]); -}(BasePage); -basket_defineProperty(PageStoreBasket, "hash", hashPageStoreBasket); - -;// CONCATENATED MODULE: ./static/js/pages/store/home.js -function store_home_typeof(o) { "@babel/helpers - typeof"; return store_home_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, store_home_typeof(o); } -function store_home_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function store_home_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, store_home_toPropertyKey(o.key), o); } } -function store_home_createClass(e, r, t) { return r && store_home_defineProperties(e.prototype, r), t && store_home_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function store_home_callSuper(t, o, e) { return o = store_home_getPrototypeOf(o), store_home_possibleConstructorReturn(t, store_home_isNativeReflectConstruct() ? Reflect.construct(o, e || [], store_home_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function store_home_possibleConstructorReturn(t, e) { if (e && ("object" == store_home_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return store_home_assertThisInitialized(t); } -function store_home_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function store_home_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (store_home_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function store_home_superPropGet(t, e, o, r) { var p = store_home_get(store_home_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function store_home_get() { return store_home_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = store_home_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, store_home_get.apply(null, arguments); } -function store_home_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = store_home_getPrototypeOf(t));); return t; } -function store_home_getPrototypeOf(t) { return store_home_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, store_home_getPrototypeOf(t); } -function store_home_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && store_home_setPrototypeOf(t, e); } -function store_home_setPrototypeOf(t, e) { return store_home_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, store_home_setPrototypeOf(t, e); } -function store_home_defineProperty(e, r, t) { return (r = store_home_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function store_home_toPropertyKey(t) { var i = store_home_toPrimitive(t, "string"); return "symbol" == store_home_typeof(i) ? i : i + ""; } -function store_home_toPrimitive(t, r) { if ("object" != store_home_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != store_home_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var PageStoreHome = /*#__PURE__*/function (_BasePage) { - function PageStoreHome(router) { - store_home_classCallCheck(this, PageStoreHome); - return store_home_callSuper(this, PageStoreHome, [router]); - } - store_home_inherits(PageStoreHome, _BasePage); - return store_home_createClass(PageStoreHome, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - this.hookupFiltersStore(); - this.hookupStoreHome(); - } - }, { - key: "leave", - value: function leave() { - store_home_superPropGet(PageStoreHome, "leave", this, 3)([]); - } - }]); -}(BasePage); -store_home_defineProperty(PageStoreHome, "hash", hashPageStoreHome); - -;// CONCATENATED MODULE: ./static/js/lib/business_objects/business_objects.js -function business_objects_typeof(o) { "@babel/helpers - typeof"; return business_objects_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, business_objects_typeof(o); } -function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function business_objects_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function business_objects_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, business_objects_toPropertyKey(o.key), o); } } -function business_objects_createClass(e, r, t) { return r && business_objects_defineProperties(e.prototype, r), t && business_objects_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function business_objects_toPropertyKey(t) { var i = business_objects_toPrimitive(t, "string"); return "symbol" == business_objects_typeof(i) ? i : i + ""; } -function business_objects_toPrimitive(t, r) { if ("object" != business_objects_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != business_objects_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -var BusinessObjects = /*#__PURE__*/function () { - function BusinessObjects() { - business_objects_classCallCheck(this, BusinessObjects); - } - return business_objects_createClass(BusinessObjects, null, [{ - key: "getOptionJsonFromObjectJsonAndKeys", - value: function getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue) { - var valueSelected = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; - return { - text: objectJson[keyText], - value: objectJson[keyValue], - selected: objectJson[keyValue] == valueSelected - }; - } - }, { - key: "getOptionJsonFromObjectJson", - value: function getOptionJsonFromObjectJson(objectJson) { - var valueSelected = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var keyText = objectJson[flagNameAttrOptionText]; - var keyValue = objectJson[flagNameAttrOptionValue]; - if (_verbose) { - console.log({ - objectJson: objectJson, - keyText: keyText, - keyValue: keyValue - }); - } - ; - return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected); - } - /* - static getOptionJsonFromProductPermutation(permutation) { - return { - text: permutation - }; - } - */ - }, { - key: "getObjectText", - value: function getObjectText(objectJson) { - return objectJson == null ? '' : objectJson[objectJson[flagNameAttrOptionText]]; - } - }, { - key: "getListObjectsFromIdDictAndCsv", - value: function getListObjectsFromIdDictAndCsv(idDict, idCsv) { - var listObjects = []; - var ids = idCsv.split(','); - var _iterator = _createForOfIteratorHelper(ids), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var id = _step.value; - listObjects.push(idDict[id]); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return listObjects; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/lib/business_objects/store/product_permutation.js -function product_permutation_typeof(o) { "@babel/helpers - typeof"; return product_permutation_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, product_permutation_typeof(o); } -function product_permutation_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function product_permutation_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, product_permutation_toPropertyKey(o.key), o); } } -function product_permutation_createClass(e, r, t) { return r && product_permutation_defineProperties(e.prototype, r), t && product_permutation_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function product_permutation_toPropertyKey(t) { var i = product_permutation_toPrimitive(t, "string"); return "symbol" == product_permutation_typeof(i) ? i : i + ""; } -function product_permutation_toPrimitive(t, r) { if ("object" != product_permutation_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != product_permutation_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -var ProductPermutation = /*#__PURE__*/function () { - function ProductPermutation() { - product_permutation_classCallCheck(this, ProductPermutation); - } - return product_permutation_createClass(ProductPermutation, null, [{ - key: "getProductVariationsFromIdCsv", - value: function getProductVariationsFromIdCsv(csvVariations) { - var productVariations = []; - if (!csvVariations) return productVariations; - var variationPairs = csvVariations.split(','); - if (variationPairs.length == 0) return productVariations; - var parts; - variationPairs.forEach(function (variationPair) { - parts = variationPair.split(':'); - if (parts.length == 2) { - var productVariationType = productVariationTypes[parts[0]]; - productVariationType[flagProductVariations].some(function (productVariation) { - if (productVariation[attrIdProductVariation] == parts[1]) { - productVariations.push([productVariationType, productVariation]); - return true; - } - return false; - }); - } - }); - return productVariations; - } - }, { - key: "getProductVariationsPreviewFromIdCsv", - value: function getProductVariationsPreviewFromIdCsv(csvVariations) { - var variationPairs = ProductPermutation.getProductVariationsFromIdCsv(csvVariations); - var preview = ''; - if (variationPairs.length == 0) return preview; - var variationType, variation; - variationPairs.forEach(function (variationPair) { - if (preview.length > 0) { - preview += '\n'; - } - variationType = variationPair[0]; - variation = variationPair[1]; - preview += variationType[flagName] + ': ' + variation[flagName]; - }); - return preview; - } - }, { - key: "getProductVariationsIdCsvFromVariationTypeList", - value: function getProductVariationsIdCsvFromVariationTypeList(variationTypeList) { - var csvVariations = ''; - if (Validation.isEmpty(variationTypeList)) return csvVariations; - variationTypeList.forEach(function (variationType) { - if (csvVariations.length > 0) { - csvVariations += ','; - } - csvVariations += variationType[attrIdProductVariationType] + ':' + variationType[flagProductVariations][0][attrIdProductVariation]; - }); - return csvVariations; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/lib/utils.js -function utils_typeof(o) { "@babel/helpers - typeof"; return utils_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, utils_typeof(o); } -function utils_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function utils_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, utils_toPropertyKey(o.key), o); } } -function utils_createClass(e, r, t) { return r && utils_defineProperties(e.prototype, r), t && utils_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function utils_toPropertyKey(t) { var i = utils_toPrimitive(t, "string"); return "symbol" == utils_typeof(i) ? i : i + ""; } -function utils_toPrimitive(t, r) { if ("object" != utils_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != utils_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -// Utility functions -/* -function $(selector) { - return document.querySelector(selector); -} - -function $$(selector) { - return document.querySelectorAll(selector); -} -*/ -var Utils = /*#__PURE__*/function () { - function Utils() { - utils_classCallCheck(this, Utils); - } - return utils_createClass(Utils, null, [{ - key: "getListFromDict", - value: function getListFromDict(dict) { - var list = []; - for (var key in dict) { - list.push(dict[key]); - } - return list; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/components/common/temporary/overlay_error.js -function overlay_error_typeof(o) { "@babel/helpers - typeof"; return overlay_error_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, overlay_error_typeof(o); } -function overlay_error_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function overlay_error_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, overlay_error_toPropertyKey(o.key), o); } } -function overlay_error_createClass(e, r, t) { return r && overlay_error_defineProperties(e.prototype, r), t && overlay_error_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function overlay_error_toPropertyKey(t) { var i = overlay_error_toPrimitive(t, "string"); return "symbol" == overlay_error_typeof(i) ? i : i + ""; } -function overlay_error_toPrimitive(t, r) { if ("object" != overlay_error_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != overlay_error_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -var OverlayError = /*#__PURE__*/function () { - function OverlayError() { - overlay_error_classCallCheck(this, OverlayError); - } - return overlay_error_createClass(OverlayError, null, [{ - key: "hookup", - value: function hookup() { - Events.initialiseEventHandler(idOverlayError + ' button.' + flagCancel, flagInitialised, function (buttonCancel) { - buttonCancel.addEventListener('click', function () { - var overlay = document.querySelector(idOverlayError); - overlay.style.visibility = 'hidden'; - }); - }); - } - }, { - key: "show", - value: function show(msgError) { - var overlay = document.querySelector(idOverlayError); - var labelError = overlay.querySelector(idLabelError); - labelError.innerText = msgError; - overlay.style.visibility = 'visible'; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/pages/base_table.js -function base_table_typeof(o) { "@babel/helpers - typeof"; return base_table_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, base_table_typeof(o); } -function base_table_defineProperty(e, r, t) { return (r = base_table_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function base_table_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function base_table_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, base_table_toPropertyKey(o.key), o); } } -function base_table_createClass(e, r, t) { return r && base_table_defineProperties(e.prototype, r), t && base_table_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function base_table_toPropertyKey(t) { var i = base_table_toPrimitive(t, "string"); return "symbol" == base_table_typeof(i) ? i : i + ""; } -function base_table_toPrimitive(t, r) { if ("object" != base_table_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != base_table_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function base_table_callSuper(t, o, e) { return o = base_table_getPrototypeOf(o), base_table_possibleConstructorReturn(t, base_table_isNativeReflectConstruct() ? Reflect.construct(o, e || [], base_table_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function base_table_possibleConstructorReturn(t, e) { if (e && ("object" == base_table_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return base_table_assertThisInitialized(t); } -function base_table_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function base_table_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (base_table_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function base_table_superPropGet(t, e, o, r) { var p = base_table_get(base_table_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function base_table_get() { return base_table_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = base_table_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, base_table_get.apply(null, arguments); } -function base_table_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = base_table_getPrototypeOf(t));); return t; } -function base_table_getPrototypeOf(t) { return base_table_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, base_table_getPrototypeOf(t); } -function base_table_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && base_table_setPrototypeOf(t, e); } -function base_table_setPrototypeOf(t, e) { return base_table_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, base_table_setPrototypeOf(t, e); } - - - - - - - - - - -var TableBasePage = /*#__PURE__*/function (_BasePage) { - // static hash - // static attrIdRowObject - // callSaveTableContent - - function TableBasePage(router) { - var _this; - base_table_classCallCheck(this, TableBasePage); - _this = base_table_callSuper(this, TableBasePage, [router]); - _this.cursorYInitial = null; - _this.rowInitial = null; - _this.placeholder = null; - _this.dragSrcEl = null; - _this.dragSrcRow = null; - _this.hookupTableCellDdls = _this.hookupTableCellDdls.bind(_this); - return _this; - } - base_table_inherits(TableBasePage, _BasePage); - return base_table_createClass(TableBasePage, [{ - key: "initialize", - value: function initialize() { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - throw new Error("Must implement initialize() method."); - } - }, { - key: "sharedInitialize", - value: function sharedInitialize() { - var _this2 = this; - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var isSinglePageApp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - if (!isPopState) { - base_table_superPropGet(TableBasePage, "sharedInitialize", this, 3)([]); - this.hookupFilters(); - this.hookupButtonsSaveCancel(); - this.hookupTableMain(); - OverlayConfirm.hookup(function () { - if (isSinglePageApp) { - _this2.saveRecordsTableDirtySinglePageApp(); - } else { - _this2.saveRecordsTableDirty(); - } - }); - } else { - var dataPage = this.getLocalStoragePage(); - var filters = dataPage[flagFormFilters]; - var formFilters = this.getFormFilters(); - var filtersDefault = DOM.convertForm2JSON(formFilters); - if (!validation_Validation.areEqualDicts(filters, filtersDefault)) { - this.callFilterTableContent(); - } - } - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - if (this.constructor === TableBasePage) { - throw new Error("Subclass of TableBasePage must implement method hookupFilters()."); - } - } - }, { - key: "sharedHookupFilters", - value: function sharedHookupFilters() { - this.hookupButtonApplyFilters(); - } - }, { - key: "hookupFilterActive", - value: function hookupFilterActive() { - this.hookupFilter(flagActive); - } - }, { - key: "hookupFilter", - value: function hookupFilter(filterFlag) { - var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, filter) { - return TableBasePage.isDirtyFilter(filter); - }; - var filterSelector = idFormFilters + ' .' + filterFlag; - this.hookupEventHandler("change", filterSelector, handler); - } - }, { - key: "hookupFilterIsNotEmpty", - value: function hookupFilterIsNotEmpty() { - this.hookupFilter(flagIsNotEmpty); - } - }, { - key: "hookupButtonApplyFilters", - value: function hookupButtonApplyFilters() { - var _this3 = this; - this.hookupEventHandler("click", idButtonApplyFilters, function (event, button) { - event.stopPropagation(); - _this3.callFilterTableContent(); - }); - } - /* - getAndLoadFilteredTableContent = () => { - this.callFilterTableContent() - .catch(error => console.error('Error:', error)); - } - */ - }, { - key: "getFormFilters", - value: function getFormFilters() { - return document.querySelector(idFormFilters); - } - }, { - key: "callFilterTableContent", - value: function callFilterTableContent() { - var formFilters = this.getFormFilters(); - var filtersJson = DOM.convertForm2JSON(formFilters); - this.leave(); - api_API.goToHash(this.constructor.hash, filtersJson); - } - }, { - key: "callbackLoadTableContent", - value: function callbackLoadTableContent(response) { - var table = TableBasePage.getTableMain(); - var bodyTable = table.querySelector('tbody'); - bodyTable.querySelectorAll('tr').forEach(function (row) { - row.remove(); - }); - var rowsJson = response.data[flagRows]; - if (!validation_Validation.isEmpty(rowsJson) && rowsJson.every(function (row) { - return row.hasOwnProperty('display_order'); - })) { - rowsJson = rowsJson.sort(function (a, b) { - return a.display_order - b.display_order; - }); - } - rowsJson.forEach(this.loadRowTable.bind(this)); - this.hookupTableMain(); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) { - throw new Error("Subclass of TableBasePage must implement method loadRowTable()."); - } - }, { - key: "getAndLoadFilteredTableContentSinglePageApp", - value: function getAndLoadFilteredTableContentSinglePageApp() { - var _this4 = this; - this.callFilterTableContent().then(function (data) { - if (_verbose) { - console.log('Table data received:', data); - } - _this4.callbackLoadTableContent(data); - })["catch"](function (error) { - return console.error('Error:', error); - }); - } - }, { - key: "hookupButtonsSaveCancel", - value: function hookupButtonsSaveCancel() { - this.hookupButtonSave(); - this.hookupButtonCancel(); - this.toggleShowButtonsSaveCancel(false); - } - }, { - key: "saveRecordsTableDirty", - value: function saveRecordsTableDirty() { - var _this5 = this; - var records = this.getTableRecords(true); - if (records.length == 0) { - OverlayError.show('No records to save'); - return; - } - var formElement = this.getFormFilters(); - var comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm)); - this.callSaveTableContent(records, formElement, comment).then(function (data) { - if (data[flagStatus] == flagSuccess) { - if (_verbose) { - console.log('Records saved!'); - console.log('Data received:', data); - } - _this5.callFilterTableContent(); - } else { - if (_verbose) { - console.log("error: ", data[flagMessage]); - } - OverlayError.show(data[flagMessage]); - } - })["catch"](function (error) { - return console.error('Error:', error); - }); - } - }, { - key: "getTableRecords", - value: function getTableRecords() { - var _this6 = this; - var dirtyOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var records = []; - var record; - document.querySelectorAll(idTableMain + ' > tbody > tr').forEach(function (row) { - if (dirtyOnly && !DOM.hasDirtyChildrenContainer(row)) return; - record = _this6.getJsonRow(row); - records.push(record); - }); - return records; - } - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - throw new Error("Subclass of TableBasePage must implement method getJsonRow()."); - } - }, { - key: "saveRecordsTableDirtySinglePageApp", - value: function saveRecordsTableDirtySinglePageApp() { - var _this7 = this; - var records = this.getTableRecords(true); - if (records.length == 0) { - OverlayError.show('No records to save'); - return; - } - var formElement = this.getFormFilters(); - var comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm)); - this.callSaveTableContent(records, formElement, comment).then(function (data) { - if (data[flagStatus] == flagSuccess) { - if (_verbose) { - console.log('Records saved!'); - console.log('Data received:', data); - } - _this7.callbackLoadTableContent(data); - } else { - if (_verbose) { - console.log("error: ", data[flagMessage]); - } - OverlayError.show(data[flagMessage]); - } - })["catch"](function (error) { - return console.error('Error:', error); - }); - } - }, { - key: "hookupButtonCancel", - value: function hookupButtonCancel() { - var _this8 = this; - Events.initialiseEventHandler(idFormFilters + ' button.' + flagCancel, flagInitialised, function (button) { - button.addEventListener("click", function (event) { - event.stopPropagation(); - _this8.callFilterTableContent(); - }); - button.classList.add(flagCollapsed); - }); - } - }, { - key: "handleClickAddRowTable", - value: function handleClickAddRowTable(event, button) { - event.stopPropagation(); - _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - _rowBlank.getAttribute(this.constructor.attrIdRowObject)); - var tbody = document.querySelector(idTableMain + ' tbody'); - var row = _rowBlank.cloneNode(true); - row.classList.remove(flagInitialised); - row.querySelectorAll('.' + flagInitialised).forEach(function (element) { - element.classList.remove(flagInitialised); - }); - var countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length; - row.setAttribute(this.constructor.attrIdRowObject, -1 - countRows); - this.initialiseRowNew(tbody, row); - tbody.appendChild(row); - this.hookupTableMain(); - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - if (this.constructor === TableBasePage) { - throw new Error("Subclass of TableBasePage must implement method initialiseRowNew()."); - } - row.classList.remove(flagRowNew); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - var _this9 = this; - if (this.constructor === TableBasePage) { - throw new Error("Must implement hookupTableMain() method."); - } - if (true) { - // _rowBlank == null) { - Events.initialiseEventHandler(idTableMain, flagInitialised, function (table) { - _this9.cacheRowBlank(); - }); - } - } - }, { - key: "cacheRowBlank", - value: function cacheRowBlank() { - var selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew; - var rowBlankTemp = document.querySelector(selectorRowNew); - if (_verbose) { - console.log("row blank temp: ", rowBlankTemp); - } - var countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length; - _rowBlank = rowBlankTemp.cloneNode(true); - document.querySelectorAll(selectorRowNew).forEach(function (row) { - row.remove(); - }); - _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - countRows); - } - }, { - key: "initialiseSliderDisplayOrderRowNew", - value: function initialiseSliderDisplayOrderRowNew(tbody, row) { - // let tdSelector = ':scope > tr > td.' + flagDisplayOrder; - // let tbody = document.querySelector('table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody'); - var slidersDisplayOrder = tbody.querySelectorAll(':scope > tr > td.' + flagDisplayOrder + ' input.' + flagSlider); - var maxDisplayOrder = 0; - slidersDisplayOrder.forEach(function (slider) { - maxDisplayOrder = Math.max(maxDisplayOrder, parseFloat(DOM.getElementValueCurrent(slider))); - }); - var sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, maxDisplayOrder + 1); - } - }, { - key: "hookupSlidersDisplayOrderTable", - value: function hookupSlidersDisplayOrderTable() { - var selectorDisplayOrder = idTableMain + ' tbody tr td.' + flagDisplayOrder + ' input.' + flagSlider + '.' + flagDisplayOrder; - /* - Events.initialiseEventHandler(selectorDisplayOrder, flagInitialised, (sliderDisplayOrder) => { - /* - sliderDisplayOrder.setAttribute('draggable', true); - sliderDisplayOrder.addEventListener('dragstart', this.handleDragSliderStart.bind(this), false); - sliderDisplayOrder.addEventListener('dragenter', this.handleDragSliderEnter.bind(this), false); - sliderDisplayOrder.addEventListener('dragover', this.handleDragSliderOver.bind(this), false); - sliderDisplayOrder.addEventListener('dragleave', this.handleDragSliderLeave.bind(this), false); - sliderDisplayOrder.addEventListener('drop', this.handleDropSlider.bind(this), false); - sliderDisplayOrder.addEventListener('dragend', this.handleDragSliderEnd.bind(this), false); - * - sliderDisplayOrder.addEventListener('change', (event) => { - console.log("slider change event"); - this.handleChangeNestedElementCellTable(sliderDisplayOrder); - }); - }); - */ - this.hookupChangeHandlerTableCells(selectorDisplayOrder); - } - }, { - key: "hookupChangeHandlerTableCells", - value: function hookupChangeHandlerTableCells(inputSelector) { - var _this10 = this; - var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { - _this10.handleChangeNestedElementCellTable(event, element); - }; - Events.initialiseEventHandler(inputSelector, flagInitialised, function (input) { - input.addEventListener("change", function (event) { - handler(event, input); - }); - handler(null, input); - }); - // this.hookupEventHandler("change", inputSelector, handler); - } - /* - handleChangeElementCellTable(event, element) { - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementNestedCellTable(event, element, flagColumnList = [], orderNesting = 1) { - let orderNestingTemp = orderNesting; - let row, td, nestedRowSelector; - while (orderNestingTemp > 0) { - nestedRowSelector = idTableMain; - for (let indexOrderNesting = 0; indexOrderNesting < orderNestingTemp; indexOrderNesting++) { - nestedRowSelector += ' tbody tr'; - } - row = DOM.getClosestParent(element, nestedRowSelector); - td = row.querySelector('td.' + flag); - } - let row = DOM.getRowFromElement(element); - let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - handleChangeElementSubtableCell(event, element, flagFieldSubtable) { - let rowSubtable = element.closest(idTableMain + ' td.' + flagFieldSubtable + ' tbody tr'); - let rowTable = rowSubtable.closest(idTableMain + ' > tbody > tr'); - let td = DOM.getCellFromElement(element); - // let tdSubtable = td.closest('td.' + flagFieldSubtable); - let wasDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - let wasDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - let wasDirtyElement = element.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - console.log({isDirtyElement, wasDirtyElement}); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable); - console.log({isNowDirtyRowSubtable, wasDirtyRowSubtable}); - if (isNowDirtyRowSubtable != wasDirtyRowSubtable) { - DOM.handleDirtyElement(rowSubtable, isNowDirtyRowSubtable); - let isNowDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable); - console.log({isNowDirtyRowTable, wasDirtyRowTable}); - if (isNowDirtyRowTable != wasDirtyRowTable) { - DOM.handleDirtyElement(rowTable, isNowDirtyRowTable); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - } - */ - }, { - key: "handleChangeNestedElementCellTable", - value: function handleChangeNestedElementCellTable(event, element) { - var wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element); - var wasDirtyElement = element.classList.contains(flagDirty); - var isDirtyElement = DOM.updateAndCheckIsElementDirty(element); - if (_verbose) { - console.log({ - isDirtyElement: isDirtyElement, - wasDirtyElement: wasDirtyElement, - wasDirtyParentRows: wasDirtyParentRows - }); - } - var td = DOM.getCellFromElement(element); - DOM.setElementAttributeValueCurrent(td, DOM.getElementAttributeValueCurrent(element)); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - this.updateAndToggleShowButtonsSaveCancel(); - this.cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows); - } - } - }, { - key: "getAllIsDirtyRowsInParentTree", - value: function getAllIsDirtyRowsInParentTree(element) { - var rows = []; - var parent = element; - var isDirty; - while (parent) { - if (parent.matches('tr')) { - isDirty = parent.classList.contains(flagDirty); - rows.push(isDirty); - } - parent = parent.parentElement; - } - return rows; - } - }, { - key: "cascadeChangedIsDirtyNestedElementCellTable", - value: function cascadeChangedIsDirtyNestedElementCellTable(element, isDirtyElement, wasDirtyParentRows) { - if (validation_Validation.isEmpty(wasDirtyParentRows)) return; - var td = DOM.getCellFromElement(element); - var isDirtyTd = isDirtyElement || DOM.hasDirtyChildrenContainer(tr); - DOM.handleDirtyElement(td, isDirtyTd); - var tr = DOM.getRowFromElement(td); - var isDirtyRow = isDirtyTd || DOM.hasDirtyChildrenContainer(tr); - var wasDirtyRow = wasDirtyParentRows.shift(); - if (_verbose) { - console.log({ - isDirtyRow: isDirtyRow, - wasDirtyRow: wasDirtyRow - }); - } - if (isDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(tr, isDirtyRow); - this.updateAndToggleShowButtonsSaveCancel(); - this.cascadeChangedIsDirtyNestedElementCellTable(tr.parentElement, isDirtyRow, wasDirtyParentRows); - } - } - }, { - key: "hookupChangeHandlerTableCellsWhenNotCollapsed", - value: function hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector) { - var _this11 = this; - var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { - if (!element.classList.contains(flagCollapsed)) _this11.handleChangeNestedElementCellTable(event, element); - }; - this.hookupEventHandler("change", inputSelector, handler); - } - /* ToDo: Fix this slider drag and drop functionality - handleDragSliderStart(event) { - this.dragSrcEl = event.target; - event.dataTransfer.effectAllowed = flagMove; - /* - console.log("setting outer html: ", this.dragSrcEl.outerHTML); - event.dataTransfer.setData('text/html', this.dragSrcEl.outerHTML); - * - this.dragSrcRow = DOM.getRowFromElement(this.dragSrcEl); - this.dragSrcEl.classList.add(flagDragging); - } - handleDragSliderOver(event) { - if (event.preventDefault) { - event.preventDefault(); - } - event.dataTransfer.dropEffect = flagMove; - return false; - } - handleDragSliderEnter(event) { - event.target.closest('tr').classList.add(flagDragOver); - } - handleDragSliderLeave(event) { - event.target.closest('tr').classList.remove(flagDragOver); - } - handleDropSlider(event) { - event.stopPropagation(); - let targetRow = DOM.getRowFromElement(event.target); - if (this.dragSourceRow != targetRow) { - targetRow.classList.remove(flagDragOver); - this.dragSrcEl.classList.remove(flagDragging); - let sourceRowClone = this.dragSrcRow.cloneNode(true); - let targetRowClone = targetRow.cloneNode(true); - console.log("sourceRowClone: ", sourceRowClone); - console.log("targetRowClone: ", targetRowClone); - let tbody = targetRow.closest('tbody'); - tbody.replaceChild(sourceRowClone, targetRow); - tbody.replaceChild(targetRowClone, this.dragSrcRow); - this.refreshDisplayOrders(); - } - return false; - } - handleDragSliderEnd(event) { - let table = TableBasePage.getTableMain(); - let rows = table.querySelectorAll('tr'); - rows.forEach(row => { - row.classList.remove(flagDragOver); - row.classList.remove(flagDragging); - }); - } - refreshDisplayOrders() { - console.log("updating display order values"); - let rows = document.querySelectorAll(idTableMain + 'tbody tr.' + flagRow); - rows.forEach((row, indexRow) => { - sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - sliderDisplayOrder.setAttribute(attrValueCurrent, indexRow); - }); - } - */ - }, { - key: "hookupTextareasCodeTable", - value: function hookupTextareasCodeTable() { - this.hookupChangeHandlerTableCells(idTableMain + ' tbody tr td.' + flagCode + ' textarea'); - } - }, { - key: "hookupTextareasNameTable", - value: function hookupTextareasNameTable() { - this.hookupChangeHandlerTableCells(idTableMain + ' tbody tr td.' + flagName + ' textarea'); - } - }, { - key: "hookupTextareasDescriptionTable", - value: function hookupTextareasDescriptionTable() { - this.hookupChangeHandlerTableCells(idTableMain + ' tbody tr td.' + flagDescription + ' textarea'); - } - }, { - key: "hookupFieldsActive", - value: function hookupFieldsActive() { - var _this12 = this; - var flagTable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var handleClickRowNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { - _this12.handleClickAddRowTable(event, element); - }; - var selectorButton = 'table' + (validation_Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' button'; - var selectorButtonDelete = selectorButton + '.' + flagDelete; - var selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')'; - console.log("hookupFieldsActive: ", selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupEventHandler("click", 'table' + (validation_Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' button', function (event, button) { - handleClickRowNew(event, button); - }); - } - }, { - key: "hookupButtonsRowDelete", - value: function hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete) { - var _this13 = this; - var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { - _this13.handleChangeNestedElementCellTable(event, element); - }; - this.hookupEventHandler("click", selectorButtonDelete, function (event, element) { - _this13.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { - changeHandler(changeEvent, changeElement); - }); - }); - } - }, { - key: "handleClickButtonRowDelete", - value: function handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete) { - var _this14 = this; - var changeHandler = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (event, element) { - _this14.handleChangeNestedElementCellTable(event, element); - }; - var row = DOM.getRowFromElement(element); - if (row.classList.contains(flagRowNew) && !DOM.hasDirtyChildrenContainer(row)) { - row.parentNode.removeChild(row); - } - var buttonAdd = element.cloneNode(false); - buttonAdd.classList.remove(flagInitialised); - buttonAdd.classList.remove(flagDelete); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - element.replaceWith(buttonAdd); - changeHandler(null, buttonAdd); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { - changeHandler(changeEvent, changeElement); - }); - this.updateAndToggleShowButtonsSaveCancel(); - } - }, { - key: "hookupButtonsRowUndelete", - value: function hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete) { - var _this15 = this; - var changeHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { - _this15.handleChangeNestedElementCellTable(event, element); - }; - this.hookupEventHandler("click", selectorButtonUndelete, function (event, element) { - _this15.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { - changeHandler(changeEvent, changeElement); - }); - }); - } - }, { - key: "handleClickButtonRowUndelete", - value: function handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete) { - var _this16 = this; - var changeHandler = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (event, element) { - _this16.handleChangeNestedElementCellTable(event, element); - }; - var buttonDelete = element.cloneNode(false); - buttonDelete.classList.remove(flagInitialised); - buttonDelete.classList.remove(flagAdd); - buttonDelete.classList.add(flagDelete); - buttonDelete.textContent = 'x'; - element.replaceWith(buttonDelete); - changeHandler(null, buttonDelete); - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, function (changeEvent, changeElement) { - changeHandler(changeEvent, changeElement); - }); - this.updateAndToggleShowButtonsSaveCancel(); - } - }, { - key: "hookupTdsAccessLevel", - value: function hookupTdsAccessLevel() { - var cellSelector = idTableMain + ' tbody td.' + flagAccessLevel; - this.hookupTableCellDdlPreviews(cellSelector, Utils.getListFromDict(accessLevels)); - } - }, { - key: "hookupTableCellDdlPreviews", - value: function hookupTableCellDdlPreviews(cellSelector, optionList) { - var _this17 = this; - var ddlHookup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (cellSelector) { - _this17.hookupTableCellDdls(cellSelector); - }; - var changeHandler = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (event, element) { - _this17.handleChangeNestedElementCellTable(event, element); - }; - this.hookupEventHandler("click", cellSelector, function (event, td) { - _this17.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (cellSelector) { - ddlHookup(cellSelector, function (event, element) { - changeHandler(event, element); - }); - }); - }); - ddlHookup(cellSelector + ' select'); - } - }, { - key: "hookupTableCellDdls", - value: function hookupTableCellDdls(ddlSelector) { - var _this18 = this; - var changeHandler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (event, element) { - _this18.handleChangeNestedElementCellTable(event, element); - }; - this.hookupEventHandler("change", ddlSelector, function (event, element) { - changeHandler(event, element); - }); - } - }, { - key: "handleClickTableCellDdlPreview", - value: function handleClickTableCellDdlPreview(event, td, optionObjectList, cellSelector) { - var _this19 = this; - var ddlHookup = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (cellSelector) { - _this19.hookupTableCellDdls(cellSelector); - }; - if (td.querySelector('select')) return; - // td.removeEventListener("click", ddlHookup); - var tdNew = td.cloneNode(true); - td.parentNode.replaceChild(tdNew, td); - var idSelected = DOM.getElementAttributeValueCurrent(tdNew); - tdNew.innerHTML = ''; - var ddl = document.createElement('select'); - DOM.setElementValuesCurrentAndPrevious(ddl, idSelected); - var optionJson, option; - if (_verbose) { - console.log("click table cell ddl preview"); - console.log({ - optionObjectList: optionObjectList, - cellSelector: cellSelector - }); - } - option = DOM.createOption(null); - ddl.appendChild(option); - optionObjectList.forEach(function (optionObjectJson) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(optionObjectJson, idSelected); - option = DOM.createOption(optionJson); - ddl.appendChild(option); - }); - tdNew.appendChild(ddl); - var ddlSelector = cellSelector + ' select'; - ddlHookup(ddlSelector); - } - /* - handleChangeTableCellDdl(event, ddl) { - let row = DOM.getRowFromElement(ddl); - let td = DOM.getCellFromElement(ddl); - console.log("td: ", td); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); - let wasDirtyElement = ddl.classList.contains(flagDirty); - let isDirtyElement = DOM.updateAndCheckIsElementDirty(ddl); - console.log("isDirtyElement: ", isDirtyElement); - console.log("wasDirtyElement: ", wasDirtyElement); - if (isDirtyElement != wasDirtyElement) { - DOM.handleDirtyElement(td, isDirtyElement); - let optionSelected = ddl.options[ddl.selectedIndex]; - DOM.setElementAttributeValueCurrent(td, optionSelected.value); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); - console.log("isNowDirtyRow: ", isNowDirtyRow); - console.log("wasDirtyRow: ", wasDirtyRow); - if (isNowDirtyRow != wasDirtyRow) { - DOM.handleDirtyElement(row, isNowDirtyRow); - let rows = this.getTableRecords(true); - let existsDirtyRecord = rows.length > 0; - console.log("dirty records:", rows); - console.log("existsDirtyRecord:", existsDirtyRecord); - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - } - } - */ - }, { - key: "hookupTableCellDDlPreviewsWhenNotCollapsed", - value: function hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList) { - var _this20 = this; - var ddlHookup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (event, element) { - _this20.hookupTableCellDdls(event, element); - }; - this.hookupEventHandler("click", cellSelector, function (event, td) { - var div = td.querySelector('div'); - if (!div || div.classList.contains(flagCollapsed)) return; - _this20.handleClickTableCellDdlPreview(event, td, optionList, cellSelector, function (event, element) { - ddlHookup(event, element); - }); - }); - } - }, { - key: "hookupProductCategoryDdls", - value: function hookupProductCategoryDdls(ddlSelector) { - var _this21 = this; - this.hookupChangeHandlerTableCells(ddlSelector, function (event, element) { - _this21.handleChangeProductCategoryDdl(event, element); - }); - } - }, { - key: "handleChangeProductCategoryDdl", - value: function handleChangeProductCategoryDdl(event, ddlCategory) { - this.handleChangeNestedElementCellTable(event, ddlCategory); - var idProductCategorySelected = DOM.getElementAttributeValueCurrent(ddlCategory); - var row = DOM.getRowFromElement(ddlCategory); - var tdProduct = row.querySelector('td.' + flagProduct); - tdProduct.dispatchEvent(new Event('click')); - var ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - ddlProduct.innerHTML = ''; - ddlProduct.appendChild(DOM.createOption(null)); - var optionJson, option; - Utils.getListFromDict(products).forEach(function (product) { - if (idProductCategorySelected != '0' && product[attrIdProductCategory] != idProductCategorySelected) return; - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product); - option = DOM.createOption(optionJson); - ddlProduct.appendChild(option); - }); - this.handleChangeNestedElementCellTable(event, ddlProduct); - } - }, { - key: "hookupFieldsProductPermutationVariation", - value: function hookupFieldsProductPermutationVariation() { - this.hookupPreviewsProductPermutationVariation(); - this.hookupDdlsProductPermutationVariationType(); - this.hookupDdlsProductPermutationVariation(); - this.hookupButtonsProductPermutationVariationAddDelete(); - } - }, { - key: "hookupPreviewsProductPermutationVariation", - value: function hookupPreviewsProductPermutationVariation() { - var _this22 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations, function (event, element) { - return _this22.handleClickProductPermutationVariationsPreview(event, element); - }); - } - }, { - key: "handleClickProductPermutationVariationsPreview", - value: function handleClickProductPermutationVariationsPreview(event, element) { - var _this23 = this; - var tblVariations = element.querySelector('table.' + flagProductVariations); - if (!validation_Validation.isEmpty(tblVariations)) return; - this.toggleColumnCollapsed(flagProductVariations, false); - var permutationVariations = this.getElementProductVariations(element); - tblVariations = document.createElement("table"); - tblVariations.classList.add(flagProductVariations); - var thead = document.createElement("thead"); - var tr = document.createElement("tr"); - var thVariationType = document.createElement("th"); - thVariationType.classList.add(flagProductVariationType); - thVariationType.textContent = 'Type'; - var thNameVariation = document.createElement("th"); - thNameVariation.classList.add(flagProductVariation); - thNameVariation.textContent = 'Name'; - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - var thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - thAddDelete.appendChild(buttonAdd); - tr.appendChild(thVariationType); - tr.appendChild(thNameVariation); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblVariations.appendChild(thead); - var tbody = document.createElement("tbody"); - if (!validation_Validation.isEmpty(permutationVariations)) { - permutationVariations.forEach(function (permutationVariation, index) { - _this23.addProductPermutationVariationRow(tbody, permutationVariation); - }); - } - tblVariations.appendChild(tbody); - if (_verbose) { - console.log("click product permutation variations preview"); - console.log('variations:', permutationVariations); - console.log("tblVariations: ", tblVariations); - } - var cellParent = element.closest(idTableMain + ' tbody tr td.' + flagProductVariations); - cellParent.innerHTML = ''; - cellParent.appendChild(tblVariations); - this.hookupFieldsProductPermutationVariation(); - } - }, { - key: "toggleColumnCollapsed", - value: function toggleColumnCollapsed(flagColumn, isCollapsed) { - this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagCollapsed); - } - }, { - key: "toggleColumnHeaderCollapsed", - value: function toggleColumnHeaderCollapsed(flagColumn, isCollapsed) { - this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagCollapsed); - } - }, { - key: "getElementProductVariations", - value: function getElementProductVariations(element) { - var permutationVariations = element.getAttribute(attrValueCurrent); - var objVariations = []; - var parts, new_variation, new_variation_type; - if (!validation_Validation.isEmpty(permutationVariations)) { - permutationVariations = permutationVariations.split(','); - permutationVariations.forEach(function (variation) { - parts = variation.split(':'); - if (parts.length == 2) { - if (_verbose) { - console.log("parts: ", parts); - } - new_variation_type = productVariationTypes[parts[0].trim()]; - new_variation = productVariations[parts[1].trim()]; - objVariations.push(base_table_defineProperty(base_table_defineProperty({}, flagProductVariationType, new_variation_type), flagProductVariation, new_variation)); - } else { - if (_verbose) { - console.log("error: invalid variation: ", variation); - } - } - }); - } - return objVariations; - } - }, { - key: "addProductPermutationVariationRow", - value: function addProductPermutationVariationRow(tbody, permutationVariation) { - if (_verbose) { - console.log("permutationVariation: ", permutationVariation); - } - var productVariationType, optionProductVariationTypeJson, optionProductVariationType, productVariation, optionProductVariationJson, optionProductVariation; - /* - if (Validation.isEmpty(variations)) { - return; - } - */ - var productVariationKeys = Object.keys(productVariations); - var productVariationTypeKeys = Object.keys(productVariationTypes); - var ddlsProductVariationType = tbody.querySelectorAll('select.' + flagProductVariationType); - var productVariationTypeKeysSelected = new Set(); - var valueSelected; - var doFilterProductVariationKeys = permutationVariation[attrIdProductVariationType] != 0; - ddlsProductVariationType.forEach(function (ddlProductVariationType) { - valueSelected = DOM.getElementValueCurrent(ddlProductVariationType); - productVariationTypeKeysSelected.add(valueSelected); - }); - productVariationTypeKeys = productVariationTypeKeys.filter(function (typeKey) { - return !productVariationTypeKeysSelected.has(typeKey); - }); - if (productVariationTypeKeys.length == 0) return; - if (doFilterProductVariationKeys) { - productVariationKeys = productVariationKeys.filter(function (variationKey) { - return !productVariationTypeKeysSelected.has(productVariations[variationKey][attrIdProductVariationType]); - }); - } - var permutationVariationJson = permutationVariation[flagProductVariation]; - var permutationVariationTypeJson = permutationVariation[flagProductVariationType]; - var tdVariationType = document.createElement("td"); - tdVariationType.classList.add(flagProductVariationType); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariationType, permutationVariationTypeJson[attrIdProductVariationType]); - var ddlVariationType = document.createElement("select"); - ddlVariationType.classList.add(flagProductVariationType); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlVariationType, permutationVariationTypeJson[attrIdProductVariationType]); - optionProductVariationType = DOM.createOption(null); - if (_verbose) { - console.log("optionProductVariationType: ", optionProductVariationType); - } - ddlVariationType.appendChild(optionProductVariationType); - productVariationTypeKeys.forEach(function (productVariationTypeKey) { - /* - optionProductVariationType = document.createElement('option'); - optionProductVariationType.value = optionVariationType.value; - optionProductVariationType.text = optionVariationType.text; - */ - productVariationType = productVariationTypes[productVariationTypeKey]; - optionProductVariationTypeJson = BusinessObjects.getOptionJsonFromObjectJson(productVariationType, permutationVariationTypeJson[attrIdProductVariationType]); - optionProductVariationType = DOM.createOption(optionProductVariationTypeJson); - if (_verbose) { - console.log("optionProductVariationType: ", optionProductVariationType); - } - ddlVariationType.appendChild(optionProductVariationType); - }); - var tdVariation = document.createElement("td"); - tdVariation.classList.add(flagProductVariation); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariation, permutationVariationJson[attrIdProductVariation]); - var ddlVariation = document.createElement("select"); - ddlVariation.classList.add(flagProductVariation); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlVariation, permutationVariationJson[attrIdProductVariation]); - optionProductVariation = DOM.createOption(null); - if (_verbose) { - console.log("optionProductVariation: ", optionProductVariation); - } - ddlVariation.appendChild(optionProductVariation); - productVariationKeys.forEach(function (productVariationKey) { - productVariation = productVariations[productVariationKey]; - optionProductVariationJson = BusinessObjects.getOptionJsonFromObjectJson(productVariation, permutationVariationJson[attrIdProductVariation]); - optionProductVariation = DOM.createOption(optionProductVariationJson); - if (_verbose) { - console.log("optionProductVariation: ", optionProductVariation); - } - ddlVariation.appendChild(optionProductVariation); - }); - var tdDelete = document.createElement("td"); - tdDelete.classList.add(flagDelete); - var buttonDelete = document.createElement("button"); - buttonDelete.classList.add(flagActive); - buttonDelete.classList.add(flagDelete); - buttonDelete.textContent = 'x'; - DOM.setElementAttributesValuesCurrentAndPrevious(buttonDelete, true); - var tr = document.createElement("tr"); - tr.classList.add(flagProductVariation); - tdVariationType.appendChild(ddlVariationType); - tr.appendChild(tdVariationType); - tdVariation.appendChild(ddlVariation); - tr.appendChild(tdVariation); - tdDelete.appendChild(buttonDelete); - tr.appendChild(tdDelete); - tbody.appendChild(tr); - } - }, { - key: "hookupDdlsProductPermutationVariationType", - value: function hookupDdlsProductPermutationVariationType() { - var _this24 = this; - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariationType + ' select', function (event, ddlVariationType) { - _this24.handleChangeProductVariationInput(event, ddlVariationType); - var idVariationTypeSelected = DOM.getElementValueCurrent(ddlVariationType); - var row = DOM.getRowFromElement(ddlVariationType); - var tdVariation = row.querySelector('td.' + flagProductVariation); - tdVariation.dispatchEvent(new Event('click')); - var ddlVariation = row.querySelector('td.' + flagProductVariation + ' select'); - ddlVariation.innerHTML = ''; - ddlVariation.appendChild(DOM.createOption(null)); - var optionJson, option; - var variationType = productVariationTypes[idVariationTypeSelected]; - if (variationType == null) variationType = base_table_defineProperty({}, flagProductVariations, []); - variationType[flagProductVariations].forEach(function (variation) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(variation); - option = DOM.createOption(optionJson); - ddlVariation.appendChild(option); - }); - _this24.handleChangeProductVariationInput(event, ddlVariation); - }); - } - }, { - key: "handleChangeProductVariationInput", - value: function handleChangeProductVariationInput(event, element) { - this.handleChangeNestedElementCellTable(event, element); - this.updateProductPermutationVariations(element); - } - }, { - key: "hookupDdlsProductPermutationVariation", - value: function hookupDdlsProductPermutationVariation() { - var _this25 = this; - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation + ' select', function (event, ddlVariation) { - _this25.handleChangeProductVariationInput(event, ddlVariation); - }); - } - }, { - key: "hookupButtonsProductPermutationVariationAddDelete", - value: function hookupButtonsProductPermutationVariationAddDelete() { - var _this26 = this; - var selectorButton = idTableMain + ' td.' + flagProductVariations + ' tr.' + flagProductVariation + ' button'; - var selectorButtonDelete = selectorButton + '.' + flagDelete; - var selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, function (event, element) { - _this26.handleChangeProductVariationInput(event, element); - }); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, function (event, element) { - _this26.handleChangeProductVariationInput(event, element); - }); - this.hookupButtonsProductPermutationVariationAdd(); - } - }, { - key: "hookupButtonsProductPermutationVariationAdd", - value: function hookupButtonsProductPermutationVariationAdd() { - var _this27 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations + ' button.' + flagAdd, function (event, element) { - _this27.handleClickButtonProductPermutationVariationAdd(event, element); - }); - } - }, { - key: "handleClickButtonProductPermutationVariationAdd", - value: function handleClickButtonProductPermutationVariationAdd(event, element) { - var variationsCell = element.closest('td.' + flagProductVariations); - var tbody = variationsCell.querySelector('tbody'); - var permutationVariation = TableBasePage.createOptionUnselectedProductVariation(); - this.addProductPermutationVariationRow(tbody, permutationVariation); - this.hookupFieldsProductPermutationVariation(); - } - }, { - key: "updateProductPermutationVariations", - value: function updateProductPermutationVariations(element) { - var variationsCell = element.closest('td.' + flagProductVariations); - var variationPairsString = this.getProductPermutationVariationsText(variationsCell); - DOM.setElementAttributeValueCurrent(variationsCell, variationPairsString); - this.handleChangeNestedElementCellTable(null, variationsCell); - } - }, { - key: "getProductPermutationVariationsText", - value: function getProductPermutationVariationsText(variationsTd) { - var rows = variationsTd.querySelectorAll(':scope tbody tr:has(button.' + flagDelete + ')'); - var variationPairsString = ''; - var ddlVariationType, ddlVariation, idVariationType, idVariation; - rows.forEach(function (row, index) { - ddlVariationType = row.querySelector(':scope td select.' + flagProductVariationType); - ddlVariation = row.querySelector(':scope td select.' + flagProductVariation); - idVariationType = DOM.getElementValueCurrent(ddlVariationType); - idVariation = DOM.getElementValueCurrent(ddlVariation); - if (variationPairsString != '') variationPairsString += ','; - variationPairsString += idVariationType + ':' + idVariation; - }); - return variationPairsString; - } - }, { - key: "hookupCurrencyFields", - value: function hookupCurrencyFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrency, Utils.getListFromDict(currencies)); - } - }, { - key: "createTdActive", - value: function createTdActive(isActive) { - var tdActive = document.createElement("td"); - tdActive.classList.add(flagActive); - var buttonActive = document.createElement("button"); - buttonActive.classList.add(flagActive); - buttonActive.classList.add(isActive ? flagDelete : flagAdd); - buttonActive.textContent = isActive ? 'x' : '+'; - DOM.setElementAttributesValuesCurrentAndPrevious(buttonActive, isActive); - tdActive.appendChild(buttonActive); - return tdActive; - } - }, { - key: "leave", - value: function leave() { - if (this.constructor === TableBasePage) { - throw new Error("Must implement leave() method."); - } - base_table_superPropGet(TableBasePage, "leave", this, 3)([]); - var formFilters = this.getFormFilters(); - var dataPage = {}; - dataPage[flagFormFilters] = DOM.convertForm2JSON(formFilters); - this.setLocalStoragePage(dataPage); - // _rowBlank = null; - } - }, { - key: "toggleColumnHasClassnameFlag", - value: function toggleColumnHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) { - var table = TableBasePage.getTableMain(); - var columnTh = table.querySelector('th.' + columnFlag); - var columnThHasFlag = columnTh.classList.contains(classnameFlag); - if (isRequiredFlag == columnThHasFlag) return; - DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag); - /* - let columnTds = table.querySelectorAll('td.' + columnFlag); - columnTds.forEach((columnTd) => { - DOM.toggleElementHasClassnameFlag(columnTd, isRequiredFlag, classnameFlag); - }); - */ - } - }, { - key: "toggleColumnHeaderHasClassnameFlag", - value: function toggleColumnHeaderHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) { - var table = TableBasePage.getTableMain(); - var columnTh = table.querySelector('th.' + columnFlag); - DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag); - } - }, { - key: "updateAndToggleShowButtonsSaveCancel", - value: function updateAndToggleShowButtonsSaveCancel() { - var records = this.getTableRecords(true); - var existsDirtyRecord = records.length > 0; - this.toggleShowButtonsSaveCancel(existsDirtyRecord); - } - }], [{ - key: "isDirtyFilter", - value: function isDirtyFilter(filter) { - var isDirty = DOM.updateAndCheckIsElementDirty(filter); - if (isDirty) { - var tbody = document.querySelector(idTableMain + ' tbody'); - tbody.querySelectorAll('tr').remove(); - tbody.appendChild(document.createElement('
Press "Apply Filters" to refresh the table.
')); - } - return isDirty; - } - }, { - key: "getTableMain", - value: function getTableMain() { - return document.querySelector(idTableMain); - } - }, { - key: "createOptionUnselectedProductVariation", - value: function createOptionUnselectedProductVariation() { - return base_table_defineProperty(base_table_defineProperty({}, flagProductVariationType, base_table_defineProperty(base_table_defineProperty(base_table_defineProperty(base_table_defineProperty({}, flagNameAttrOptionText, [flagName]), flagNameAttrOptionValue, [attrIdProductVariationType]), flagName, 'Select Variation Type'), attrIdProductVariationType, 0)), flagProductVariation, base_table_defineProperty(base_table_defineProperty(base_table_defineProperty(base_table_defineProperty({}, flagNameAttrOptionText, [flagName]), flagNameAttrOptionValue, [attrIdProductVariation]), flagName, 'Select Variation'), attrIdProductVariation, 0)); - } - }]); -}(BasePage); -/* Example of a subclass of TableBasePage -import { TableBasePage } from "./page_table_base.js"; -import API from "../api.js"; -import DOM from "../dom.js"; - -export class PageStoreProductCategories extends TableBasePage { - static hash = hashPageStoreProductCategories; - static attrIdRowObject = attrIdProductCategory; - callSaveTableContent = API.saveCategories; - - constructor() {} - initialize() {} - hookupFilters() {} - loadRowTable(rowJson) {} - getJsonRow(row) {} - initialiseRowNew(tbody, row) {} - hookupTableMain() {} - isDirtyRow(row) {} - leave() {} -} -*/ - -;// CONCATENATED MODULE: ./static/js/pages/store/mixin.js -function mixin_typeof(o) { "@babel/helpers - typeof"; return mixin_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, mixin_typeof(o); } -function mixin_createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = mixin_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } -function mixin_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return mixin_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? mixin_arrayLikeToArray(r, a) : void 0; } } -function mixin_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -function mixin_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } -function mixin_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? mixin_ownKeys(Object(t), !0).forEach(function (r) { mixin_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : mixin_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } -function mixin_defineProperty(e, r, t) { return (r = mixin_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function mixin_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function mixin_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, mixin_toPropertyKey(o.key), o); } } -function mixin_createClass(e, r, t) { return r && mixin_defineProperties(e.prototype, r), t && mixin_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function mixin_toPropertyKey(t) { var i = mixin_toPrimitive(t, "string"); return "symbol" == mixin_typeof(i) ? i : i + ""; } -function mixin_toPrimitive(t, r) { if ("object" != mixin_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != mixin_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - -// import BasePage from "../base.js"; - - -var StoreMixinPage = /*#__PURE__*/function () { - function StoreMixinPage(pageCurrent) { - mixin_classCallCheck(this, StoreMixinPage); - this.page = pageCurrent; - } - return mixin_createClass(StoreMixinPage, [{ - key: "initialize", - value: function initialize() { - console.log('hookup store start for ', this.page.hash); - this.hookupFilters(); - this.hookupLocalStorageStore(); - this.hookupBasket(); - this.hookupButtonsAddToBasket(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.hookupFilterCurrency(); - this.hookupFilterDeliveryRegion(); - this.hookupFilterIsIncludedVAT(); - } - }, { - key: "hookupFilterCurrency", - value: function hookupFilterCurrency() { - /* - let elForm = document.querySelectorAll(idFormCurrency); - let elSelector = document.querySelectorAll(elForm.querySelector('select')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function(){ - elForm = document.querySelectorAll(idFormCurrency); - elSelector.addEventListener("change", function(event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - console.log('sending data to currency selector controller: '); console.log(ajaxData); - ajaxJSONData('select currency', mapHashToController(hashStoreSelectCurrency), ajaxData, function() { window.location.reload() }, false); - let optionSelected = elSelector.options[elSelector.selectedIndex] - let textSelected = optionSelected.getAttribute(attrDataShort) - - }); - }); - console.log("form currency initialised") - */ - - var dropdownCurrency = document.querySelectorAll(idCurrency)[0]; - // dropdownCurrency.options.map(function(option) { - var option, indexHyphen, textOption; - for (var indexOption = 0; indexOption < dropdownCurrency.options.length; indexOption++) { - option = document.querySelectorAll(dropdownCurrency.options[indexOption]); - textOption = option.text(); - indexHyphen = textOption.indexOf('-'); - option.setAttribute(attrTextExpanded, textOption); - option.setAttribute(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); - option.classList.add(flagCollapsed); - } - handleSelectCollapse(dropdownCurrency); - Events.initialiseEventHandler(dropdownCurrency, flagInitialised, function () { - dropdownCurrency = document.querySelectorAll(dropdownCurrency); - dropdownCurrency.addEventListener("focus", function () { - handleSelectExpand(dropdownCurrency); - }); - dropdownCurrency.addEventListener("blur", function () { - handleSelectCollapse(dropdownCurrency); - }); - dropdownCurrency.addEventListener("change", function () { - var selectedCurrency = dropdownCurrency.val(); - if (_verbose) { - console.log("selected currency: ", selectedCurrency); - } - var basket = LocalStorage.getLocalStorage(keyBasket); - basket[keyIdCurrency] = selectedCurrency; - // LocalStorage.setLocalStorage(keyIdCurrency, selectedCurrency); - LocalStorage.setLocalStorage(keyBasket, basket); - var ajaxData = {}; - ajaxData[keyBasket] = basket; - ajaxJSONData('update currency', mapHashToController(hashPageCurrent), ajaxData, loadPageBody, false); - }); - }); - } - }, { - key: "hookupFilterDeliveryRegion", - value: function hookupFilterDeliveryRegion() { - /* - let elForm = document.querySelectorAll(idFormDeliveryRegion); - let elSelector = document.querySelectorAll(elForm.querySelector('select')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function(){ - elForm = document.querySelectorAll(idFormDeliveryRegion); - elSelector.addEventListener("change", function(event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - console.log('sending data to delivery region selector controller: '); console.log(ajaxData); - ajaxJSONData('select delivery region', mapHashToController(hashStoreSelectDeliveryRegion), ajaxData, function() { window.location.reload() }, false); - }); - console.log("form delivery region initialised") - }); - */ - - var dropdownRegion = document.querySelectorAll(idRegionDelivery)[0]; - var option, indexHyphen, textOption; - for (var indexOption = 0; indexOption < dropdownRegion.options.length; indexOption++) { - option = document.querySelectorAll(dropdownRegion.options[indexOption]); - textOption = option.text(); - indexHyphen = textOption.indexOf('-'); - option.setAttribute(attrTextExpanded, textOption); - option.setAttribute(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); - option.classList.add(flagCollapsed); - } - handleSelectCollapse(dropdownRegion); - Events.initialiseEventHandler(dropdownRegion, flagInitialised, function () { - dropdownRegion = document.querySelectorAll(dropdownRegion); - dropdownRegion.addEventListener("focus", function () { - if (_verbose) { - console.log("dropdown region focused"); - } - handleSelectExpand(dropdownRegion); - }); - dropdownRegion.addEventListener("blur", function () { - if (_verbose) { - console.log("dropdown region blurred"); - } - handleSelectCollapse(dropdownRegion); - }); - dropdownRegion.addEventListener("change", function () { - handleSelectCollapse(dropdownRegion); - var selectedRegion = dropdownRegion.val(); - if (_verbose) { - console.log("selected region: ", selectedRegion); - } - var basket = LocalStorage.getLocalStorage(keyBasket); - basket[keyIdRegionDelivery] = selectedRegion; - // LocalStorage.setLocalStorage(keyIdRegionDelivery, selectedRegion); - LocalStorage.setLocalStorage(keyBasket, basket); - var ajaxData = {}; - ajaxData[keyIdRegionDelivery] = selectedRegion; - ajaxJSONData('update region', mapHashToController(hashStoreSetRegion), ajaxData, null, false); - }); - }); - } - }, { - key: "hookupFilterIsIncludedVAT", - value: function hookupFilterIsIncludedVAT() { - var elForm = document.querySelectorAll(idFormIsIncludedVAT); - var elSelector = document.querySelectorAll(elForm.querySelector('input[type="checkbox"]')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function () { - elForm = document.querySelectorAll(idFormIsIncludedVAT); - elSelector.addEventListener("change", function (event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - if (_verbose) { - console.log('sending data to include VAT controller: '); - console.log(ajaxData); - } - ajaxJSONData('set include VAT', mapHashToController(hashStoreSetIsIncludedVAT), ajaxData, function () { - window.location.reload(); - }, false); - }); - if (_verbose) { - console.log("form is included VAT initialised"); - } - }); - } - }, { - key: "hookupLocalStorage", - value: function hookupLocalStorage() { - // setupPageLocalStorage(hashPageCurrent); - // let lsPage = getPageLocalStorage(hashPageCurrent); - // let d = {} - // d[keyBasket] = LocalStorage.getLocalStorage(keyBasket); // (keyBasket in lsPage) ? lsPage[keyBasket] : {'items': []}; - // console.log('d:'); console.log(d); - var basketLocalStorage = LocalStorage.getLocalStorage(keyBasket); - if (!StoreMixinPage.validateBasket(basketLocalStorage)) { - if (_verbose) { - console.log('locally-stored basket not valid'); - } - basketLocalStorage = StoreMixinPage.makeNewBasket(); - } - var basketServer = StoreMixinPage.validateBasket(userBasket) ? userBasket : basketLocalStorage; - var basket = StoreMixinPage.areEqualBaskets(basketLocalStorage, basketServer) ? basketServer : StoreMixinPage.mergeBaskets(basketLocalStorage, basketServer); - if (!StoreMixinPage.areEqualBaskets(basketLocalStorage, basket)) { - LocalStorage.setLocalStorage(keyBasket, basket); - } - if (!StoreMixinPage.areEqualBaskets(basketServer, basket)) { - /* - let ajaxData = {} - ajaxData[keyBasket] = basket; - // console.log("hookupLocalStorageStore\nhashStoreBasketLoad: " + hashStoreBasketLoad + "\n"); - // ajaxData[keyIsIncludedVAT] = LocalStorage.getLocalStorage(keyIsIncludedVAT); - console.log('ajax:' + ajaxData); - ajaxJSONData(keyBasket, mapHashToController(hashStoreBasketLoad), ajaxData, loadBasket, false); - */ - API.saveStoreBasket(basket); - } - userBasket = basket; - } - }, { - key: "hookupBasket", - value: function hookupBasket() { - // const containerBasket = document.querySelectorAll(idContainerBasket); - this.toggleShowButtonCheckout(); // containerBasket - this.hookupButtonCheckout(); - this.hookupBasketItemPlusAndMinusButtons(); - this.hookupBasketAddInputs(); - this.hookupBasketEditInputs(); - this.hookupDeleteBasketItemButtons(); - } - }, { - key: "toggleShowButtonCheckout", - value: function toggleShowButtonCheckout() { - if (_verbose) { - console.log("toggling checkout button"); - } - var buttonCheckout = document.querySelectorAll(idButtonCheckout); - var labelBasketEmpty = document.querySelectorAll(idLabelBasketEmpty); - if (userBasket['items'].length == 0) { - buttonCheckout.style.display = "none"; - labelBasketEmpty.style.display = ""; - } else { - buttonCheckout.style.display = ""; - labelBasketEmpty.style.display = "none"; - } - } - }, { - key: "hookupButtonCheckout", - value: function hookupButtonCheckout() { - if (_verbose) { - console.log("hooking up checkout button"); - } - var buttonCheckout = document.querySelectorAll(idButtonCheckout); - // let lsPage = getPageLocalStorage(hashPageCurrent); - Events.initialiseEventHandler(buttonCheckout, flagInitialised, function () { - buttonCheckout.addEventListener("click", function () { - /* - //setupPageLocalStorageNext(hashPageStoreBasket); - let basket = LocalStorage.getLocalStorage(keyBasket); - // goToPage(hashPageStoreBasket); - let ajaxData = {}; - ajaxData[keyBasket] = basket; - ajaxJSONData('checkout', mapHashToController(hashPageStoreBasket), ajaxData, null, false); - */ - this.router.navigateToHash(hashPageStoreBasket); - }); - }); - } - }, { - key: "hookupBasketItemPlusAndMinusButtons", - value: function hookupBasketItemPlusAndMinusButtons() { - var minVal = 1; - var basket = document.querySelector(idFormBasket); - // Basket Add - // Increment - basket.querySelectorAll('div.btn-increment[' + attrFormType + '=' + typeFormBasketAdd + ']').each(function () { - var elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function () { - elButton.addEventListener("click", function (event) { - event.preventDefault(); - event.stopPropagation(); - var elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketAdd, elButton)).querySelector('input[type="number"]'); - // console.log('input selector ='); console.log('form[' + attrFormType + '=' + elButton.getAttribute(attrFormType) + '][' + attrIdProduct + '=' + elButton.getAttribute(attrIdProduct) + ']'); - var newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal += 1; - elInput.val(newVal); - }); - }); - }); - // Decrement - basket.querySelectorAll('div.btn-decrement[' + attrFormType + '=' + typeFormBasketAdd + ']').each(function () { - var elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function () { - elButton.addEventListener("click", function (event) { - event.preventDefault(); - event.stopPropagation(); - // let product = document.querySelectorAll('.card.subcard[' + attrIdProduct +'=' + elButton.getAttribute(attrIdProduct) + ']'); - var elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketAdd, elButton)).querySelector('input[type="number"]'); - var newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal = Math.max(minVal, newVal - 1); - elInput.val(newVal); - }); - }); - }); - - // Basket Edit - // Increment - basket.querySelectorAll('div.btn-increment[' + attrFormType + '=' + typeFormBasketEdit + ']').each(function () { - var elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function () { - elButton.addEventListener("click", function (event) { - event.stopPropagation(); - // basketItem = document.querySelectorAll('.card.subcard[' + attrIdProduct +'=' + elButton.getAttribute(attrIdProduct) + ']'); - var elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketEdit, elButton)).querySelector('input[type="number"]'); - // console.log('input selector ='); console.log('form[' + attrFormType + '=' + elButton.getAttribute(attrFormType) + '][' + attrIdProduct + '=' + elButton.getAttribute(attrIdProduct) + ']'); - var newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal += 1; - elInput.val(newVal); - elInput.trigger("change"); - }); - }); - }); - // Decrement - basket.querySelectorAll('div.btn-decrement[' + attrFormType + '=' + typeFormBasketEdit + ']').each(function () { - var elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function () { - elButton.addEventListener("click", function (event) { - event.stopPropagation(); - var elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketEdit, elButton)).querySelector('input[type="number"]'); - var newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal = Math.max(minVal, newVal - 1); - elInput.val(newVal); - elInput.trigger("change"); - }); - }); - }); - } - }, { - key: "hookupBasketAddForms", - value: function hookupBasketAddForms() { - var basketAddFormSelector = 'form[' + attrFormType + '=' + typeFormBasketAdd + ']'; - Events.initialiseEventHandler(basketAddFormSelector, flagInitialised, function (basketAddForm) { - var quantityInput = basketAddForm.querySelector('input[type="number"]'); - quantityInput.addEventListener("change", function (event) { - var newVal = parseInt(quantityInput.value); - if (isNaN(newVal) || newVal < 0) { - quantityInput.value = 0; - } - }); - var buttonSubmit = basketAddForm.querySelector('button'); // [type="submit"] - buttonSubmit.addEventListener("click", function (event) { - event.preventDefault(); - event.stopPropagation(); - var newBasketItem = {}; - newBasketItem[keyIdProductPermutation] = basketAddForm.getAttribute(attrIdPermutation); - newBasketItem[keyQuantity] = quantityInput.value; - API.storeAddToBasket(newBasketItem); - }); - }); - } - }, { - key: "hookupBasketEditForms", - value: function hookupBasketEditForms() { - var basketEditFormSelector = 'form[' + attrFormType + '=' + typeFormBasketEdit + ']'; - Events.initialiseEventHandler(basketEditFormSelector, flagInitialised, function (basketEditForm) { - var quantityInput = basketEditForm.querySelector('input[type="number"]'); - quantityInput.addEventListener("change", function (event) { - var newVal = parseInt(quantityInput.value); - if (isNaN(newVal) || newVal < 0) { - quantityInput.value = 0; - } - if (quantityInput.value != basketEditForm.getAttribute(attrQuantity)) { - var newBasketItem = {}; - newBasketItem[keyIdProductPermutation] = basketEditForm.getAttribute(attrIdPermutation); - newBasketItem[keyQuantity] = quantityInput.value; - API.storeSaveBasket(newBasketItem); - } - }); - var deleteButton = basketEditForm.querySelector('button'); // [type="button"] - deleteButton.addEventListener("click", function (event) { - event.preventDefault(); - event.stopPropagation(); - API.storeDeleteBasketItem(basketEditForm.getAttribute(attrIdPermutation)); - }); - }); - } - }, { - key: "loadBasket", - value: function loadBasket(response) { - userBasket = response.data[keyBasket]; - var basketForm = document.querySelectorAll(idFormBasket); - /* - basketForm.replaceChildren(); - let items = userBasket[keyItems]; - let basketItem; - items.forEach(item => { - basketItem = document.createElement('div'); - basketForm.appendChild(basketItem); - }); - */ - var htmlBlock = response.data[keyHtmlBlock]; - basketForm.innerHTML = htmlBlock; - this.hookupBasket(); - } - }, { - key: "getCurrencySelected", - value: function getCurrencySelected() { - var elementSelectorCurrency = document.querySelectorAll(idSelectorCurrency); - var selectedCurrency = elementSelectorCurrency.val(); - if (_verbose) { - console.log("selected currency: ", selectedCurrency); - } - return selectedCurrency; - } - }, { - key: "hookupStoreCardsProduct", - value: function hookupStoreCardsProduct() { - var d; // , lsShared; - var selectorCardProduct = '.card.subcard'; - Events.initialiseEventHandler(selectorCardProduct, flagInitialised, function (cardProduct) { - if (_verbose) { - console.log("initialising product card: ", cardProduct); - } - cardProduct.addEventListener("click", function (event) { - // d = { keyIdProduct: product.getAttribute(attrIdProduct) } - var elemClicked = event.target; - if (elemClicked.id != 'submit') { - // disable for submit buttons - if (_verbose) { - console.log("product click: " + cardProduct.getAttribute(attrIdProduct)); - console.log("permutation click: " + cardProduct.getAttribute(attrIdPermutation)); - } - var d = {}; - d[keyIdProduct] = cardProduct.getAttribute(attrIdProduct); - d[keyIdPermutation] = cardProduct.getAttribute(attrIdPermutation); - // send quantity requested - goToPage(hashPageStoreProduct, d); - } - }); - if (_verbose) { - console.log("click method added for product ID: " + cardProduct.getAttribute(attrIdProduct) + ', permutation ID: ', cardProduct.getAttribute(attrIdPermutation)); - } - }); - } - }, { - key: "leave", - value: function leave() {} - - /* - getFormProductSelector(typeForm, elementInForm) { - idPermutation = elementInForm.getAttribute(attrIdPermutation); - console.log('idPermutation: ', idPermutation); - hasPermutation = !Validation.isEmpty(idPermutation); - console.log('has permutation: ', hasPermutation); - selectorIdPermutation = hasPermutation ? '[' + attrIdPermutation + '=' + idPermutation + ']' : ''; - return 'form[' + attrFormType + '="' + typeForm + '"][' + attrIdProduct + '=' + elementInForm.getAttribute(attrIdProduct) + ']' + selectorIdPermutation; - } - - addMetadataBasketToJSON(jsonData) { - jsonData[keyIdCurrency] = LocalStorage.getLocalStorage(keyIdCurrency); - jsonData[keyIdRegionDelivery] = LocalStorage.getLocalStorage(keyIdRegionDelivery); - jsonData[keyIsIncludedVAT] = LocalStorage.getLocalStorage(keyIsIncludedVAT); - return jsonData; - } - */ - - /* - loadFiltersFromLocalStorage(pageHash, parameters_dict) { - - let lsOld = getPageLocalStorage(pageHashCurrent); - pageHashCurrent = pageHash; - clearPageLocalStorage(pageHashCurrent); - setupPageLocalStorage(pageHashCurrent); - let lsNew = getPageLocalStorage(pageHashCurrent); - lsNew[keyBasket] = (keyBasket in lsOld) ? lsOld[keyBasket] : {'items': []}; - setPageLocalStorage(pageHashCurrent, lsNew); - - goToPage(pageHash, parameters_dict); - } - */ - }], [{ - key: "validateBasket", - value: function validateBasket(basket) { - return validation_Validation.isEmpty(basket) && validation_Validation.dictHasKey(basket, keyItems) && validation_Validation.dictHasKey(basket, keyIsIncludedVAT) && validation_Validation.dictHasKey(basket, keyIdCurrency) && validation_Validation.dictHasKey(basket, keyIdRegionDelivery); - } - }, { - key: "makeNewBasket", - value: function makeNewBasket() { - return mixin_defineProperty(mixin_defineProperty(mixin_defineProperty(mixin_defineProperty({}, keyItems, []), keyIsIncludedVAT, true), keyIdCurrency, 1), keyIdRegionDelivery, 1); - } - }, { - key: "areEqualBaskets", - value: function areEqualBaskets(basket1, basket2) { - return JSON.stringify(basket1) === JSON.stringify(basket2); - } - }, { - key: "mergeBaskets", - value: function mergeBaskets(basketPrimary, basketSecondary) { - var basket = mixin_objectSpread(mixin_objectSpread({}, basketSecondary), basketPrimary); - var items = {}; - var _iterator = mixin_createForOfIteratorHelper(basketSecondary[keyItems]), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var item = _step.value; - items[item[keyIdPermutation]] = item.Quantity; - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - var _iterator2 = mixin_createForOfIteratorHelper(basketPrimary[keyItems]), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var _item = _step2.value; - items[_item[keyIdPermutation]] = items[_item[keyIdPermutation]] ? items[_item[keyIdPermutation]] + _item.Quantity : _item.Quantity; - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - basket[keyItems] = Object.values(items); - return basket; - } - }]); -}(); - -;// CONCATENATED MODULE: ./static/js/pages/store/mixin_table.js -function mixin_table_typeof(o) { "@babel/helpers - typeof"; return mixin_table_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, mixin_table_typeof(o); } -function mixin_table_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function mixin_table_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, mixin_table_toPropertyKey(o.key), o); } } -function mixin_table_createClass(e, r, t) { return r && mixin_table_defineProperties(e.prototype, r), t && mixin_table_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function mixin_table_toPropertyKey(t) { var i = mixin_table_toPrimitive(t, "string"); return "symbol" == mixin_table_typeof(i) ? i : i + ""; } -function mixin_table_toPrimitive(t, r) { if ("object" != mixin_table_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != mixin_table_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } -function mixin_table_callSuper(t, o, e) { return o = mixin_table_getPrototypeOf(o), mixin_table_possibleConstructorReturn(t, mixin_table_isNativeReflectConstruct() ? Reflect.construct(o, e || [], mixin_table_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function mixin_table_possibleConstructorReturn(t, e) { if (e && ("object" == mixin_table_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return mixin_table_assertThisInitialized(t); } -function mixin_table_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function mixin_table_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (mixin_table_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function mixin_table_superPropGet(t, e, o, r) { var p = mixin_table_get(mixin_table_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function mixin_table_get() { return mixin_table_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = mixin_table_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, mixin_table_get.apply(null, arguments); } -function mixin_table_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = mixin_table_getPrototypeOf(t));); return t; } -function mixin_table_getPrototypeOf(t) { return mixin_table_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, mixin_table_getPrototypeOf(t); } -function mixin_table_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && mixin_table_setPrototypeOf(t, e); } -function mixin_table_setPrototypeOf(t, e) { return mixin_table_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, mixin_table_setPrototypeOf(t, e); } - - - -// import BasePage from "../base.js"; - - - -var StoreTableMixinPage = /*#__PURE__*/function (_StoreMixinPage) { - function StoreTableMixinPage(pageCurrent) { - mixin_table_classCallCheck(this, StoreTableMixinPage); - return mixin_table_callSuper(this, StoreTableMixinPage, [pageCurrent]); - } - mixin_table_inherits(StoreTableMixinPage, _StoreMixinPage); - return mixin_table_createClass(StoreTableMixinPage, [{ - key: "initialize", - value: function initialize() { - mixin_table_superPropGet(StoreTableMixinPage, "initialize", this, 3)([]); - this.hookupFilters(); - this.hookupTable(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - // Implement filter-specific functionality here - } - }, { - key: "hookupTable", - value: function hookupTable() { - // Implement table-specific functionality here - } - }]); -}(StoreMixinPage); - -;// CONCATENATED MODULE: ./static/js/pages/store/manufacturing_purchase_orders.js -function manufacturing_purchase_orders_typeof(o) { "@babel/helpers - typeof"; return manufacturing_purchase_orders_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, manufacturing_purchase_orders_typeof(o); } -function manufacturing_purchase_orders_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function manufacturing_purchase_orders_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, manufacturing_purchase_orders_toPropertyKey(o.key), o); } } -function manufacturing_purchase_orders_createClass(e, r, t) { return r && manufacturing_purchase_orders_defineProperties(e.prototype, r), t && manufacturing_purchase_orders_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function manufacturing_purchase_orders_callSuper(t, o, e) { return o = manufacturing_purchase_orders_getPrototypeOf(o), manufacturing_purchase_orders_possibleConstructorReturn(t, manufacturing_purchase_orders_isNativeReflectConstruct() ? Reflect.construct(o, e || [], manufacturing_purchase_orders_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function manufacturing_purchase_orders_possibleConstructorReturn(t, e) { if (e && ("object" == manufacturing_purchase_orders_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return manufacturing_purchase_orders_assertThisInitialized(t); } -function manufacturing_purchase_orders_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function manufacturing_purchase_orders_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (manufacturing_purchase_orders_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function manufacturing_purchase_orders_superPropGet(t, e, o, r) { var p = manufacturing_purchase_orders_get(manufacturing_purchase_orders_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function manufacturing_purchase_orders_get() { return manufacturing_purchase_orders_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = manufacturing_purchase_orders_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, manufacturing_purchase_orders_get.apply(null, arguments); } -function manufacturing_purchase_orders_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = manufacturing_purchase_orders_getPrototypeOf(t));); return t; } -function manufacturing_purchase_orders_getPrototypeOf(t) { return manufacturing_purchase_orders_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, manufacturing_purchase_orders_getPrototypeOf(t); } -function manufacturing_purchase_orders_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && manufacturing_purchase_orders_setPrototypeOf(t, e); } -function manufacturing_purchase_orders_setPrototypeOf(t, e) { return manufacturing_purchase_orders_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, manufacturing_purchase_orders_setPrototypeOf(t, e); } -function manufacturing_purchase_orders_defineProperty(e, r, t) { return (r = manufacturing_purchase_orders_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function manufacturing_purchase_orders_toPropertyKey(t) { var i = manufacturing_purchase_orders_toPrimitive(t, "string"); return "symbol" == manufacturing_purchase_orders_typeof(i) ? i : i + ""; } -function manufacturing_purchase_orders_toPrimitive(t, r) { if ("object" != manufacturing_purchase_orders_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != manufacturing_purchase_orders_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - - -var PageStoreManufacturingPurchaseOrders = /*#__PURE__*/function (_TableBasePage) { - function PageStoreManufacturingPurchaseOrders(router) { - var _this; - manufacturing_purchase_orders_classCallCheck(this, PageStoreManufacturingPurchaseOrders); - _this = manufacturing_purchase_orders_callSuper(this, PageStoreManufacturingPurchaseOrders, [router]); - manufacturing_purchase_orders_defineProperty(_this, "callSaveTableContent", api_API.saveManufacturingPurchaseOrders); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - manufacturing_purchase_orders_inherits(PageStoreManufacturingPurchaseOrders, _TableBasePage); - return manufacturing_purchase_orders_createClass(PageStoreManufacturingPurchaseOrders, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) {} - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - var _this2 = this; - if (row == null) return; - var tdCurrency = row.querySelector('td.' + flagCurrency); - var inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - var inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - var inputPriceTotalLocalVatExcl = row.querySelector('td.' + flagPriceTotalLocalVatExcl + ' input'); - var inputPriceTotalLocalVatIncl = row.querySelector('td.' + flagPriceTotalLocalVatIncl + ' input'); - var trsPurchaseOrderItem = row.querySelectorAll('tr.' + flagOrderItems); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdManufacturingPurchaseOrder] = row.getAttribute(attrIdManufacturingPurchaseOrder); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - jsonRow[flagPriceTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatExcl); - jsonRow[flagPriceTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatIncl); - var orderItems = []; - if (trsPurchaseOrderItem != null) { - trsPurchaseOrderItem.forEach(function (tr) { - orderItems.push(_this2.getJsonRowOrderItem(tr)); - }); - } - jsonRow[flagOrderItems] = orderItems; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "getJsonRowOrderItem", - value: function getJsonRowOrderItem(tr) { - var inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - var tdCategory = tr.querySelector('td.' + flagProductCategory); - var tdProduct = tr.querySelector('td.' + flagProduct); - var tdVariations = tr.querySelector('td.' + flagProductVariations); - var tdUnitQuantity = tr.querySelector('td.' + flagUnitMeasurementQuantity); - var inputQuantityUsed = tr.querySelector('td.' + flagQuantityUsed + ' input'); - var inputQuantityProduced = tr.querySelector('td.' + flagQuantityProduced + ' input'); - var tdUnitMeasurementLatencyManufacture = tr.querySelector('td.' + flagUnitMeasurementLatencyManufacture); - var inputLatencyManufacture = tr.querySelector('td.' + flagLatencyManufacture + ' input'); - var buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdManufacturingPurchaseOrder] = tr.getAttribute(attrIdManufacturingPurchaseOrder); - jsonRow[attrIdManufacturingPurchaseOrderProductLink] = tr.getAttribute(attrIdManufacturingPurchaseOrderProductLink); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdVariations); - jsonRow[attrIdUnitMeasurementQuantity] = DOM.getElementAttributeValueCurrent(tdUnitQuantity); - jsonRow[flagQuantityUsed] = DOM.getElementAttributeValueCurrent(inputQuantityUsed); - jsonRow[flagQuantityProduced] = DOM.getElementAttributeValueCurrent(inputQuantityProduced); - jsonRow[attrIdUnitMeasurementLatencyManufacture] = DOM.getElementAttributeValueCurrent(tdUnitMeasurementLatencyManufacture); - jsonRow[flagLatencyManufacture] = DOM.getElementAttributeValueCurrent(inputLatencyManufacture); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - manufacturing_purchase_orders_superPropGet(PageStoreManufacturingPurchaseOrders, "initialiseRowNew", this, 3)([tbody, row]); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - manufacturing_purchase_orders_superPropGet(PageStoreManufacturingPurchaseOrders, "hookupTableMain", this, 3)([]); - this.hookupCurrencyFields(); - this.hookupCostAndPriceInputs(); - this.hookupOrderItemsFields(); - this.hookupFieldsActive(); - } - }, { - key: "hookupCostAndPriceInputs", - value: function hookupCostAndPriceInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatIncl + ' input'); - } - }, { - key: "hookupOrderItemsFields", - value: function hookupOrderItemsFields() { - this.hookupOrderItemsPreviews(); - this.hookupFieldsOrderItemDisplayOrder(); - this.hookupFieldsOrderItemProductCategory(); - this.hookupFieldsOrderItemProduct(); - this.hookupFieldsOrderItemProductVariations(); - this.hookupFieldsOrderItemUnitQuantity(); - this.hookupFieldsOrderItemQuantityUsed(); - this.hookupFieldsOrderItemQuantityProduced(); - this.hookupFieldsOrderItemUnitMeasurementLatencyManufacture(); - this.hookupFieldsOrderItemLatencyManufacture(); - this.hookupFieldsOrderItemActive(); - this.hookupFieldsOrderItemAddDelete(); - this.hookupButtonsOrderItemAdd(); - } - }, { - key: "hookupOrderItemsPreviews", - value: function hookupOrderItemsPreviews() { - var _this3 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems, function (event, td) { - if (!td.classList.contains(flagCollapsed)) return; - _this3.handleClickOrderItemsPreview(event, td); - }); - } - }, { - key: "handleClickOrderItemsPreview", - value: function handleClickOrderItemsPreview(event, element) { - var _this4 = this; - if (_verbose) { - console.log("click order items preview"); - } - this.toggleColumnHeaderCollapsed(flagOrderItems, false); - element.classList.remove(flagCollapsed); - var row = DOM.getRowFromElement(element); - var idManufacturingPurchaseOrder = row.getAttribute(attrIdManufacturingPurchaseOrder); - var manufacturingPurchaseOrder = idManufacturingPurchaseOrder > 0 ? manufacturingPurchaseOrders[idManufacturingPurchaseOrder] : manufacturing_purchase_orders_defineProperty({}, flagOrderItems, []); - var tblOrderItems = document.createElement("table"); - tblOrderItems.classList.add(flagOrderItems); - var thead = document.createElement("thead"); - var tr = document.createElement("tr"); - var thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - var thCategory = document.createElement("th"); - thCategory.classList.add(flagProductCategory); - thCategory.textContent = 'Category'; - var thProduct = document.createElement("th"); - thProduct.classList.add(flagProduct); - thProduct.textContent = 'Product'; - var thVariations = document.createElement("th"); - thVariations.classList.add(flagProductVariations); - thVariations.classList.add(flagCollapsed); - thVariations.textContent = 'Variations'; - var thUnitQuantity = document.createElement("th"); - thUnitQuantity.classList.add(flagUnitMeasurementQuantity); - thUnitQuantity.textContent = 'Unit Quantity'; - var thQuantityUsed = document.createElement("th"); - thQuantityUsed.classList.add(flagQuantityUsed); - thQuantityUsed.textContent = 'Quantity Used'; - var thQuantityProduced = document.createElement("th"); - thQuantityProduced.classList.add(flagQuantityProduced); - thQuantityProduced.textContent = 'Quantity Produced'; - /* - let thCostTotalLocalVatExcl = document.createElement("th"); - thCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - thCostTotalLocalVatExcl.textContent = 'Cost Total Local VAT Excl'; - let thCostTotalLocalVatIncl = document.createElement("th"); - thCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - thCostTotalLocalVatIncl.textContent = 'Cost Total Local VAT Incl'; - let thCostUnitLocalVatExcl = document.createElement("th"); - thCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - thCostUnitLocalVatExcl.textContent = 'Cost Unit Local VAT Excl'; - let thCostUnitLocalVatIncl = document.createElement("th"); - thCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - thCostUnitLocalVatIncl.textContent = 'Cost Unit Local VAT Incl'; - */ - var thUnitMeasurementLatencyManufacture = document.createElement("th"); - thUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - thUnitMeasurementLatencyManufacture.textContent = 'Unit Measurement Latency Manufacture'; - var thLatencyManufacture = document.createElement("th"); - thLatencyManufacture.classList.add(flagLatencyManufacture); - thLatencyManufacture.textContent = 'Latency Manufacture'; - var thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - var thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - tr.appendChild(thDisplayOrder); - tr.appendChild(thCategory); - tr.appendChild(thProduct); - tr.appendChild(thVariations); - tr.appendChild(thUnitQuantity); - tr.appendChild(thQuantityUsed); - tr.appendChild(thQuantityProduced); - /* - tr.appendChild(thCostTotalLocalVatExcl); - tr.appendChild(thCostTotalLocalVatIncl); - tr.appendChild(thCostUnitLocalVatExcl); - tr.appendChild(thCostUnitLocalVatIncl); - */ - tr.appendChild(thUnitMeasurementLatencyManufacture); - tr.appendChild(thLatencyManufacture); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblOrderItems.appendChild(thead); - var tbody = document.createElement("tbody"); - manufacturingPurchaseOrder[flagOrderItems].forEach(function (orderItem, index) { - _this4.addRowManufacturingPurchaseOrderItem(tbody, orderItem); - }); - tblOrderItems.appendChild(tbody); - var cell = DOM.getCellFromElement(element); - var cellNew = cell.cloneNode(false); - cellNew.appendChild(tblOrderItems); - row.replaceChild(cellNew, cell); - if (_verbose) { - console.log("tblOrderItems: ", tblOrderItems); - } - this.hookupOrderItemsFields(); - } - }, { - key: "addRowManufacturingPurchaseOrderItem", - value: function addRowManufacturingPurchaseOrderItem(tbody, orderItem) { - // productVariationTypeOptions, productVariationOptions, productCategoryOptions, productOptions, unitMeasurementOptions, - if (_verbose) { - console.log("addRowManufacturingPurchaseOrderItem: ", orderItem); - } - var tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - var inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, orderItem[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - var tdCategory = document.createElement("td"); - tdCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCategory, orderItem[attrIdProductCategory]); - var divCategory = document.createElement("div"); - divCategory.classList.add(flagProductCategory); - // DOM.setElementAttributesValuesCurrentAndPrevious(divCategory, orderItem[attrIdProductCategory]); - var productCategory = productCategories[orderItem[attrIdProductCategory]]; - divCategory.textContent = BusinessObjects.getObjectText(productCategory); - tdCategory.appendChild(divCategory); - var tdProduct = document.createElement("td"); - tdProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(tdProduct, orderItem[attrIdProductCategory]); - var divProduct = document.createElement("div"); - divProduct.classList.add(flagProduct); - // DOM.setElementAttributesValuesCurrentAndPrevious(divProduct, orderItem[attrIdProduct]); - var product = products[orderItem[attrIdProduct]]; - divProduct.textContent = BusinessObjects.getObjectText(product); - tdProduct.appendChild(divProduct); - var tdVariations = document.createElement("td"); - tdVariations.classList.add(flagProductVariations); - tdVariations.classList.add(flagCollapsed); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariations, orderItem[attrIdProductCategory]); - var divVariations = document.createElement("div"); - divVariations.classList.add(flagProductVariations); - // DOM.setElementAttributesValuesCurrentAndPrevious(divVariations, orderItem[attrIdProductVariation]); - var variationsText = ProductPermutation.getProductVariationsPreviewFromIdCsv(orderItem[flagProductVariations]); - divVariations.textContent = variationsText; - tdVariations.appendChild(divVariations); - var tdUnitQuantity = document.createElement("td"); - tdUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitQuantity, orderItem[attrIdProductCategory]); - var divUnitQuantity = document.createElement("div"); - divUnitQuantity.classList.add(flagUnitMeasurementQuantity); - // DOM.setElementValuesCurrentAndPrevious(divUnitQuantity, orderItem[flagUnitMeasurementQuantity]); - var unitQuantity = unitMeasurements[orderItem[attrIdUnitMeasurementQuantity]]; - divUnitQuantity.textContent = BusinessObjects.getObjectText(unitQuantity); - tdUnitQuantity.appendChild(divUnitQuantity); - var tdQuantityUsed = document.createElement("td"); - tdQuantityUsed.classList.add(flagQuantityUsed); - var inputQuantityUsed = document.createElement("input"); - inputQuantityUsed.classList.add(flagQuantityUsed); - inputQuantityUsed.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityUsed, orderItem[flagQuantityUsed]); - tdQuantityUsed.appendChild(inputQuantityUsed); - var tdQuantityProduced = document.createElement("td"); - tdQuantityProduced.classList.add(flagQuantityProduced); - var inputQuantityProduced = document.createElement("input"); - inputQuantityProduced.classList.add(flagQuantityProduced); - inputQuantityProduced.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityProduced, orderItem[flagQuantityProduced]); - tdQuantityProduced.appendChild(inputQuantityProduced); - - /* - let tdCostTotalLocalVatExcl = document.createElement("td"); - tdCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - let inputCostTotalLocalVatExcl = document.createElement("input"); - inputCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - inputCostTotalLocalVatExcl.type = 'number'; - inputCostTotalLocalVatExcl.step = 0.01; - DOM.setElementAttributesValuesCurrentAndPrevious(inputCostTotalLocalVatExcl, orderItem[flagCostTotalLocalVatExcl]); - tdCostTotalLocalVatExcl.appendChild(inputCostTotalLocalVatExcl); - let tdCostTotalLocalVatIncl = document.createElement("td"); - tdCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - let inputCostTotalLocalVatIncl = document.createElement("input"); - inputCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - inputCostTotalLocalVatIncl.type = 'number'; - inputCostTotalLocalVatIncl.step = 0.01; - DOM.setElementAttributesValuesCurrentAndPrevious(inputCostTotalLocalVatIncl, orderItem[flagCostTotalLocalVatIncl]); - tdCostTotalLocalVatIncl.appendChild(inputCostTotalLocalVatIncl); - let tdCostUnitLocalVatExcl = document.createElement("td"); - tdCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - let divCostUnitLocalVatExcl = document.createElement("div"); - divCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, orderItem[flagCostUnitLocalVatExcl]); - tdCostUnitLocalVatExcl.appendChild(divCostUnitLocalVatExcl); - let tdCostUnitLocalVatIncl = document.createElement("td"); - tdCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - let divCostUnitLocalVatIncl = document.createElement("div"); - divCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, orderItem[flagCostUnitLocalVatIncl]); - tdCostUnitLocalVatIncl.appendChild(divCostUnitLocalVatIncl); - */ - - var tdUnitMeasurementLatencyManufacture = document.createElement("td"); - tdUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitMeasurementLatencyManufacture, orderItem[attrIdUnitMeasurementLatencyManufacture]); - var divUnitMeasurementLatencyManufacture = document.createElement("div"); - divUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - // DOM.setElementValuesCurrentAndPrevious(divUnitMeasurementLatencyManufacture, orderItem[flagUnitMeasurementLatencyManufacture]); - var unitMeasurementLatencyManufacture = unitMeasurementsTime[orderItem[attrIdUnitMeasurementLatencyManufacture]]; - divUnitMeasurementLatencyManufacture.textContent = BusinessObjects.getObjectText(unitMeasurementLatencyManufacture); - tdUnitMeasurementLatencyManufacture.appendChild(divUnitMeasurementLatencyManufacture); - var tdLatencyManufacture = document.createElement("td"); - tdLatencyManufacture.classList.add(flagLatencyManufacture); - var inputLatencyManufacture = document.createElement("input"); - inputLatencyManufacture.classList.add(flagLatencyManufacture); - inputLatencyManufacture.type = 'number'; - inputLatencyManufacture.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputLatencyManufacture, orderItem[flagLatencyManufacture]); - tdLatencyManufacture.appendChild(inputLatencyManufacture); - var tdActive = this.createTdActive(orderItem[flagActive]); - var tr = document.createElement("tr"); - tr.classList.add(flagOrderItems); - tr.setAttribute(attrIdManufacturingPurchaseOrder, orderItem[attrIdManufacturingPurchaseOrder]); - tr.setAttribute(attrIdManufacturingPurchaseOrderProductLink, orderItem[attrIdManufacturingPurchaseOrderProductLink]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCategory); - tr.appendChild(tdProduct); - tr.appendChild(tdVariations); - tr.appendChild(tdUnitQuantity); - tr.appendChild(tdQuantityUsed); - tr.appendChild(tdQuantityProduced); - /* - tr.appendChild(tdCostTotalLocalVatExcl); - tr.appendChild(tdCostTotalLocalVatIncl); - tr.appendChild(tdCostUnitLocalVatExcl); - tr.appendChild(tdCostUnitLocalVatIncl); - */ - tr.appendChild(tdUnitMeasurementLatencyManufacture); - tr.appendChild(tdLatencyManufacture); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - }, { - key: "hookupFieldsOrderItemDisplayOrder", - value: function hookupFieldsOrderItemDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagDisplayOrder + ' input'); - } - }, { - key: "hookupFieldsOrderItemProductCategory", - value: function hookupFieldsOrderItemProductCategory() { - var _this5 = this; - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductCategory, Utils.getListFromDict(productCategories), function (cellSelector) { - _this5.hookupProductCategoryDdls(cellSelector); - }); - } - }, { - key: "hookupFieldsOrderItemProduct", - value: function hookupFieldsOrderItemProduct() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - }, { - key: "hookupFieldsOrderItemProductVariations", - value: function hookupFieldsOrderItemProductVariations() { - var _this6 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductVariations, function (event, element) { - return _this6.handleClickProductPermutationVariationsPreview(event, element); - }); - } - }, { - key: "hookupFieldsOrderItemUnitQuantity", - value: function hookupFieldsOrderItemUnitQuantity() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementQuantity, Utils.getListFromDict(unitMeasurements)); - } - }, { - key: "hookupFieldsOrderItemQuantityUsed", - value: function hookupFieldsOrderItemQuantityUsed() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityUsed + ' input'); - } - }, { - key: "hookupFieldsOrderItemQuantityProduced", - value: function hookupFieldsOrderItemQuantityProduced() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityProduced + ' input'); - } - /* - hookupFieldsOrderItemPriceTotalLocalVatExcl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatExcl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - this.updateFieldsPriceUnitLocalVatExcl(element); - } - ); - } - hookupFieldsOrderItemPriceTotalLocalVatIncl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatIncl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - this.updateFieldsPriceUnitLocalVatIncl(element); - } - ); - } - updateFieldsPriceUnitLocalVatExcl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputPriceTotalLocalVatExcl = row.querySelector('td.' + flagPriceTotalLocalVatExcl + ' input'); - let priceTotalLocalVatExcl = DOM.getElementValueCurrent(inputPriceTotalLocalVatExcl); - let inputQuantityUsed = row.querySelector('td.' + flagQuantityUsed + ' input'); - let quantityUsed = DOM.getElementValueCurrent(inputQuantityUsed); - let divPriceUnitLocalVatExcl = row.querySelector('td.' + flagPriceUnitLocalVatExcl + ' div'); - let priceUnitLocalVatExcl = quantityUsed == 0 ? 0 : priceTotalLocalVatExcl / quantityUsed; - DOM.setElementValuesCurrentAndPrevious(divPriceUnitLocalVatExcl, priceUnitLocalVatExcl); - let rowManufacturingPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divPriceGrandTotalLocalVatExcl = rowManufacturingPurchaseOrder.querySelector('td.' + flagPriceTotalLocalVatExcl + ' div'); - let inputsPriceTotalLocalVatExcl = rowManufacturingPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatExcl + ' input'); - let priceGrandTotalLocalVatExcl = Array.from(inputsPriceTotalLocalVatExcl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divPriceGrandTotalLocalVatExcl, priceGrandTotalLocalVatExcl); - } - updateFieldsPriceUnitLocalVatIncl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputPriceTotalLocalVatIncl = row.querySelector('td.' + flagPriceTotalLocalVatIncl + ' input'); - let priceTotalLocalVatIncl = DOM.getElementValueCurrent(inputPriceTotalLocalVatIncl); - let inputQuantityUsed = row.querySelector('td.' + flagQuantityUsed + ' input'); - let quantityUsed = DOM.getElementValueCurrent(inputQuantityUsed); - let divPriceUnitLocalVatIncl = row.querySelector('td.' + flagPriceUnitLocalVatIncl + ' div'); - let priceUnitLocalVatIncl = quantityUsed == 0 ? 0 : priceTotalLocalVatIncl / quantityUsed; - DOM.setElementValuesCurrentAndPrevious(divPriceUnitLocalVatIncl, priceUnitLocalVatIncl); - let rowManufacturingPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divPriceGrandTotalLocalVatIncl = rowManufacturingPurchaseOrder.querySelector('td.' + flagPriceTotalLocalVatIncl + ' div'); - let inputsPriceTotalLocalVatIncl = rowManufacturingPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatIncl + ' input'); - let priceGrandTotalLocalVatIncl = Array.from(inputsPriceTotalLocalVatIncl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divPriceGrandTotalLocalVatIncl, priceGrandTotalLocalVatIncl); - } - hookupFieldsOrderItemPriceUnitLocalVatExcl() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceUnitLocalVatExcl + ' input'); - } - hookupFieldsOrderItemPriceUnitLocalVatIncl() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceUnitLocalVatIncl + ' input'); - } - */ - }, { - key: "hookupFieldsOrderItemUnitMeasurementLatencyManufacture", - value: function hookupFieldsOrderItemUnitMeasurementLatencyManufacture() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementLatencyManufacture, Utils.getListFromDict(unitMeasurementsTime)); - } - }, { - key: "hookupFieldsOrderItemLatencyManufacture", - value: function hookupFieldsOrderItemLatencyManufacture() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagLatencyManufacture + ' input'); - } - }, { - key: "hookupFieldsOrderItemActive", - value: function hookupFieldsOrderItemActive() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' input.' + flagActive); - } - }, { - key: "hookupFieldsOrderItemAddDelete", - value: function hookupFieldsOrderItemAddDelete() { - var selectorButton = idTableMain + ' td.' + flagOrderItems + ' td.' + flagOrderItems + ' button'; - var selectorButtonDelete = selectorButton + '.' + flagDelete; - var selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsOrderItemAdd(); - } - }, { - key: "hookupButtonsOrderItemAdd", - value: function hookupButtonsOrderItemAdd() { - var _this7 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' th button.' + flagAdd, function (event, element) { - var _manufacturingPurchas; - var row = element.closest(idTableMain + ' > tbody > tr'); - var idManufacturingPurchaseOrder = row.getAttribute(attrIdManufacturingPurchaseOrder); - // let hasActiveOrderItem = row.querySelectorAll('td.' + flagOrderItems + ' input.' + flagActive + ':checked').length > 0; - var countManufacturingOrderItems = row.querySelectorAll('td.' + flagOrderItems + ' td.' + flagManufacturingPurchaseOrder).length; - var manufacturingPurchaseOrderItem = (_manufacturingPurchas = {}, manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(_manufacturingPurchas, attrIdManufacturingPurchaseOrder, idManufacturingPurchaseOrder), attrIdManufacturingPurchaseOrderProductLink, -1 - countManufacturingOrderItems), attrIdProductCategory, 0), attrIdProduct, 0), flagProductVariations, ''), attrIdUnitMeasurementQuantity, 0), flagQuantityUsed, ''), flagQuantityProduced, ''), attrIdUnitMeasurementLatencyManufacture, 0), flagLatencyManufacture, ''), manufacturing_purchase_orders_defineProperty(manufacturing_purchase_orders_defineProperty(_manufacturingPurchas, flagDisplayOrder, countManufacturingOrderItems + 1), flagActive, true)); - var tbody = row.querySelector('td.' + flagOrderItems + ' table tbody'); - _this7.addRowManufacturingPurchaseOrderItem(tbody, manufacturingPurchaseOrderItem); - /* - if (!hasActiveOrderItem) { - let tdOrderItem = row.querySelector('td.' + flagOrderItems); - // tdOrderItem.setAttribute(attrIdManufacturingOrderItem, manufacturingPurchaseOrderItem[attrIdManufacturingOrderItem]); - DOM.setElementAttributeValueCurrent(tdOrderItem, manufacturingPurchaseOrderItem[attrIdManufacturingOrderItem]); - } - */ - _this7.hookupOrderItemsFields(); - }); - } - }, { - key: "leave", - value: function leave() { - manufacturing_purchase_orders_superPropGet(PageStoreManufacturingPurchaseOrders, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -manufacturing_purchase_orders_defineProperty(PageStoreManufacturingPurchaseOrders, "hash", hashPageStoreManufacturingPurchaseOrders); -manufacturing_purchase_orders_defineProperty(PageStoreManufacturingPurchaseOrders, "attrIdRowObject", attrIdManufacturingPurchaseOrder); - -;// CONCATENATED MODULE: ./static/js/pages/store/product_categories.js -function product_categories_typeof(o) { "@babel/helpers - typeof"; return product_categories_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, product_categories_typeof(o); } -function product_categories_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function product_categories_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, product_categories_toPropertyKey(o.key), o); } } -function product_categories_createClass(e, r, t) { return r && product_categories_defineProperties(e.prototype, r), t && product_categories_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function product_categories_callSuper(t, o, e) { return o = product_categories_getPrototypeOf(o), product_categories_possibleConstructorReturn(t, product_categories_isNativeReflectConstruct() ? Reflect.construct(o, e || [], product_categories_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function product_categories_possibleConstructorReturn(t, e) { if (e && ("object" == product_categories_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return product_categories_assertThisInitialized(t); } -function product_categories_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function product_categories_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (product_categories_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function product_categories_superPropGet(t, e, o, r) { var p = product_categories_get(product_categories_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function product_categories_get() { return product_categories_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = product_categories_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, product_categories_get.apply(null, arguments); } -function product_categories_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = product_categories_getPrototypeOf(t));); return t; } -function product_categories_getPrototypeOf(t) { return product_categories_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, product_categories_getPrototypeOf(t); } -function product_categories_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && product_categories_setPrototypeOf(t, e); } -function product_categories_setPrototypeOf(t, e) { return product_categories_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, product_categories_setPrototypeOf(t, e); } -function product_categories_defineProperty(e, r, t) { return (r = product_categories_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function product_categories_toPropertyKey(t) { var i = product_categories_toPrimitive(t, "string"); return "symbol" == product_categories_typeof(i) ? i : i + ""; } -function product_categories_toPrimitive(t, r) { if ("object" != product_categories_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != product_categories_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - -var PageStoreProductCategories = /*#__PURE__*/function (_TableBasePage) { - function PageStoreProductCategories(router) { - var _this; - product_categories_classCallCheck(this, PageStoreProductCategories); - _this = product_categories_callSuper(this, PageStoreProductCategories, [router]); - product_categories_defineProperty(_this, "callSaveTableContent", api_API.saveCategories); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - product_categories_inherits(PageStoreProductCategories, _TableBasePage); - return product_categories_createClass(PageStoreProductCategories, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterIsNotEmpty(); - this.hookupFilterActive(); - } - }, { - key: "hookupFilterIsNotEmpty", - value: function hookupFilterIsNotEmpty() { - this.hookupEventHandler("change", idFormFilters + ' .' + flagIsNotEmpty, function (event, filter) { - PageStoreProductCategories.isDirtyFilter(filter); - }); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) { - if (rowJson == null) return; - if (_verbose) { - console.log("applying data row: ", rowJson); - } - var row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - row.classList.remove(flagInitialised); - row.querySelectorAll('.' + flagInitialised).forEach(function (element) { - element.classList.remove(flagInitialised); - }); - var sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - var textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - var textareaName = row.querySelector('td.' + flagName + ' textarea'); - var textareaDescription = row.querySelector('td.' + flagDescription + ' textarea'); - var tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - var divAccessLevel = tdAccessLevel.querySelector('div.' + flagAccessLevel); - var inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, rowJson[flagDisplayOrder]); - DOM.setElementValuesCurrentAndPrevious(textareaCode, rowJson[flagCode]); - DOM.setElementValuesCurrentAndPrevious(textareaName, rowJson[flagName]); - DOM.setElementValuesCurrentAndPrevious(textareaDescription, rowJson[flagDescription]); - tdAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - tdAccessLevel.setAttribute(flagAccessLevelRequired, rowJson[flagAccessLevelRequired]); - divAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - DOM.setElementValuesCurrentAndPrevious(divAccessLevel, rowJson[attrIdAccessLevel]); - divAccessLevel.textContent = rowJson[flagAccessLevelRequired]; - DOM.setElementValuesCurrentAndPrevious(inputActive, rowJson[flagActive]); - row.setAttribute(rowJson[flagKeyPrimary], rowJson[rowJson[flagKeyPrimary]]); - var table = TableBasePage.getTableMain(); - var bodyTable = table.querySelector('tbody'); - bodyTable.appendChild(row); - } - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - if (row == null) return; - var sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - var textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - var textareaName = row.querySelector('td.' + flagName + ' textarea'); - var textareaDescription = row.querySelector('td.' + flagDescription + ' textarea'); - var tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonCategory = {}; - jsonCategory[attrIdProductCategory] = row.getAttribute(attrIdProductCategory); - jsonCategory[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonCategory[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonCategory[flagDescription] = DOM.getElementAttributeValueCurrent(textareaDescription); - // jsonCategory[flagAccessLevelRequired] = tdAccessLevel.getAttribute(flagAccessLevelRequired); - jsonCategory[attrIdAccessLevel] = DOM.getElementAttributeValueCurrent(tdAccessLevel); - jsonCategory[flagActive] = buttonActive.classList.contains(flagDelete); - jsonCategory[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(sliderDisplayOrder); - return jsonCategory; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - if (row == null) return; - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - product_categories_superPropGet(PageStoreProductCategories, "hookupTableMain", this, 3)([]); - this.hookupSlidersDisplayOrderTable(); - this.hookupTextareasCodeTable(); - this.hookupTextareasNameTable(); - this.hookupTextareasDescriptionTable(); - this.hookupTdsAccessLevel(); - this.hookupFieldsActive(); - } - - /* - isDirtyRow(row) { - if (row == null) return false; - console.log("Product Category isDirtyRow"); - console.log("row: ", row); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder); - let inputCode = row.querySelector('td.' + flagCode + ' textarea'); - let inputName = row.querySelector('td.' + flagName + ' textarea'); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - let isDirty = sliderDisplayOrder.classList.contains(flagDirty) || inputCode.classList.contains(flagDirty) || inputName.classList.contains(flagDirty) || - inputDescription.classList.contains(flagDirty) || tdAccessLevel.classList.contains(flagDirty) || inputActive.classList.contains(flagDirty); - DOM.handleDirtyElement(row, isDirty); - return isDirty; - } - */ - }, { - key: "leave", - value: function leave() { - product_categories_superPropGet(PageStoreProductCategories, "leave", this, 3)([]); - } - - /* - getFiltersDefaults() { - filters = {}; - filters.flagIsNotEmpty = true; - filters.flagActive = true; - return filters; - } - */ - }]); -}(TableBasePage); -product_categories_defineProperty(PageStoreProductCategories, "hash", hashPageStoreProductCategories); -product_categories_defineProperty(PageStoreProductCategories, "attrIdRowObject", attrIdProductCategory); - -;// CONCATENATED MODULE: ./static/js/pages/store/product_permutations.js -function product_permutations_typeof(o) { "@babel/helpers - typeof"; return product_permutations_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, product_permutations_typeof(o); } -function product_permutations_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function product_permutations_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, product_permutations_toPropertyKey(o.key), o); } } -function product_permutations_createClass(e, r, t) { return r && product_permutations_defineProperties(e.prototype, r), t && product_permutations_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function product_permutations_callSuper(t, o, e) { return o = product_permutations_getPrototypeOf(o), product_permutations_possibleConstructorReturn(t, product_permutations_isNativeReflectConstruct() ? Reflect.construct(o, e || [], product_permutations_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function product_permutations_possibleConstructorReturn(t, e) { if (e && ("object" == product_permutations_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return product_permutations_assertThisInitialized(t); } -function product_permutations_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function product_permutations_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (product_permutations_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function product_permutations_superPropGet(t, e, o, r) { var p = product_permutations_get(product_permutations_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function product_permutations_get() { return product_permutations_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = product_permutations_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, product_permutations_get.apply(null, arguments); } -function product_permutations_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = product_permutations_getPrototypeOf(t));); return t; } -function product_permutations_getPrototypeOf(t) { return product_permutations_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, product_permutations_getPrototypeOf(t); } -function product_permutations_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && product_permutations_setPrototypeOf(t, e); } -function product_permutations_setPrototypeOf(t, e) { return product_permutations_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, product_permutations_setPrototypeOf(t, e); } -function product_permutations_defineProperty(e, r, t) { return (r = product_permutations_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function product_permutations_toPropertyKey(t) { var i = product_permutations_toPrimitive(t, "string"); return "symbol" == product_permutations_typeof(i) ? i : i + ""; } -function product_permutations_toPrimitive(t, r) { if ("object" != product_permutations_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != product_permutations_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - -var PageStoreProductPermutations = /*#__PURE__*/function (_TableBasePage) { - function PageStoreProductPermutations(router) { - var _this; - product_permutations_classCallCheck(this, PageStoreProductPermutations); - _this = product_permutations_callSuper(this, PageStoreProductPermutations, [router]); - product_permutations_defineProperty(_this, "callSaveTableContent", api_API.saveProductPermutations); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - product_permutations_inherits(PageStoreProductPermutations, _TableBasePage); - return product_permutations_createClass(PageStoreProductPermutations, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterProduct(); - this.hookupFilterOutOfStock(); - this.hookupFilterMinStock(); - this.hookupFilterMaxStock(); - } - }, { - key: "hookupFilterProductCategory", - value: function hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory, function (event, filterCategory) { - // loadPermutations(); - // let wasDirtyFilter = filterCategory.classList.contains(flagDirty); - PageStoreProductPermutations.isDirtyFilter(filterCategory); - var isDirtyFilter = filterCategory.classList.contains(flagDirty); - var idProductCategory = DOM.getElementValueCurrent(filterCategory); - var products = productCategories[idProductCategory]; - var filterProduct = document.querySelector(idFormFilters + ' .' + flagProduct); - var idProductPrevious = filterProduct.getAttribute(attrValuePrevious); - filterProduct.innerHTML = ''; - var optionJson, option; - option = DOM.createOption(null); - filterProduct.appendChild(option); - products.forEach(function (product) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product, idProductPrevious); - option = DOM.createOption(optionJson); - filterProduct.appendChild(option); - }); - filterProduct.dispatchEvent(new Event('change')); - }); - } - }, { - key: "hookupFilterProduct", - value: function hookupFilterProduct() { - this.hookupFilter(flagProduct); - } - }, { - key: "hookupFilterOutOfStock", - value: function hookupFilterOutOfStock() { - this.hookupFilter(flagIsOutOfStock); - } - }, { - key: "hookupFilterMinStock", - value: function hookupFilterMinStock() { - this.hookupFilter(flagQuantityMin); - } - }, { - key: "hookupFilterMaxStock", - value: function hookupFilterMaxStock() { - this.hookupFilter(flagQuantityMax); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) { - if (rowJson == null) return; - if (_verbose) { - console.log("applying data row: ", rowJson); - } - /* - let tableMain = TableBasePage.getTableMain(); - let row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - let dllCategory = row.querySelector('td.' + flagProductCategory + ' select'); - dllCategory.value = rowJson[attrIdProductCategory]; - let ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - let optionJson, option; - listProducts.forEach(function(product) { - if (product[attrIdProductCategory] != rowJson[attrIdProductCategory]) return; - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product); - option = DOM.createOption(optionJson, rowJson[attrIdProduct]); - ddlProduct.appendChild(option); - }); - ddlProduct.value = rowJson[attrIdProduct]; - row.querySelector('td.' + flagProductVariations + ' textarea').value = rowJson[flagProductVariations]; - let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let textareaProductVariations = tdProductVariations.querySelector('textarea'); - DOM.setElementValuesCurrentAndPrevious(textareaProductVariations, rowJson[flagProductVariations]); - let thProductVariations = row.querySelector('td.' + flagProductVariations); - if (!thProductVariations.classList.contains(flagCollapsed)) tdProductVariations.classList.remove(flagCollapsed); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - DOM.setElementValuesCurrentAndPrevious(inputDescription, rowJson[flagDescription]); - let inputCostLocal = row.querySelector('td.' + flagCostLocal + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputCostLocal, rowJson[flagCostLocal]); - let tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCurrencyCost, rowJson[flagCurrencyCost]); - let ddlCurrencyCost = tdCurrencyCost.querySelector('select'); - DOM.setElementValuesCurrentAndPrevious(ddlCurrencyCost, rowJson[flagCurrencyCost]); - let inputProfitLocalMin = row.querySelector('td.' + flagProfitLocalMin + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputProfitLocalMin, rowJson[flagProfitLocalMin]); - let inputLatencyManufactureDays = row.querySelector('td.' + flagLatencyManufacture + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputLatencyManufactureDays, rowJson[flagLatencyManufacture]); - let inputQuantityStock = row.querySelector('td.' + flagQuantityStock + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityStock, rowJson[flagQuantityStock]); - let inputQuantityMin = row.querySelector('td.' + flagQuantityMin + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityMin, rowJson[flagQuantityMin]); - let inputQuantityMax = row.querySelector('td.' + flagQuantityMax + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityMax, rowJson[flagQuantityMax]); - let inputQuantityStep = row.querySelector('td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityStep, rowJson[flagCountUnitMeasurementPerQuantityStep]); - row.querySelector('td.' + flagQuantityStock + ' input').value = rowJson[flagQuantityStock]; - row.querySelector('td.' + flagQuantityMin + ' input').value = rowJson[flagQuantityMin]; - row.querySelector('td.' + flagQuantityMax + ' input').value = rowJson[flagQuantityMax]; - row.querySelector('td.' + flagCostLocal).innerHTML = rowJson[flagCostLocal]; - row.setAttribute(attrIdProductCategory, rowJson[flagProductCategory]); - row.setAttribute(attrIdProduct, rowJson[flagProduct]); - row.setAttribute(attrIdProductPermutation, rowJson[attrIdProductPermutation]); - let tbody = tableMain.querySelector('tbody'); - tbody.appendChild(row); - */ - } - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - if (row == null) return; - var tdProductCategory = row.querySelector('td.' + flagProductCategory); - var tdProduct = row.querySelector('td.' + flagProduct); - var tdProductVariations = row.querySelector('td.' + flagProductVariations); - var inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - // let inputCostLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' input'); - // let inputCostLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' input'); - var tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - var inputProfitLocalMin = row.querySelector('td.' + flagProfitLocalMin + ' input'); - var inputLatencyManufactureDays = row.querySelector('td.' + flagLatencyManufacture + ' input'); - var inputQuantityStock = row.querySelector('td.' + flagQuantityStock + ' input'); - var inputQuantityMin = row.querySelector('td.' + flagQuantityMin + ' input'); - var inputQuantityMax = row.querySelector('td.' + flagQuantityMax + ' input'); - var inputQuantityStep = row.querySelector('td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - var tdUnitMeasurementQuantity = row.querySelector('td.' + flagUnitMeasurementQuantity); - var checkboxIsSubscription = row.querySelector('td.' + flagIsSubscription + ' input'); - var inputCountIntervalRecurrence = row.querySelector('td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - var tdUnitMeasurementIntervalRecurrence = row.querySelector('td.' + flagUnitMeasurementIntervalRecurrence); - var inputIdStripeProduct = row.querySelector('td.' + flagIdStripeProduct + ' input'); - var checkboxDoesExpireFasterOnceUnsealed = row.querySelector('td.' + flagDoesExpireFasterOnceUnsealed + ' input'); - var inputCountIntervalExpirationUnsealed = row.querySelector('td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - var tdUnitMeasurementIntervalExpirationUnsealed = row.querySelector('td.' + flagUnitMeasurementIntervalExpirationUnsealed); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdProductPermutation] = row.getAttribute(attrIdProductPermutation); - jsonRow[attrIdProductCategory] = tdProductCategory.getAttribute(attrValueCurrent); - jsonRow[attrIdProduct] = tdProduct.getAttribute(attrValueCurrent); - jsonRow[flagProductVariations] = tdProductVariations.getAttribute(attrValueCurrent); - jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonRow[flagDescription] = inputDescription.getAttribute(attrValueCurrent); - // jsonRow[flagCostUnitLocalVatExcl] = inputCostLocalVatExcl.getAttribute(attrValueCurrent); - // jsonRow[flagCostUnitLocalVatIncl] = inputCostLocalVatIncl.getAttribute(attrValueCurrent); - jsonRow[flagCurrencyCost] = tdCurrencyCost.getAttribute(attrValueCurrent); - jsonRow[flagProfitLocalMin] = inputProfitLocalMin.getAttribute(attrValueCurrent); - jsonRow[flagLatencyManufacture] = inputLatencyManufactureDays.getAttribute(attrValueCurrent); - jsonRow[flagQuantityStock] = inputQuantityStock.getAttribute(attrValueCurrent); - jsonRow[flagQuantityMin] = inputQuantityMin.getAttribute(attrValueCurrent); - jsonRow[flagQuantityMax] = inputQuantityMax.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementPerQuantityStep] = inputQuantityStep.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementQuantity] = tdUnitMeasurementQuantity.getAttribute(attrValueCurrent); - jsonRow[flagIsSubscription] = checkboxIsSubscription.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementIntervalRecurrence] = inputCountIntervalRecurrence.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementIntervalRecurrence] = tdUnitMeasurementIntervalRecurrence.getAttribute(attrValueCurrent); - jsonRow[flagIdStripeProduct] = inputIdStripeProduct.getAttribute(attrValueCurrent); - jsonRow[flagDoesExpireFasterOnceUnsealed] = checkboxDoesExpireFasterOnceUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementIntervalExpirationUnsealed] = inputCountIntervalExpirationUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementIntervalExpirationUnsealed] = tdUnitMeasurementIntervalExpirationUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - this.initialiseRowNewDdlsProductCategoryAndProduct(row); - var checkboxIsSubscription = row.querySelector('td.' + flagIsSubscription + ' input'); - var checkboxDoesExpireFasterOnceUnsealed = row.querySelector('td.' + flagDoesExpireFasterOnceUnsealed + ' input'); - this.handleChangeCheckboxDoesExpireFasterOnceUnsealed(null, checkboxDoesExpireFasterOnceUnsealed); - this.handleChangeCheckboxIsSubscription(null, checkboxIsSubscription); - } - }, { - key: "initialiseRowNewDdlsProductCategoryAndProduct", - value: function initialiseRowNewDdlsProductCategoryAndProduct(row) { - var ddlCategoryFilter = document.querySelector(idFormFilters + ' #' + attrIdProductCategory); - var idProductCategoryFilter = DOM.getElementValueCurrent(ddlCategoryFilter); - var hasCategoryFilter = !(validation_Validation.isEmpty(idProductCategoryFilter) || idProductCategoryFilter == '0'); - var ddlProductFilter = document.querySelector(idFormFilters + ' #' + attrIdProduct); - var idProductFilter = DOM.getElementValueCurrent(ddlProductFilter); - var hasProductFilter = !(validation_Validation.isEmpty(idProductFilter) || idProductFilter == '0'); - if (_verbose) { - console.log("initialiseRowNew: ", row); - console.log({ - ddlCategoryFilter: ddlCategoryFilter, - idProductCategoryFilter: idProductCategoryFilter, - hasCategoryFilter: hasCategoryFilter, - ddlProductFilter: ddlProductFilter, - idProductFilter: idProductFilter, - hasProductFilter: hasProductFilter - }); - } - if (!hasCategoryFilter && !hasProductFilter) return; - if (hasCategoryFilter) { - var ddlCategory = row.querySelector('td.' + flagProductCategory + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlCategory, idProductCategoryFilter); - this.handleChangeProductCategoryDdl(null, ddlCategory); - } - if (hasProductFilter) { - var ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlProduct, idProductFilter); - } - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - product_permutations_superPropGet(PageStoreProductPermutations, "hookupTableMain", this, 3)([]); - this.hookupFieldsProductCategory(); - this.hookupProductFields(); - this.hookupFieldsProductPermutationVariation(); - this.hookupDescriptionTextareas(); - this.hookupCostFields(); - this.hookupProfitFields(); - this.hookupLatencyManufactureInputs(); - this.hookupQuantityFields(); - this.hookupSubscriptionFields(); - this.hookupIdStripeProductInputs(); - this.hookupExpirationFields(); - this.hookupFieldsActive(); - } - }, { - key: "hookupFieldsProductCategory", - value: function hookupFieldsProductCategory() { - var _this2 = this; - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProductCategory, Utils.getListFromDict(productCategories), function (cellSelector) { - _this2.hookupProductCategoryDdls(cellSelector); - }); - } - }, { - key: "hookupProductFields", - value: function hookupProductFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - }, { - key: "hookupDescriptionTextareas", - value: function hookupDescriptionTextareas() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDescription + ' textarea'); - } - }, { - key: "hookupCostFields", - value: function hookupCostFields() { - this.hookupCurrencyCostFields(); - this.hookupCostInputs(); - } - }, { - key: "hookupCurrencyCostFields", - value: function hookupCurrencyCostFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrencyCost, Utils.getListFromDict(currencies)); - } - }, { - key: "hookupCostInputs", - value: function hookupCostInputs() { - /* - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatIncl + ' input'); - */ - } - }, { - key: "hookupProfitFields", - value: function hookupProfitFields() { - // this.hookupCurrencyProfitFields(); - this.hookupProfitInputs(); - } - /* - hookupCurrencyProfitFields(){ - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrency, Utils.getListFromDict(currencies)); - } - */ - }, { - key: "hookupProfitInputs", - value: function hookupProfitInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProfitLocalMin + ' input'); - } - }, { - key: "hookupLatencyManufactureInputs", - value: function hookupLatencyManufactureInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagLatencyManufacture + ' input'); - } - }, { - key: "hookupQuantityFields", - value: function hookupQuantityFields() { - this.hookupQuantityMinInputs(); - this.hookupQuantityMaxInputs(); - this.hookupQuantityStockInputs(); - this.hookupCountUnitMeasurementPerQuantityStepInputs(); - this.hookupUnitMeasurementQuantityFields(); - } - }, { - key: "hookupQuantityMinInputs", - value: function hookupQuantityMinInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityMin + ' input'); - } - }, { - key: "hookupQuantityMaxInputs", - value: function hookupQuantityMaxInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityMax + ' input'); - } - }, { - key: "hookupQuantityStockInputs", - value: function hookupQuantityStockInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityStock + ' input'); - } - }, { - key: "hookupCountUnitMeasurementPerQuantityStepInputs", - value: function hookupCountUnitMeasurementPerQuantityStepInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - } - }, { - key: "hookupUnitMeasurementQuantityFields", - value: function hookupUnitMeasurementQuantityFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagUnitMeasurementQuantity, Utils.getListFromDict(unitMeasurements)); - } - }, { - key: "hookupSubscriptionFields", - value: function hookupSubscriptionFields() { - this.hookupIsSubscriptionFields(); - this.hookupIntervalRecurrenceFields(); - this.hookupCountIntervalRecurrenceInputs(); - } - }, { - key: "hookupIsSubscriptionFields", - value: function hookupIsSubscriptionFields() { - var _this3 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsSubscription + ' input', function (event, element) { - _this3.handleChangeCheckboxIsSubscription(event, element); - }); - } - }, { - key: "handleChangeCheckboxIsSubscription", - value: function handleChangeCheckboxIsSubscription(event, element) { - this.handleChangeNestedElementCellTable(event, element); - var isSubscription = DOM.getElementValueCurrent(element); - var row = DOM.getRowFromElement(element); - var inputCountIntervalRecurrence = row.querySelector('td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - var divOrDdlIntervalRecurrence = row.querySelector('td.' + flagUnitMeasurementIntervalRecurrence + ' .' + flagUnitMeasurementIntervalRecurrence); - if (isSubscription) { - inputCountIntervalRecurrence.classList.remove(flagCollapsed); - divOrDdlIntervalRecurrence.classList.remove(flagCollapsed); - var tdUnitMeasurementIntervalRecurrence = divOrDdlIntervalRecurrence.closest('td'); - tdUnitMeasurementIntervalRecurrence.dispatchEvent(new Event('click')); - } else { - inputCountIntervalRecurrence.classList.add(flagCollapsed); - divOrDdlIntervalRecurrence.classList.add(flagCollapsed); - } - } - }, { - key: "hookupIntervalRecurrenceFields", - value: function hookupIntervalRecurrenceFields() { - this.hookupTableCellDDlPreviewsWhenNotCollapsed(idTableMain + ' td.' + flagUnitMeasurementIntervalRecurrence, Utils.getListFromDict(unitMeasurementsTime)); - } - }, { - key: "hookupCountIntervalRecurrenceInputs", - value: function hookupCountIntervalRecurrenceInputs() { - this.hookupChangeHandlerTableCellsWhenNotCollapsed(idTableMain + ' td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - } - }, { - key: "hookupIdStripeProductInputs", - value: function hookupIdStripeProductInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIdStripeProduct + ' input'); - } - }, { - key: "hookupExpirationFields", - value: function hookupExpirationFields() { - this.hookupDoesExpireFasterOnceUnsealedCheckboxes(); - this.hookupIntervalExpirationUnsealedFields(); - this.hookupCountIntervalExpirationUnsealedInputs(); - } - }, { - key: "hookupDoesExpireFasterOnceUnsealedCheckboxes", - value: function hookupDoesExpireFasterOnceUnsealedCheckboxes() { - var _this4 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDoesExpireFasterOnceUnsealed + ' input', function (event, element) { - _this4.handleChangeCheckboxDoesExpireFasterOnceUnsealed(event, element); - }); - } - }, { - key: "handleChangeCheckboxDoesExpireFasterOnceUnsealed", - value: function handleChangeCheckboxDoesExpireFasterOnceUnsealed(event, element) { - this.handleChangeNestedElementCellTable(event, element); - var doesExpireFasterOnceUnsealed = DOM.getElementValueCurrent(element); - var row = DOM.getRowFromElement(element); - var inputCountIntervalExpirationUnsealed = row.querySelector('td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - var divOrDdlIntervalExpirationUnsealed = row.querySelector('td.' + flagUnitMeasurementIntervalExpirationUnsealed + ' .' + flagUnitMeasurementIntervalExpirationUnsealed); - if (doesExpireFasterOnceUnsealed) { - inputCountIntervalExpirationUnsealed.classList.remove(flagCollapsed); - divOrDdlIntervalExpirationUnsealed.classList.remove(flagCollapsed); - var tdUnitMeasurementIntervalExpirationUnsealed = divOrDdlIntervalExpirationUnsealed.closest('td'); - tdUnitMeasurementIntervalExpirationUnsealed.dispatchEvent(new Event('click')); - this.hook; - } else { - inputCountIntervalExpirationUnsealed.classList.add(flagCollapsed); - divOrDdlIntervalExpirationUnsealed.classList.add(flagCollapsed); - } - } - }, { - key: "hookupIntervalExpirationUnsealedFields", - value: function hookupIntervalExpirationUnsealedFields() { - this.hookupTableCellDDlPreviewsWhenNotCollapsed(idTableMain + ' td.' + flagUnitMeasurementIntervalExpirationUnsealed, Utils.getListFromDict(unitMeasurementsTime)); - } - }, { - key: "hookupCountIntervalExpirationUnsealedInputs", - value: function hookupCountIntervalExpirationUnsealedInputs() { - this.hookupChangeHandlerTableCellsWhenNotCollapsed(idTableMain + ' td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - } - }, { - key: "leave", - value: function leave() { - product_permutations_superPropGet(PageStoreProductPermutations, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -product_permutations_defineProperty(PageStoreProductPermutations, "hash", hashPageStoreProductPermutations); -product_permutations_defineProperty(PageStoreProductPermutations, "attrIdRowObject", attrIdProductPermutation); - -;// CONCATENATED MODULE: ./static/js/pages/store/products.js -function products_typeof(o) { "@babel/helpers - typeof"; return products_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, products_typeof(o); } -function products_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function products_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, products_toPropertyKey(o.key), o); } } -function products_createClass(e, r, t) { return r && products_defineProperties(e.prototype, r), t && products_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function products_callSuper(t, o, e) { return o = products_getPrototypeOf(o), products_possibleConstructorReturn(t, products_isNativeReflectConstruct() ? Reflect.construct(o, e || [], products_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function products_possibleConstructorReturn(t, e) { if (e && ("object" == products_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return products_assertThisInitialized(t); } -function products_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function products_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (products_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function products_superPropGet(t, e, o, r) { var p = products_get(products_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function products_get() { return products_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = products_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, products_get.apply(null, arguments); } -function products_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = products_getPrototypeOf(t));); return t; } -function products_getPrototypeOf(t) { return products_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, products_getPrototypeOf(t); } -function products_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && products_setPrototypeOf(t, e); } -function products_setPrototypeOf(t, e) { return products_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, products_setPrototypeOf(t, e); } -function products_defineProperty(e, r, t) { return (r = products_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function products_toPropertyKey(t) { var i = products_toPrimitive(t, "string"); return "symbol" == products_typeof(i) ? i : i + ""; } -function products_toPrimitive(t, r) { if ("object" != products_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != products_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - -var PageStoreProducts = /*#__PURE__*/function (_TableBasePage) { - function PageStoreProducts(router) { - var _this; - products_classCallCheck(this, PageStoreProducts); - _this = products_callSuper(this, PageStoreProducts, [router]); - products_defineProperty(_this, "callSaveTableContent", api_API.saveProducts); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - products_inherits(PageStoreProducts, _TableBasePage); - return products_createClass(PageStoreProducts, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterIsNotEmpty(); - this.hookupFilterActive(); - } - }, { - key: "hookupFilterProductCategory", - value: function hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) { - return; - if (rowJson == null) return; - var row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - row.classList.remove(flagInitialised); - row.querySelectorAll('.' + flagInitialised).forEach(function (element) { - element.classList.remove(flagInitialised); - }); - var sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - var tdProductCategory = row.querySelector('td.' + flagProductCategory); - var divProductCategory = tdProductCategory.querySelector('div.' + flagProductCategory); - var textareaName = row.querySelector('td.' + flagName + ' textarea'); - var tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - var divAccessLevel = tdAccessLevel.querySelector('div.' + flagAccessLevel); - var inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, rowJson[flagDisplayOrder]); - DOM.setElementValuesCurrentAndPrevious(textareaCode, rowJson[flagCode]); - DOM.setElementValuesCurrentAndPrevious(textareaName, rowJson[flagName]); - DOM.setElementValuesCurrentAndPrevious(textareaDescription, rowJson[flagDescription]); - tdAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - tdAccessLevel.setAttribute(flagAccessLevelRequired, rowJson[flagAccessLevelRequired]); - divAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - DOM.setElementValuesCurrentAndPrevious(divAccessLevel, rowJson[attrIdAccessLevel]); - divAccessLevel.textContent = rowJson[flagAccessLevelRequired]; - DOM.setElementValuesCurrentAndPrevious(inputActive, rowJson[flagActive]); - row.setAttribute(rowJson[flagKeyPrimary], rowJson[rowJson[flagKeyPrimary]]); - var table = TableBasePage.getTableMain(); - var bodyTable = table.querySelector('tbody'); - bodyTable.appendChild(row); - } - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - if (row == null) return; - var sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - var tdProductCategory = row.querySelector('td.' + flagProductCategory); - var textareaName = row.querySelector('td.' + flagName + ' textarea'); - // let tdProductVariations = row.querySelector('td.' + flagProductVariations); - var inputHasVariations = row.querySelector('td.' + flagHasVariations + ' input[type="checkbox"]'); - var tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonProduct = {}; - jsonProduct[attrIdProduct] = row.getAttribute(attrIdProduct); - jsonProduct[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdProductCategory); - jsonProduct[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - // jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdProductVariations); - // jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonProduct[flagHasVariations] = DOM.getElementAttributeValueCurrent(inputHasVariations); - // jsonProduct[flagAccessLevelRequired] = tdAccessLevel.getAttribute(flagAccessLevelRequired); - jsonProduct[attrIdAccessLevel] = DOM.getElementAttributeValueCurrent(tdAccessLevel); - jsonProduct[flagActive] = buttonActive.classList.contains(flagDelete); - jsonProduct[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(sliderDisplayOrder); - return jsonProduct; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - if (row == null) return; - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - products_superPropGet(PageStoreProducts, "hookupTableMain", this, 3)([]); - this.hookupSlidersDisplayOrderTable(); - this.hookupTdsProductCategory(); - this.hookupTextareasNameTable(); - this.hookupInputsHasVariationsTable(); - this.hookupTdsAccessLevel(); - this.hookupFieldsActive(); - } - }, { - key: "hookupTdsProductCategory", - value: function hookupTdsProductCategory() { - var cellSelector = idTableMain + ' tbody td.' + flagProductCategory; - this.hookupTableCellDdlPreviews(cellSelector, Utils.getListFromDict(productCategories)); - } - }, { - key: "hookupInputsHasVariationsTable", - value: function hookupInputsHasVariationsTable() { - var cellSelector = idTableMain + ' tbody td.' + flagHasVariations + ' input[type="checkbox"]'; - this.hookupChangeHandlerTableCells(cellSelector); - } - - /* - isDirtyRow(row) { - if (row == null) return false; - console.log("Product Product isDirtyRow"); - console.log("row: ", row); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder); - let inputCode = row.querySelector('td.' + flagCode + ' textarea'); - let inputName = row.querySelector('td.' + flagName + ' textarea'); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - let isDirty = sliderDisplayOrder.classList.contains(flagDirty) || inputCode.classList.contains(flagDirty) || inputName.classList.contains(flagDirty) || - inputDescription.classList.contains(flagDirty) || tdAccessLevel.classList.contains(flagDirty) || inputActive.classList.contains(flagDirty); - DOM.handleDirtyElement(row, isDirty); - return isDirty; - } - */ - }, { - key: "leave", - value: function leave() { - products_superPropGet(PageStoreProducts, "leave", this, 3)([]); - } - - /* - getFiltersDefaults() { - filters = {}; - filters.flagIsNotEmpty = true; - filters.flagActive = true; - return filters; - } - */ - }]); -}(TableBasePage); -products_defineProperty(PageStoreProducts, "hash", hashPageStoreProducts); -products_defineProperty(PageStoreProducts, "attrIdRowObject", attrIdProduct); - -;// CONCATENATED MODULE: ./static/js/pages/store/product_variations.js -function product_variations_typeof(o) { "@babel/helpers - typeof"; return product_variations_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, product_variations_typeof(o); } -function product_variations_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function product_variations_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, product_variations_toPropertyKey(o.key), o); } } -function product_variations_createClass(e, r, t) { return r && product_variations_defineProperties(e.prototype, r), t && product_variations_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function product_variations_callSuper(t, o, e) { return o = product_variations_getPrototypeOf(o), product_variations_possibleConstructorReturn(t, product_variations_isNativeReflectConstruct() ? Reflect.construct(o, e || [], product_variations_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function product_variations_possibleConstructorReturn(t, e) { if (e && ("object" == product_variations_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return product_variations_assertThisInitialized(t); } -function product_variations_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function product_variations_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (product_variations_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function product_variations_superPropGet(t, e, o, r) { var p = product_variations_get(product_variations_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function product_variations_get() { return product_variations_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = product_variations_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, product_variations_get.apply(null, arguments); } -function product_variations_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = product_variations_getPrototypeOf(t));); return t; } -function product_variations_getPrototypeOf(t) { return product_variations_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, product_variations_getPrototypeOf(t); } -function product_variations_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && product_variations_setPrototypeOf(t, e); } -function product_variations_setPrototypeOf(t, e) { return product_variations_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, product_variations_setPrototypeOf(t, e); } -function product_variations_defineProperty(e, r, t) { return (r = product_variations_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function product_variations_toPropertyKey(t) { var i = product_variations_toPrimitive(t, "string"); return "symbol" == product_variations_typeof(i) ? i : i + ""; } -function product_variations_toPrimitive(t, r) { if ("object" != product_variations_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != product_variations_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - -var PageStoreProductVariations = /*#__PURE__*/function (_TableBasePage) { - function PageStoreProductVariations(router) { - var _this; - product_variations_classCallCheck(this, PageStoreProductVariations); - _this = product_variations_callSuper(this, PageStoreProductVariations, [router]); - product_variations_defineProperty(_this, "callSaveTableContent", api_API.saveProductVariations); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - product_variations_inherits(PageStoreProductVariations, _TableBasePage); - return product_variations_createClass(PageStoreProductVariations, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - this.hookupFilterIsNotEmpty(); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) {} - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - var _this2 = this; - if (row == null) return; - var inputDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' input'); - var textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - var textareaName = row.querySelector('td.' + flagName + ' textarea'); - var textareaNamePlural = row.querySelector('td.' + flagNamePlural + ' textarea'); - var tdProductVariations = row.querySelector('td.' + flagProductVariations); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdProductVariationType] = row.getAttribute(attrIdProductVariationType); - if (validation_Validation.isEmpty(jsonRow[attrIdProductVariationType])) jsonRow[attrIdProductVariationType] = -1; - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonRow[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonRow[flagNamePlural] = DOM.getElementAttributeValueCurrent(textareaNamePlural); - var variations = []; - if (tdProductVariations.classList.contains(flagDirty)) { - var trsProductVariation = tdProductVariations.querySelectorAll('tr.' + flagProductVariation + '.' + flagDirty); - if (trsProductVariation != null) { - trsProductVariation.forEach(function (tr, indexRow) { - variations.push(_this2.getJsonRowProductVariation(tr, indexRow)); - }); - } - } else { - // variations = BusinessObjects.getListObjectsFromIdDictAndCsv(productVariationTypes, DOM.getElementAttributeValueCurrent(tdProductVariations)); - } - jsonRow[flagProductVariations] = variations; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "getJsonRowProductVariation", - value: function getJsonRowProductVariation(tr, indexRow) { - var inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - var textareaCode = tr.querySelector('td.' + flagCode + ' textarea'); - var textareaName = tr.querySelector('td.' + flagName + ' textarea'); - // let checkboxActive = tr.querySelector('td.' + flagActive + ' input'); - var buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdProductVariation] = tr.getAttribute(attrIdProductVariation); - if (validation_Validation.isEmpty(jsonRow[attrIdProductVariation])) jsonRow[attrIdProductVariation] = -1 - indexRow; - jsonRow[attrIdProductVariationType] = tr.getAttribute(attrIdProductVariationType); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonRow[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - product_variations_superPropGet(PageStoreProductVariations, "initialiseRowNew", this, 3)([tbody, row]); - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - product_variations_superPropGet(PageStoreProductVariations, "hookupTableMain", this, 3)([]); - this.hookupSlidersDisplayOrderTable(); - this.hookupTextareasCodeTable(); - this.hookupTextareasNameTable(); - this.hookupTextareasNamePluralTable(); - this.hookupFieldsProductVariation(); - this.hookupFieldsActive(); - } - }, { - key: "hookupTextareasNamePluralTable", - value: function hookupTextareasNamePluralTable() { - this.hookupChangeHandlerTableCells(idTableMain + ' tbody tr td.' + flagNamePlural + ' textarea'); - } - }, { - key: "hookupFieldsProductVariation", - value: function hookupFieldsProductVariation() { - this.hookupProductVariationsPreviews(); - this.hookupFieldsProductVariationDisplayOrder(); - this.hookupFieldsProductVariationCode(); - this.hookupFieldsProductVariationName(); - this.hookupFieldsProductVariationActive(); - } - }, { - key: "hookupProductVariationsPreviews", - value: function hookupProductVariationsPreviews() { - var _this3 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations + ' div', function (event, element) { - var td = DOM.getCellFromElement(element); - if (!td.classList.contains(flagCollapsed)) return; - _this3.handleClickProductVariationsPreview(event, element); - }); - } - }, { - key: "handleClickProductVariationsPreview", - value: function handleClickProductVariationsPreview(event, element) { - var _this4 = this; - if (_verbose) { - console.log("click order items preview"); - } - var row = DOM.getRowFromElement(element); - var idProductVariationType = row.getAttribute(attrIdProductVariationType); - var productVariationType = productVariationTypes[idProductVariationType]; - if (productVariationType == null) productVariationType = product_variations_defineProperty({}, flagProductVariations, []); - var tblProductVariations = document.createElement("table"); - tblProductVariations.classList.add(flagProductVariations); - var thead = document.createElement("thead"); - var tr = document.createElement("tr"); - var thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - var thCode = document.createElement("th"); - thCode.classList.add(flagCode); - thCode.textContent = 'Code'; - var thName = document.createElement("th"); - thName.classList.add(flagName); - thName.textContent = 'Name'; - var thActive = document.createElement("th"); - thActive.classList.add(flagActive); - // thActive.textContent = 'Active'; - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagActive); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thActive.appendChild(buttonAdd); - tr.appendChild(thDisplayOrder); - tr.appendChild(thCode); - tr.appendChild(thName); - tr.appendChild(thActive); - thead.appendChild(tr); - tblProductVariations.appendChild(thead); - var tbody = document.createElement("tbody"); - productVariationType[flagProductVariations].forEach(function (productVariation, index) { - _this4.addRowProductVariation(tbody, productVariation); - }); - tblProductVariations.appendChild(tbody); - var cell = DOM.getCellFromElement(element); - var cellNew = cell.cloneNode(false); - cellNew.appendChild(tblProductVariations); - cellNew.classList.remove(flagCollapsed); - row.replaceChild(cellNew, cell); - if (_verbose) { - console.log("tblProductVariations: ", tblProductVariations); - } - this.toggleColumnHeaderCollapsed(flagProductVariations, false); - this.hookupFieldsProductVariation(); - } - }, { - key: "addRowProductVariation", - value: function addRowProductVariation(tbody, productVariation) { - if (_verbose) { - console.log("addRowProductVariation: ", productVariation); - } - var tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - var inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, productVariation[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - var tdCode = document.createElement("td"); - tdCode.classList.add(flagCode); - var textareaCode = document.createElement("textarea"); - textareaCode.classList.add(flagCode); - DOM.setElementValuesCurrentAndPrevious(textareaCode, productVariation[flagCode]); - tdCode.appendChild(textareaCode); - var tdName = document.createElement("td"); - tdName.classList.add(flagName); - var textareaName = document.createElement("textarea"); - textareaName.classList.add(flagName); - DOM.setElementValuesCurrentAndPrevious(textareaName, productVariation[flagName]); - tdName.appendChild(textareaName); - var tdActive = this.createTdActive(productVariation[flagActive]); - var tr = document.createElement("tr"); - tr.classList.add(flagProductVariation); - tr.setAttribute(attrIdProductVariationType, productVariation[attrIdProductVariationType]); - tr.setAttribute(attrIdProductVariation, productVariation[attrIdProductVariation]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCode); - tr.appendChild(tdName); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - }, { - key: "hookupFieldsProductVariationDisplayOrder", - value: function hookupFieldsProductVariationDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' td.' + flagDisplayOrder + ' input'); - } - }, { - key: "hookupFieldsProductVariationCode", - value: function hookupFieldsProductVariationCode() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' textarea.' + flagCode); - } - }, { - key: "hookupFieldsProductVariationName", - value: function hookupFieldsProductVariationName() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' textarea.' + flagName); - } - }, { - key: "hookupFieldsProductVariationActive", - value: function hookupFieldsProductVariationActive() { - var _this5 = this; - this.hookupFieldsActive(flagProductVariations, function (event, element) { - _this5.hookupButtonsProductVariationAdd(event, element); - }); - } - }, { - key: "hookupButtonsProductVariationAdd", - value: function hookupButtonsProductVariationAdd(event, element) { - var row = element.closest(idTableMain + ' > tbody > tr'); - var idProductVariationType = row.getAttribute(attrIdProductVariationType); - var idProductVariation = row.getAttribute(attrIdProductVariation); - var countProductVariations = row.querySelectorAll('td.' + flagProductVariations + ' tr').length; - var productVariation = product_variations_defineProperty(product_variations_defineProperty(product_variations_defineProperty(product_variations_defineProperty(product_variations_defineProperty(product_variations_defineProperty({}, attrIdProductVariationType, idProductVariationType), attrIdProductVariation, idProductVariation), flagCode, ''), flagName, ''), flagDisplayOrder, countProductVariations), flagActive, true); - var tbody = row.querySelector('td.' + flagProductVariations + ' table tbody'); - this.addRowProductVariation(tbody, productVariation); - this.hookupFieldsProductVariation(); - } - }, { - key: "leave", - value: function leave() { - product_variations_superPropGet(PageStoreProductVariations, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -product_variations_defineProperty(PageStoreProductVariations, "hash", hashPageStoreProductVariations); -product_variations_defineProperty(PageStoreProductVariations, "attrIdRowObject", attrIdProductVariationType); - -;// CONCATENATED MODULE: ./static/js/pages/store/stock_items.js -function stock_items_typeof(o) { "@babel/helpers - typeof"; return stock_items_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, stock_items_typeof(o); } -function stock_items_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function stock_items_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, stock_items_toPropertyKey(o.key), o); } } -function stock_items_createClass(e, r, t) { return r && stock_items_defineProperties(e.prototype, r), t && stock_items_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function stock_items_callSuper(t, o, e) { return o = stock_items_getPrototypeOf(o), stock_items_possibleConstructorReturn(t, stock_items_isNativeReflectConstruct() ? Reflect.construct(o, e || [], stock_items_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function stock_items_possibleConstructorReturn(t, e) { if (e && ("object" == stock_items_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return stock_items_assertThisInitialized(t); } -function stock_items_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function stock_items_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (stock_items_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function stock_items_superPropGet(t, e, o, r) { var p = stock_items_get(stock_items_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function stock_items_get() { return stock_items_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = stock_items_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, stock_items_get.apply(null, arguments); } -function stock_items_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = stock_items_getPrototypeOf(t));); return t; } -function stock_items_getPrototypeOf(t) { return stock_items_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, stock_items_getPrototypeOf(t); } -function stock_items_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && stock_items_setPrototypeOf(t, e); } -function stock_items_setPrototypeOf(t, e) { return stock_items_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, stock_items_setPrototypeOf(t, e); } -function stock_items_defineProperty(e, r, t) { return (r = stock_items_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function stock_items_toPropertyKey(t) { var i = stock_items_toPrimitive(t, "string"); return "symbol" == stock_items_typeof(i) ? i : i + ""; } -function stock_items_toPrimitive(t, r) { if ("object" != stock_items_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != stock_items_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - -var PageStoreStockItems = /*#__PURE__*/function (_TableBasePage) { - function PageStoreStockItems(router) { - var _this; - stock_items_classCallCheck(this, PageStoreStockItems); - _this = stock_items_callSuper(this, PageStoreStockItems, [router]); - stock_items_defineProperty(_this, "callSaveTableContent", api_API.saveStockItems); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - stock_items_inherits(PageStoreStockItems, _TableBasePage); - return stock_items_createClass(PageStoreStockItems, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterProduct(); - this.hookupFilterOutOfStock(); - this.hookupFilterMinStock(); - this.hookupFilterMaxStock(); - } - }, { - key: "hookupFilterProductCategory", - value: function hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory, function (event, filterCategory) { - // loadPermutations(); - // let wasDirtyFilter = filterCategory.classList.contains(flagDirty); - PageStoreStockItems.isDirtyFilter(filterCategory); - var isDirtyFilter = filterCategory.classList.contains(flagDirty); - var idProductCategory = DOM.getElementValueCurrent(filterCategory); - var products = productCategories[idProductCategory]; - var filterProduct = document.querySelector(idFormFilters + ' .' + flagProduct); - var idProductPrevious = filterProduct.getAttribute(attrValuePrevious); - filterProduct.innerHTML = ''; - var optionJson, option; - option = DOM.createOption(null); - filterProduct.appendChild(option); - products.forEach(function (product) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product, idProductPrevious); - option = DOM.createOption(optionJson); - filterProduct.appendChild(option); - }); - filterProduct.dispatchEvent(new Event('change')); - }); - } - }, { - key: "hookupFilterProduct", - value: function hookupFilterProduct() { - this.hookupFilter(flagProduct); - } - }, { - key: "hookupFilterOutOfStock", - value: function hookupFilterOutOfStock() { - this.hookupFilter(flagIsOutOfStock); - } - }, { - key: "hookupFilterMinStock", - value: function hookupFilterMinStock() { - this.hookupFilter(flagQuantityMin); - } - }, { - key: "hookupFilterMaxStock", - value: function hookupFilterMaxStock() { - this.hookupFilter(flagQuantityMax); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) {} - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - if (row == null) return; - var tdProductCategory = row.querySelector('td.' + flagProductCategory); - var tdProduct = row.querySelector('td.' + flagProduct); - var tdProductVariations = row.querySelector('td.' + flagProductVariations); - var tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - var inputCostLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' input'); - var inputCostLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' input'); - var inputDatePurchased = row.querySelector('td.' + flagDatePurchased + ' input'); - var inputDateReceived = row.querySelector('td.' + flagDateReceived + ' input'); - var tdStorageLocation = row.querySelector('td.' + flagStorageLocation); - var inputIsSealed = row.querySelector('td.' + flagIsSealed + ' input'); - var inputDateUnsealed = row.querySelector('td.' + flagDateUnsealed + ' input'); - var inputDateExpiration = row.querySelector('td.' + flagDateExpiration + ' input'); - var inputIsConsumed = row.querySelector('td.' + flagIsConsumed + ' input'); - var inputDateConsumed = row.querySelector('td.' + flagDateConsumed + ' input'); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdStockItem] = row.getAttribute(attrIdStockItem); - jsonRow[attrIdProductPermutation] = tdProductVariations.getAttribute(attrIdProductPermutation); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdProductCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdProductVariations); - jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonRow[flagCurrencyCost] = DOM.getElementAttributeValueCurrent(tdCurrencyCost); - jsonRow[flagCostUnitLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatExcl); - jsonRow[flagCostUnitLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatIncl); - jsonRow[flagDatePurchased] = DOM.getElementAttributeValueCurrent(inputDatePurchased); - jsonRow[flagDateReceived] = DOM.getElementAttributeValueCurrent(inputDateReceived); - jsonRow[attrIdStorageLocation] = DOM.getElementAttributeValueCurrent(tdStorageLocation); - jsonRow[flagIsSealed] = DOM.getElementAttributeValueCurrent(inputIsSealed); - jsonRow[flagDateUnsealed] = DOM.getElementAttributeValueCurrent(inputDateUnsealed); - jsonRow[flagDateExpiration] = DOM.getElementAttributeValueCurrent(inputDateExpiration); - jsonRow[flagIsConsumed] = DOM.getElementAttributeValueCurrent(inputIsConsumed); - jsonRow[flagDateConsumed] = DOM.getElementAttributeValueCurrent(inputDateConsumed); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - stock_items_superPropGet(PageStoreStockItems, "initialiseRowNew", this, 3)([tbody, row]); - var ddlCategoryFilter = document.querySelector(idFormFilters + ' #' + attrIdProductCategory); - var idProductCategoryFilter = DOM.getElementValueCurrent(ddlCategoryFilter); - var hasCategoryFilter = !(validation_Validation.isEmpty(idProductCategoryFilter) || idProductCategoryFilter == '0'); - var ddlProductFilter = document.querySelector(idFormFilters + ' #' + attrIdProduct); - var idProductFilter = DOM.getElementValueCurrent(ddlProductFilter); - var hasProductFilter = !(validation_Validation.isEmpty(idProductFilter) || idProductFilter == '0'); - if (_verbose) { - console.log("initialiseRowNew: ", row); - console.log({ - ddlCategoryFilter: ddlCategoryFilter, - idProductCategoryFilter: idProductCategoryFilter, - hasCategoryFilter: hasCategoryFilter, - ddlProductFilter: ddlProductFilter, - idProductFilter: idProductFilter, - hasProductFilter: hasProductFilter - }); - } - if (!hasCategoryFilter && !hasProductFilter) return; - if (hasCategoryFilter) { - var ddlCategory = row.querySelector('td.' + flagProductCategory + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlCategory, idProductCategoryFilter); - this.handleChangeProductCategoryDdl(null, ddlCategory); - } - if (hasProductFilter) { - var ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlProduct, idProductFilter); - } - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - stock_items_superPropGet(PageStoreStockItems, "hookupTableMain", this, 3)([]); - this.hookupProductCategoryFields(); - this.hookupProductFields(); - this.hookupFieldsProductPermutationVariation(); - this.hookupCurrencyCostFields(); - this.hookupCostInputs(); - this.hookupOrderDateInputs(); - this.hookupStorageLocationFields(); - this.hookupSealingInputs(); - this.hookupExpirationDateInputs(); - this.hookupConsumationInputs(); - this.hookupFieldsActive(); - } - }, { - key: "hookupProductCategoryFields", - value: function hookupProductCategoryFields() { - var _this2 = this; - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProductCategory, Utils.getListFromDict(productCategories), function (event, element) { - _this2.hookupProductCategoryDdls(event, element); - }); - } - }, { - key: "hookupProductFields", - value: function hookupProductFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - - /* - handleClickProductPermutationVariationsPreview(event, element) { - let row = DOM.getRowFromElement(element); - let tdProduct = row.querySelector('td.' + flagProduct); - let idProduct = DOM.getElementValueCurrent(tdProduct); - let product = products[idProduct]; - if (!product[flagHasVariations]) return; - super.handleClickProductPermutationVariationsPreview(event, element); - } - */ - }, { - key: "handleClickButtonProductPermutationVariationsAdd", - value: function handleClickButtonProductPermutationVariationsAdd(event, element) { - var row = DOM.getRowFromElement(element); - var tbody = row.querySelector('tbody'); - var permutationVariation = PageStoreStockItems.createOptionUnselectedProductVariation(); - this.addProductPermutationVariationRow(tbody, permutationVariation); - } - }, { - key: "hookupCurrencyCostFields", - value: function hookupCurrencyCostFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrencyCost, Utils.getListFromDict(currencies)); - } - }, { - key: "hookupCostInputs", - value: function hookupCostInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatIncl + ' input'); - } - }, { - key: "hookupOrderDateInputs", - value: function hookupOrderDateInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDatePurchased + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDateReceived + ' input'); - } - }, { - key: "hookupStorageLocationFields", - value: function hookupStorageLocationFields() { - var _this3 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagStorageLocation + ' div', function (event, element) { - return _this3.handleClickStorageLocationPreview(event, element); - }); - } - }, { - key: "handleClickStorageLocationPreview", - value: function handleClickStorageLocationPreview(event, element) { - var _this4 = this; - this.toggleColumnCollapsed(flagStorageLocation, false); - var idPlant = element.getAttribute(attrIdPlant); - var idStorageLocation = element.getAttribute(attrIdStorageLocation); - var tblStorageLocation = document.createElement("table"); - tblStorageLocation.classList.add(flagStorageLocation); - var thead = document.createElement("thead"); - var thPlant = document.createElement("th"); - thPlant.textContent = 'Plant'; - var thLocation = document.createElement("th"); - thLocation.textContent = 'Location'; - var trHead = document.createElement("tr"); - trHead.appendChild(thPlant); - trHead.appendChild(thLocation); - thead.appendChild(trHead); - tblStorageLocation.appendChild(thead); - var tbody = document.createElement("tbody"); - var plant, optionPlantJson, optionPlant, storageLocation, optionStorageLocationJson, optionStorageLocation; - var plantKeys = Object.keys(plants); - var storageLocationKeys = Object.keys(storageLocations); - debugger; - var plantJson = idPlant != null ? plants[idPlant] : stock_items_defineProperty({}, attrIdPlant, null); - var storageLocationJson = idStorageLocation != null ? storageLocations[idStorageLocation] : stock_items_defineProperty({}, attrIdStorageLocation, null); - var tdPlant = document.createElement("td"); - tdPlant.classList.add(flagPlant); - DOM.setElementAttributesValuesCurrentAndPrevious(tdPlant, plantJson[attrIdPlant]); - var ddlPlant = document.createElement("select"); - ddlPlant.classList.add(flagPlant); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlPlant, plantJson[attrIdPlant]); - optionPlant = DOM.createOption(null); - if (_verbose) { - console.log("optionPlant: ", optionPlant); - } - ddlPlant.appendChild(optionPlant); - plantKeys.forEach(function (plantKey) { - plant = plants[plantKey]; - optionPlantJson = BusinessObjects.getOptionJsonFromObjectJson(plant, - // objectJson - plantJson[attrIdPlant] // valueSelected - ); - optionPlant = DOM.createOption(optionPlantJson); - if (_verbose) { - console.log("optionPlant: ", optionPlant); - } - ddlPlant.appendChild(optionPlant); - }); - var tdStorageLocation = document.createElement("td"); - tdStorageLocation.classList.add(flagStorageLocation); - DOM.setElementAttributesValuesCurrentAndPrevious(tdStorageLocation, storageLocationJson[attrIdStorageLocation]); - var ddlStorageLocation = document.createElement("select"); - ddlStorageLocation.classList.add(flagStorageLocation); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlStorageLocation, storageLocationJson[attrIdStorageLocation]); - optionStorageLocation = DOM.createOption(null); - if (_verbose) { - console.log("optionStorageLocation: ", optionStorageLocation); - } - ddlStorageLocation.appendChild(optionStorageLocation); - storageLocationKeys.forEach(function (StorageLocationKey) { - storageLocation = storageLocations[StorageLocationKey]; - optionStorageLocationJson = BusinessObjects.getOptionJsonFromObjectJson(storageLocation, - // objectJson - storageLocationJson[attrIdStorageLocation] // valueSelected - ); - optionStorageLocation = DOM.createOption(optionStorageLocationJson); - if (_verbose) { - console.log("optionStorageLocation: ", optionStorageLocation); - } - ddlStorageLocation.appendChild(optionStorageLocation); - }); - var trBody = document.createElement("tr"); - tdPlant.appendChild(ddlPlant); - trBody.appendChild(tdPlant); - tdStorageLocation.appendChild(ddlStorageLocation); - trBody.appendChild(tdStorageLocation); - tbody.appendChild(trBody); - tblStorageLocation.appendChild(tbody); - var tdParent = DOM.getCellFromElement(element); - tdParent.innerHTML = ''; - tdParent.appendChild(tblStorageLocation); - if (_verbose) { - console.log("tblStorageLocation: ", tblStorageLocation); - } - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPlant + ' select', function (event, element) { - _this4.handleChangeStoragePlantDdl(event, element); - }); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagStorageLocation + ' select', function (event, element) { - _this4.handleChangeStorageLocationDdl(event, element); - }); - } - }, { - key: "handleChangeStoragePlantDdl", - value: function handleChangeStoragePlantDdl(event, ddlPlant) { - this.handleChangeNestedElementCellTable(event, ddlPlant); - var row = DOM.getRowFromElement(ddlPlant); - var ddlStorageLocation = row.querySelector('td.' + flagStorageLocation + ' select'); - ddlStorageLocation.innerHTML = ''; - ddlStorageLocation.appendChild(DOM.createOption(null)); - var idPlant = DOM.getElementValueCurrent(ddlPlant); - var storageLocations = plants[idPlant][flagStorageLocations]; - var optionJson, option; - storageLocations.forEach(function (storageLocation) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(storageLocation); - option = DOM.createOption(optionJson); - ddlStorageLocation.appendChild(option); - }); - this.handleChangeNestedElementCellTable(event, ddlStorageLocation); - } - }, { - key: "handleChangeStorageLocationDdl", - value: function handleChangeStorageLocationDdl(event, ddlStorageLocation) { - this.handleChangeNestedElementCellTable(event, ddlStorageLocation); - } - }, { - key: "hookupSealingInputs", - value: function hookupSealingInputs() { - this.hookupIsSealedFields(); - this.hookupDateUnsealedInputs(); - } - }, { - key: "hookupIsSealedFields", - value: function hookupIsSealedFields() { - var _this5 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsSealed + ' input', function (event, element) { - _this5.handleChangeNestedElementCellTable(event, element); - var isSealed = DOM.getElementValueCurrent(element); - var row = DOM.getRowFromElement(element); - var inputDateUnsealed = row.querySelector('td.' + flagDateUnsealed + ' input'); - if (isSealed) { - inputDateUnsealed.classList.add(flagCollapsed); - } else { - inputDateUnsealed.classList.remove(flagCollapsed); - } - }); - } - }, { - key: "hookupDateUnsealedInputs", - value: function hookupDateUnsealedInputs() { - this.hookupChangeHandlerTableCellsWhenNotCollapsed("change", idTableMain + ' td.' + flagDateUnsealed + ' input'); - } - }, { - key: "hookupExpirationDateInputs", - value: function hookupExpirationDateInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDateExpiration + ' input'); - } - }, { - key: "hookupConsumationInputs", - value: function hookupConsumationInputs() { - this.hookupIsConsumedFields(); - this.hookupDateConsumedInputs(); - } - }, { - key: "hookupIsConsumedFields", - value: function hookupIsConsumedFields() { - var _this6 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsConsumed + ' input', function (event, element) { - _this6.handleChangeNestedElementCellTable(event, element); - var isConsumed = DOM.getElementValueCurrent(element); - var row = DOM.getRowFromElement(element); - var inputDateConsumed = row.querySelector('td.' + flagDateConsumed + ' input'); - if (isConsumed) { - inputDateConsumed.classList.remove(flagCollapsed); - } else { - inputDateConsumed.classList.add(flagCollapsed); - } - }); - } - }, { - key: "hookupDateConsumedInputs", - value: function hookupDateConsumedInputs() { - this.hookupChangeHandlerTableCellsWhenNotCollapsed("change", idTableMain + ' td.' + flagDateConsumed + ' input'); - } - }, { - key: "leave", - value: function leave() { - stock_items_superPropGet(PageStoreStockItems, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -stock_items_defineProperty(PageStoreStockItems, "hash", hashPageStoreStockItems); -stock_items_defineProperty(PageStoreStockItems, "attrIdRowObject", attrIdStockItem); - -;// CONCATENATED MODULE: ./static/js/pages/store/suppliers.js -function suppliers_typeof(o) { "@babel/helpers - typeof"; return suppliers_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, suppliers_typeof(o); } -function suppliers_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function suppliers_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, suppliers_toPropertyKey(o.key), o); } } -function suppliers_createClass(e, r, t) { return r && suppliers_defineProperties(e.prototype, r), t && suppliers_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function suppliers_callSuper(t, o, e) { return o = suppliers_getPrototypeOf(o), suppliers_possibleConstructorReturn(t, suppliers_isNativeReflectConstruct() ? Reflect.construct(o, e || [], suppliers_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function suppliers_possibleConstructorReturn(t, e) { if (e && ("object" == suppliers_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return suppliers_assertThisInitialized(t); } -function suppliers_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function suppliers_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (suppliers_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function suppliers_superPropGet(t, e, o, r) { var p = suppliers_get(suppliers_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function suppliers_get() { return suppliers_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = suppliers_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, suppliers_get.apply(null, arguments); } -function suppliers_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = suppliers_getPrototypeOf(t));); return t; } -function suppliers_getPrototypeOf(t) { return suppliers_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, suppliers_getPrototypeOf(t); } -function suppliers_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && suppliers_setPrototypeOf(t, e); } -function suppliers_setPrototypeOf(t, e) { return suppliers_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, suppliers_setPrototypeOf(t, e); } -function suppliers_defineProperty(e, r, t) { return (r = suppliers_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function suppliers_toPropertyKey(t) { var i = suppliers_toPrimitive(t, "string"); return "symbol" == suppliers_typeof(i) ? i : i + ""; } -function suppliers_toPrimitive(t, r) { if ("object" != suppliers_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != suppliers_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - -var PageStoreSuppliers = /*#__PURE__*/function (_TableBasePage) { - function PageStoreSuppliers(router) { - var _this; - suppliers_classCallCheck(this, PageStoreSuppliers); - _this = suppliers_callSuper(this, PageStoreSuppliers, [router]); - suppliers_defineProperty(_this, "callSaveTableContent", api_API.saveSuppliers); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - suppliers_inherits(PageStoreSuppliers, _TableBasePage); - return suppliers_createClass(PageStoreSuppliers, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) {} - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - if (row == null) return; - var textareaNameCompany = row.querySelector('td.' + flagNameCompany + ' textarea'); - var textareaNameContact = row.querySelector('td.' + flagNameContact + ' textarea'); - var textareaDepartmentContact = row.querySelector('td.' + flagDepartmentContact + ' textarea'); - var tdAddress = row.querySelector('td.' + flagAddress); - var textareaPhoneNumber = row.querySelector('td.' + flagPhoneNumber + ' textarea'); - var textareaFax = row.querySelector('td.' + flagFax + ' textarea'); - var textareaEmail = row.querySelector('td.' + flagEmail + ' textarea'); - var textareaWebsite = row.querySelector('td.' + flagWebsite + ' textarea'); - var tdCurrency = row.querySelector('td.' + flagCurrency); - var buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdSupplier] = row.getAttribute(attrIdSupplier); - jsonRow[flagNameCompany] = DOM.getElementAttributeValueCurrent(textareaNameCompany); - jsonRow[flagNameContact] = DOM.getElementAttributeValueCurrent(textareaNameContact); - jsonRow[flagDepartmentContact] = DOM.getElementAttributeValueCurrent(textareaDepartmentContact); - jsonRow[attrIdSupplierAddress] = DOM.getElementAttributeValueCurrent(tdAddress); - jsonRow[flagSupplierAddress] = this.getSupplierAddressesFromRow(row); - jsonRow[flagPhoneNumber] = DOM.getElementAttributeValueCurrent(textareaPhoneNumber); - jsonRow[flagFax] = DOM.getElementAttributeValueCurrent(textareaFax); - jsonRow[flagEmail] = DOM.getElementAttributeValueCurrent(textareaEmail); - jsonRow[flagWebsite] = DOM.getElementAttributeValueCurrent(textareaWebsite); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "getSupplierAddressesFromRow", - value: function getSupplierAddressesFromRow(row) { - var supplierAddresses = []; - var trs = row.querySelectorAll('td.' + flagAddress + ' tbody tr'); - var address, inputPostcode, inputAddressLine1, inputAddressLine2, inputCity, inputCounty, ddlRegion, inputActive; - trs.forEach(function (tr) { - inputPostcode = tr.querySelector('td.' + flagPostcode + ' textarea'); - inputAddressLine1 = tr.querySelector('td.' + flagAddressLine1 + ' textarea'); - inputAddressLine2 = tr.querySelector('td.' + flagAddressLine2 + ' textarea'); - inputCity = tr.querySelector('td.' + flagCity + ' textarea'); - inputCounty = tr.querySelector('td.' + flagCounty + ' textarea'); - ddlRegion = tr.querySelector('td.' + flagRegion + ' select'); - inputActive = tr.querySelector('td.' + flagActive + ' input'); - address = suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty({}, attrIdSupplierAddress, tr.getAttribute(attrIdSupplierAddress)), attrIdSupplier, row.getAttribute(attrIdSupplier)), flagPostcode, DOM.getElementAttributeValueCurrent(inputPostcode)), flagAddressLine1, DOM.getElementAttributeValueCurrent(inputAddressLine1)), flagAddressLine2, DOM.getElementAttributeValueCurrent(inputAddressLine2)), flagCity, DOM.getElementAttributeValueCurrent(inputCity)), flagCounty, DOM.getElementAttributeValueCurrent(inputCounty)), attrIdRegion, DOM.getElementAttributeValueCurrent(ddlRegion)), flagActive, DOM.getElementAttributeValueCurrent(inputActive)); - supplierAddresses.push(address); - }); - return supplierAddresses; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - suppliers_superPropGet(PageStoreSuppliers, "initialiseRowNew", this, 3)([tbody, row]); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - suppliers_superPropGet(PageStoreSuppliers, "hookupTableMain", this, 3)([]); - this.hookupNameCompanyInputs(); - this.hookupNameContactInputs(); - this.hookupDepartmentContactInputs(); - this.hookupAddressFields(); - this.hookupPhoneNumberInputs(); - this.hookupFaxInputs(); - this.hookupEmailInputs(); - this.hookupWebsiteInputs(); - this.hookupCurrencyFields(); - this.hookupFieldsActive(); - } - }, { - key: "hookupNameCompanyInputs", - value: function hookupNameCompanyInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameCompany + ' textarea'); - } - }, { - key: "hookupNameContactInputs", - value: function hookupNameContactInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameContact + ' textarea'); - } - }, { - key: "hookupDepartmentContactInputs", - value: function hookupDepartmentContactInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDepartmentContact + ' textarea'); - } - }, { - key: "hookupAddressFields", - value: function hookupAddressFields() { - this.hookupAddressPreviews(); - this.hookupAddressPostcodeInputs(); - this.hookupAddressLine1Inputs(); - this.hookupAddressLine2Inputs(); - this.hookupAddressCityInputs(); - this.hookupAddressCountyInputs(); - this.hookupAddressRegionDdls(); - this.hookupAddressActiveCheckboxes(); - this.hookupAddressDeleteButtons(); - this.hookupAddressUndeleteButtons(); - this.hookupAddressAddButtons(); - } - }, { - key: "hookupAddressPreviews", - value: function hookupAddressPreviews() { - var _this2 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress, function (event, td) { - if (!td.classList.contains(flagCollapsed)) return; - _this2.handleClickAddressPreview(event, td); - }); - } - }, { - key: "handleClickAddressPreview", - value: function handleClickAddressPreview(event, element) { - var _this3 = this; - if (_verbose) { - console.log("click address preview"); - } - this.toggleColumnHeaderCollapsed(flagAddress, false); - element.classList.remove(flagCollapsed); - var row = DOM.getRowFromElement(element); - var idSupplier = row.getAttribute(attrIdSupplier); - var supplierAddressList = idSupplier > 0 ? supplierAddresses[idSupplier] : []; - var tblAddresses = document.createElement("table"); - tblAddresses.classList.add(flagAddress); - var thead = document.createElement("thead"); - var tr = document.createElement("tr"); - var thPostcode = document.createElement("th"); - thPostcode.classList.add(flagPostcode); - thPostcode.textContent = 'Postcode'; - var thAddressLine1 = document.createElement("th"); - thAddressLine1.classList.add(flagAddressLine1); - thAddressLine1.textContent = 'Address Line 1'; - var thAddressLine2 = document.createElement("th"); - thAddressLine2.classList.add(flagAddressLine2); - thAddressLine2.textContent = 'Address Line 2'; - var thCity = document.createElement("th"); - thCity.classList.add(flagCity); - thCity.textContent = 'City'; - var thCounty = document.createElement("th"); - thCounty.classList.add(flagCounty); - thCounty.textContent = 'County'; - var thRegion = document.createElement("th"); - thRegion.classList.add(flagRegion); - thRegion.textContent = 'Region'; - var thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - var thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - tr.appendChild(thPostcode); - tr.appendChild(thAddressLine1); - tr.appendChild(thAddressLine2); - tr.appendChild(thCity); - tr.appendChild(thCounty); - tr.appendChild(thRegion); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblAddresses.appendChild(thead); - var tbody = document.createElement("tbody"); - var regionOptions = Utils.getListFromDict(regions); - supplierAddressList.forEach(function (supplierAddress, index) { - _this3.addRowSupplierAddress(tbody, supplierAddress, regionOptions); - }); - tblAddresses.appendChild(tbody); - var cell = DOM.getCellFromElement(element); - var cellNew = cell.cloneNode(false); - cellNew.appendChild(tblAddresses); - row.replaceChild(cellNew, cell); - if (_verbose) { - console.log("tblAddresses: ", tblAddresses); - } - this.hookupAddressFields(); - } - }, { - key: "addRowSupplierAddress", - value: function addRowSupplierAddress(tbody, supplierAddress, regionOptions) { - if (_verbose) { - console.log("addRowSupplierAddress: ", supplierAddress); - } - var tdPostcode = document.createElement("td"); - tdPostcode.classList.add(flagPostcode); - var textareaPostcode = document.createElement("textarea"); - textareaPostcode.classList.add(flagPostcode); - DOM.setElementValuesCurrentAndPrevious(textareaPostcode, supplierAddress[flagPostcode]); - tdPostcode.appendChild(textareaPostcode); - var tdAddressLine1 = document.createElement("td"); - tdAddressLine1.classList.add(flagAddressLine1); - var textareaAddressLine1 = document.createElement("textarea"); - textareaAddressLine1.classList.add(flagAddressLine1); - DOM.setElementValuesCurrentAndPrevious(textareaAddressLine1, supplierAddress[flagAddressLine1]); - tdAddressLine1.appendChild(textareaAddressLine1); - var tdAddressLine2 = document.createElement("td"); - tdAddressLine2.classList.add(flagAddressLine2); - var textareaAddressLine2 = document.createElement("textarea"); - textareaAddressLine2.classList.add(flagAddressLine2); - DOM.setElementValuesCurrentAndPrevious(textareaAddressLine2, supplierAddress[flagAddressLine2]); - tdAddressLine2.appendChild(textareaAddressLine2); - var tdCity = document.createElement("td"); - tdCity.classList.add(flagCity); - var textareaCity = document.createElement("textarea"); - textareaCity.classList.add(flagCity); - DOM.setElementValuesCurrentAndPrevious(textareaCity, supplierAddress[flagCity]); - tdCity.appendChild(textareaCity); - var tdCounty = document.createElement("td"); - tdCounty.classList.add(flagCounty); - var textareaCounty = document.createElement("textarea"); - textareaCounty.classList.add(flagCounty); - DOM.setElementValuesCurrentAndPrevious(textareaCounty, supplierAddress[flagCounty]); - tdCounty.appendChild(textareaCounty); - var region = supplierAddress[flagRegion]; - if (!region) region = suppliers_defineProperty({}, attrIdRegion, ''); - var tdRegion = document.createElement("td"); - tdRegion.classList.add(flagRegion); - DOM.setElementAttributesValuesCurrentAndPrevious(tdRegion, region[attrIdRegion]); - var ddlRegion = document.createElement("select"); - ddlRegion.classList.add(flagRegion); - var optionJson, option; - option = DOM.createOption(null); - ddlRegion.appendChild(option); - regionOptions.forEach(function (regionOption) { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(regionOption); - option = DOM.createOption(optionJson); - ddlRegion.appendChild(option); - }); - DOM.setElementValuesCurrentAndPrevious(ddlRegion, region[attrIdRegion]); - tdRegion.appendChild(ddlRegion); - var tdActive = this.createTdActive(supplierAddress[flagActive]); - var tr = document.createElement("tr"); - tr.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); - tr.setAttribute(attrIdSupplier, supplierAddress[attrIdSupplier]); - tr.appendChild(tdPostcode); - tr.appendChild(tdAddressLine1); - tr.appendChild(tdAddressLine2); - tr.appendChild(tdCity); - tr.appendChild(tdCounty); - tr.appendChild(tdRegion); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - }, { - key: "hookupAddressPostcodeInputs", - value: function hookupAddressPostcodeInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagPostcode); - } - }, { - key: "hookupAddressLine1Inputs", - value: function hookupAddressLine1Inputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine1); - } - }, { - key: "hookupAddressLine2Inputs", - value: function hookupAddressLine2Inputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine2); - } - }, { - key: "hookupAddressCityInputs", - value: function hookupAddressCityInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCity); - } - }, { - key: "hookupAddressCountyInputs", - value: function hookupAddressCountyInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCounty); - } - }, { - key: "hookupAddressRegionDdls", - value: function hookupAddressRegionDdls() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' select.' + flagRegion); - } - }, { - key: "hookupAddressActiveCheckboxes", - value: function hookupAddressActiveCheckboxes() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' input.' + flagActive, function (event, element) { - var rowSupplierAddress = element.closest('tr'); - var idAddress = rowSupplierAddress.getAttribute(attrIdSupplierAddress); - DOM.setElementAttributeValueCurrent(rowSupplierAddress, idAddress); - var rowSupplier = rowSupplierAddress.closest(idTableMain + ' > tbody > tr'); - var checkboxesActive = rowSupplier.querySelectorAll('td.' + flagAddress + ' input.' + flagActive); - var isActive = element.checked; - if (isActive) { - checkboxesActive.forEach(function (checkbox) { - if (checkbox == element) return; - DOM.setElementValueCurrent(checkbox, false); - }); - } - /* - else if (checkboxesActive.length > 0) { - DOM.setElementValueCurrent(checkboxesActive[0], false); - } - */ - }); - } - }, { - key: "hookupFieldsAddressAddDelete", - value: function hookupFieldsAddressAddDelete() { - var selectorButton = idTableMain + ' td.' + flagAddress + ' button'; - var selectorButtonDelete = selectorButton + '.' + flagDelete; - var selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - } - }, { - key: "hookupAddressDeleteButtons", - value: function hookupAddressDeleteButtons() { - var _this4 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' button.' + flagDelete, function (event, element) { - var row = DOM.getRowFromElement(element); - row.classList.add(flagDelete); - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - element.replaceWith(buttonAdd); - _this4.hookupAddressUndeleteButtons(); - }); - } - }, { - key: "hookupAddressUndeleteButtons", - value: function hookupAddressUndeleteButtons() { - var _this5 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' td button.' + flagAdd, function (event, element) { - var row = DOM.getRowFromElement(element); - row.classList.remove(flagDelete); - var buttonDelete = document.createElement("button"); - buttonDelete.classList.add(flagDelete); - buttonDelete.textContent = 'x'; - element.replaceWith(buttonDelete); - _this5.hookupAddressDeleteButtons(); - }); - } - }, { - key: "hookupAddressAddButtons", - value: function hookupAddressAddButtons() { - var _this6 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' th button.' + flagAdd, function (event, element) { - var row = element.closest(idTableMain + ' > tbody > tr'); - var idSupplier = row.getAttribute(attrIdSupplier); - var hasActiveAddress = row.querySelectorAll('td.' + flagAddress + ' input.' + flagActive + ':checked').length > 0; - var countSupplierAddresses = row.querySelectorAll('td.' + flagAddress + ' td.' + flagAddress).length; - var supplierAddress = suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty(suppliers_defineProperty({}, attrIdSupplier, idSupplier), attrIdSupplierAddress, -1 - countSupplierAddresses), flagPostcode, ''), flagAddressLine1, ''), flagAddressLine2, ''), flagCity, ''), flagCounty, ''), attrIdRegion, ''), flagActive, !hasActiveAddress); - var tbody = row.querySelector('td.' + flagAddress + ' table tbody'); - _this6.addRowSupplierAddress(tbody, supplierAddress, Utils.getListFromDict(regions)); - if (!hasActiveAddress) { - var tdAddress = row.querySelector('td.' + flagAddress); - // tdAddress.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); - DOM.setElementAttributeValueCurrent(tdAddress, supplierAddress[attrIdSupplierAddress]); - } - _this6.hookupAddressFields(); - }); - } - }, { - key: "hookupPhoneNumberInputs", - value: function hookupPhoneNumberInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPhoneNumber + ' textarea'); - } - }, { - key: "hookupFaxInputs", - value: function hookupFaxInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagFax + ' textarea'); - } - }, { - key: "hookupEmailInputs", - value: function hookupEmailInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagEmail + ' textarea'); - } - }, { - key: "hookupWebsiteInputs", - value: function hookupWebsiteInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagWebsite + ' textarea'); - } - }, { - key: "leave", - value: function leave() { - suppliers_superPropGet(PageStoreSuppliers, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -suppliers_defineProperty(PageStoreSuppliers, "hash", hashPageStoreSuppliers); -suppliers_defineProperty(PageStoreSuppliers, "attrIdRowObject", attrIdSupplier); - -;// CONCATENATED MODULE: ./static/js/pages/store/supplier_purchase_orders.js -function supplier_purchase_orders_typeof(o) { "@babel/helpers - typeof"; return supplier_purchase_orders_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, supplier_purchase_orders_typeof(o); } -function supplier_purchase_orders_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -function supplier_purchase_orders_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, supplier_purchase_orders_toPropertyKey(o.key), o); } } -function supplier_purchase_orders_createClass(e, r, t) { return r && supplier_purchase_orders_defineProperties(e.prototype, r), t && supplier_purchase_orders_defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } -function supplier_purchase_orders_callSuper(t, o, e) { return o = supplier_purchase_orders_getPrototypeOf(o), supplier_purchase_orders_possibleConstructorReturn(t, supplier_purchase_orders_isNativeReflectConstruct() ? Reflect.construct(o, e || [], supplier_purchase_orders_getPrototypeOf(t).constructor) : o.apply(t, e)); } -function supplier_purchase_orders_possibleConstructorReturn(t, e) { if (e && ("object" == supplier_purchase_orders_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return supplier_purchase_orders_assertThisInitialized(t); } -function supplier_purchase_orders_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } -function supplier_purchase_orders_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (supplier_purchase_orders_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function supplier_purchase_orders_superPropGet(t, e, o, r) { var p = supplier_purchase_orders_get(supplier_purchase_orders_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } -function supplier_purchase_orders_get() { return supplier_purchase_orders_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = supplier_purchase_orders_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, supplier_purchase_orders_get.apply(null, arguments); } -function supplier_purchase_orders_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = supplier_purchase_orders_getPrototypeOf(t));); return t; } -function supplier_purchase_orders_getPrototypeOf(t) { return supplier_purchase_orders_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, supplier_purchase_orders_getPrototypeOf(t); } -function supplier_purchase_orders_inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && supplier_purchase_orders_setPrototypeOf(t, e); } -function supplier_purchase_orders_setPrototypeOf(t, e) { return supplier_purchase_orders_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, supplier_purchase_orders_setPrototypeOf(t, e); } -function supplier_purchase_orders_defineProperty(e, r, t) { return (r = supplier_purchase_orders_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function supplier_purchase_orders_toPropertyKey(t) { var i = supplier_purchase_orders_toPrimitive(t, "string"); return "symbol" == supplier_purchase_orders_typeof(i) ? i : i + ""; } -function supplier_purchase_orders_toPrimitive(t, r) { if ("object" != supplier_purchase_orders_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != supplier_purchase_orders_typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - - - - - - - - - -var PageStoreSupplierPurchaseOrders = /*#__PURE__*/function (_TableBasePage) { - function PageStoreSupplierPurchaseOrders(router) { - var _this; - supplier_purchase_orders_classCallCheck(this, PageStoreSupplierPurchaseOrders); - _this = supplier_purchase_orders_callSuper(this, PageStoreSupplierPurchaseOrders, [router]); - supplier_purchase_orders_defineProperty(_this, "callSaveTableContent", api_API.saveSupplierPurchaseOrders); - _this.storeMixin = new StoreTableMixinPage(_this); - return _this; - } - supplier_purchase_orders_inherits(PageStoreSupplierPurchaseOrders, _TableBasePage); - return supplier_purchase_orders_createClass(PageStoreSupplierPurchaseOrders, [{ - key: "initialize", - value: function initialize() { - this.sharedInitialize(); - } - }, { - key: "hookupFilters", - value: function hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - }, { - key: "loadRowTable", - value: function loadRowTable(rowJson) {} - }, { - key: "getJsonRow", - value: function getJsonRow(row) { - var _this2 = this; - if (row == null) return; - var tdSupplier = row.querySelector('td.' + flagSupplier); - var tdCurrency = row.querySelector('td.' + flagCurrency); - var inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - var inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - var trsPurchaseOrderItem = row.querySelectorAll('tr.' + flagOrderItems); - var buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdSupplierPurchaseOrder] = row.getAttribute(attrIdSupplierPurchaseOrder); - jsonRow[attrIdSupplier] = DOM.getElementAttributeValueCurrent(tdSupplier); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - // jsonRow[flagOrderItems] = DOM.getElementAttributeValueCurrent(tdItems); - var orderItems = []; - if (trsPurchaseOrderItem != null) { - trsPurchaseOrderItem.forEach(function (tr) { - orderItems.push(_this2.getJsonRowOrderItem(tr)); - }); - } - jsonRow[flagOrderItems] = orderItems; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "getJsonRowOrderItem", - value: function getJsonRowOrderItem(tr) { - var inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - var tdCategory = tr.querySelector('td.' + flagProductCategory); - var tdProduct = tr.querySelector('td.' + flagProduct); - var tdVariations = tr.querySelector('td.' + flagProductVariations); - var tdUnitQuantity = tr.querySelector('td.' + flagUnitMeasurementQuantity); - var inputQuantityOrdered = tr.querySelector('td.' + flagQuantityOrdered + ' input'); - var inputQuantityReceived = tr.querySelector('td.' + flagQuantityReceived + ' input'); - var inputCostTotalLocalVatExcl = tr.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - var inputCostTotalLocalVatIncl = tr.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - var inputLatencyDeliveryDays = tr.querySelector('td.' + flagLatencyDeliveryDays + ' input'); - var buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - var jsonRow = {}; - jsonRow[attrIdSupplierPurchaseOrder] = tr.getAttribute(attrIdSupplierPurchaseOrder); - jsonRow[attrIdSupplierPurchaseOrderProductLink] = tr.getAttribute(attrIdSupplierPurchaseOrderProductLink); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdVariations); - jsonRow[attrIdUnitMeasurementQuantity] = DOM.getElementAttributeValueCurrent(tdUnitQuantity); - jsonRow[flagQuantityOrdered] = DOM.getElementAttributeValueCurrent(inputQuantityOrdered); - jsonRow[flagQuantityReceived] = DOM.getElementAttributeValueCurrent(inputQuantityReceived); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - jsonRow[flagLatencyDeliveryDays] = DOM.getElementAttributeValueCurrent(inputLatencyDeliveryDays); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - }, { - key: "initialiseRowNew", - value: function initialiseRowNew(tbody, row) { - supplier_purchase_orders_superPropGet(PageStoreSupplierPurchaseOrders, "initialiseRowNew", this, 3)([tbody, row]); - } - }, { - key: "hookupTableMain", - value: function hookupTableMain() { - supplier_purchase_orders_superPropGet(PageStoreSupplierPurchaseOrders, "hookupTableMain", this, 3)([]); - this.hookupSupplierFields(); - this.hookupCurrencyFields(); - this.hookupCostInputs(); - this.hookupOrderItemsFields(); - this.hookupFieldsActive(); - } - }, { - key: "hookupSupplierFields", - value: function hookupSupplierFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagSupplier, Utils.getListFromDict(suppliers)); - } - }, { - key: "hookupCostInputs", - value: function hookupCostInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); - } - }, { - key: "hookupOrderItemsFields", - value: function hookupOrderItemsFields() { - this.hookupOrderItemsPreviews(); - this.hookupFieldsOrderItemDisplayOrder(); - this.hookupFieldsOrderItemProductCategory(); - this.hookupFieldsOrderItemProduct(); - // this.hookupFieldsOrderItemProductVariations(); - this.hookupFieldsProductPermutationVariation(); - this.hookupFieldsOrderItemUnitQuantity(); - this.hookupFieldsOrderItemQuantityOrdered(); - this.hookupFieldsOrderItemQuantityReceived(); - this.hookupFieldsOrderItemCostTotalLocalVatExcl(); - this.hookupFieldsOrderItemCostTotalLocalVatIncl(); - this.hookupFieldsOrderItemLatencyDeliveryDays(); - this.hookupFieldsOrderItemActive(); - this.hookupFieldsOrderItemAddDelete(); - } - }, { - key: "hookupOrderItemsPreviews", - value: function hookupOrderItemsPreviews() { - var _this3 = this; - this.hookupEventHandler("click", idTableMain + ' > tbody > tr > td.' + flagOrderItems + ' > div', function (event, div) { - var td = DOM.getCellFromElement(div); - if (!td.classList.contains(flagCollapsed)) return; - _this3.handleClickOrderItemsPreview(event, div); - }); - } - }, { - key: "handleClickOrderItemsPreview", - value: function handleClickOrderItemsPreview(event, element) { - var _this4 = this; - if (_verbose) { - console.log("click order items preview"); - } - this.toggleColumnHeaderCollapsed(flagOrderItems, false); - /* - let td = DOM.getCellFromElement(element); - td.classList.remove(flagCollapsed); - */ - - var row = DOM.getRowFromElement(element); - var idSupplierPurchaseOrder = row.getAttribute(attrIdSupplierPurchaseOrder); - // if (idSupplierPurchaseOrder == null || idSupplierPurchaseOrder < 1) return; - var supplierPurchaseOrder = supplierPurchaseOrders[idSupplierPurchaseOrder]; - if (supplierPurchaseOrder == null) supplierPurchaseOrder = supplier_purchase_orders_defineProperty({}, flagOrderItems, []); - var tblOrderItems = document.createElement("table"); - tblOrderItems.classList.add(flagOrderItems); - var thead = document.createElement("thead"); - var tr = document.createElement("tr"); - var thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - var thCategory = document.createElement("th"); - thCategory.classList.add(flagProductCategory); - thCategory.textContent = 'Category'; - var thProduct = document.createElement("th"); - thProduct.classList.add(flagProduct); - thProduct.textContent = 'Product'; - var thVariations = document.createElement("th"); - thVariations.classList.add(flagProductVariations); - thVariations.classList.add(flagCollapsed); - thVariations.textContent = 'Variations'; - var thUnitQuantity = document.createElement("th"); - thUnitQuantity.classList.add(flagUnitMeasurementQuantity); - thUnitQuantity.textContent = 'Unit Quantity'; - var thQuantityOrdered = document.createElement("th"); - thQuantityOrdered.classList.add(flagQuantityOrdered); - thQuantityOrdered.textContent = 'Quantity Ordered'; - var thQuantityReceived = document.createElement("th"); - thQuantityReceived.classList.add(flagQuantityReceived); - thQuantityReceived.textContent = 'Quantity Received'; - var thCostTotalLocalVatExcl = document.createElement("th"); - thCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - thCostTotalLocalVatExcl.textContent = 'Cost Total Local VAT Excl'; - var thCostTotalLocalVatIncl = document.createElement("th"); - thCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - thCostTotalLocalVatIncl.textContent = 'Cost Total Local VAT Incl'; - var thCostUnitLocalVatExcl = document.createElement("th"); - thCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - thCostUnitLocalVatExcl.textContent = 'Cost Unit Local VAT Excl'; - var thCostUnitLocalVatIncl = document.createElement("th"); - thCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - thCostUnitLocalVatIncl.textContent = 'Cost Unit Local VAT Incl'; - var thLatencyDeliveryDays = document.createElement("th"); - thLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - thLatencyDeliveryDays.textContent = 'Latency Delivery (Days)'; - var thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - var thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - var buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - tr.appendChild(thDisplayOrder); - tr.appendChild(thCategory); - tr.appendChild(thProduct); - tr.appendChild(thVariations); - tr.appendChild(thUnitQuantity); - tr.appendChild(thQuantityOrdered); - tr.appendChild(thQuantityReceived); - tr.appendChild(thCostTotalLocalVatExcl); - tr.appendChild(thCostTotalLocalVatIncl); - tr.appendChild(thCostUnitLocalVatExcl); - tr.appendChild(thCostUnitLocalVatIncl); - tr.appendChild(thLatencyDeliveryDays); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblOrderItems.appendChild(thead); - var tbody = document.createElement("tbody"); - supplierPurchaseOrder[flagOrderItems].forEach(function (orderItem, index) { - _this4.addRowSupplierPurchaseOrderItem(tbody, orderItem); - }); - tblOrderItems.appendChild(tbody); - var cell = DOM.getCellFromElement(element); - var cellNew = cell.cloneNode(false); - cellNew.appendChild(tblOrderItems); - cellNew.classList.remove(flagCollapsed); - row.replaceChild(cellNew, cell); - if (_verbose) { - console.log("tblOrderItems: ", tblOrderItems); - } - this.hookupOrderItemsFields(); - } - }, { - key: "addRowSupplierPurchaseOrderItem", - value: function addRowSupplierPurchaseOrderItem(tbody, orderItem) { - // productVariationTypeOptions, productVariationOptions, productCategoryOptions, productOptions, unitMeasurementOptions, - if (_verbose) { - console.log("addRowSupplierPurchaseOrderItem: ", orderItem); - } - var tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - var inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, orderItem[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - var tdCategory = document.createElement("td"); - tdCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCategory, orderItem[attrIdProductCategory]); - var divCategory = document.createElement("div"); - divCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(divCategory, orderItem[attrIdProductCategory]); - // divCategory.textContent = orderItem[flagProductCategory]; - var productCategory = productCategories[orderItem[attrIdProductCategory]]; - divCategory.textContent = BusinessObjects.getObjectText(productCategory); - tdCategory.appendChild(divCategory); - var tdProduct = document.createElement("td"); - tdProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(tdProduct, orderItem[attrIdProduct]); - var divProduct = document.createElement("div"); - divProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(divProduct, orderItem[attrIdProduct]); - // divProduct.textContent = orderItem[flagProduct]; - var product = products[orderItem[attrIdProduct]]; - divProduct.textContent = BusinessObjects.getObjectText(product); - tdProduct.appendChild(divProduct); - var tdVariations = document.createElement("td"); - tdVariations.classList.add(flagProductVariations); - tdVariations.classList.add(flagCollapsed); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariations, orderItem[flagProductVariations]); - var divVariations = document.createElement("div"); - divVariations.classList.add(flagProductVariations); - DOM.setElementAttributesValuesCurrentAndPrevious(divVariations, orderItem[flagProductVariations]); - // divVariations.textContent = orderItem[flagProductVariations]; - var variationsText = ProductPermutation.getProductVariationsPreviewFromIdCsv(orderItem[flagProductVariations]); - divVariations.textContent = variationsText; - tdVariations.appendChild(divVariations); - var tdUnitQuantity = document.createElement("td"); - tdUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitQuantity, orderItem[attrIdUnitMeasurementQuantity]); - var divUnitQuantity = document.createElement("div"); - divUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(divUnitQuantity, orderItem[attrIdUnitMeasurementQuantity]); - var unitQuantity = unitMeasurements[orderItem[attrIdUnitMeasurementQuantity]]; - divUnitQuantity.textContent = BusinessObjects.getObjectText(unitQuantity); - tdUnitQuantity.appendChild(divUnitQuantity); - var tdQuantityOrdered = document.createElement("td"); - tdQuantityOrdered.classList.add(flagQuantityOrdered); - var inputQuantityOrdered = document.createElement("input"); - inputQuantityOrdered.classList.add(flagQuantityOrdered); - inputQuantityOrdered.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityOrdered, orderItem[flagQuantityOrdered]); - tdQuantityOrdered.appendChild(inputQuantityOrdered); - var tdQuantityReceived = document.createElement("td"); - tdQuantityReceived.classList.add(flagQuantityReceived); - var inputQuantityReceived = document.createElement("input"); - inputQuantityReceived.classList.add(flagQuantityReceived); - inputQuantityReceived.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityReceived, orderItem[flagQuantityReceived]); - tdQuantityReceived.appendChild(inputQuantityReceived); - var tdCostTotalLocalVatExcl = document.createElement("td"); - tdCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - var inputCostTotalLocalVatExcl = document.createElement("input"); - inputCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - inputCostTotalLocalVatExcl.type = 'number'; - inputCostTotalLocalVatExcl.step = 0.01; - DOM.setElementValuesCurrentAndPrevious(inputCostTotalLocalVatExcl, orderItem[flagCostTotalLocalVatExcl]); - tdCostTotalLocalVatExcl.appendChild(inputCostTotalLocalVatExcl); - var tdCostTotalLocalVatIncl = document.createElement("td"); - tdCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - var inputCostTotalLocalVatIncl = document.createElement("input"); - inputCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - inputCostTotalLocalVatIncl.type = 'number'; - inputCostTotalLocalVatIncl.step = 0.01; - DOM.setElementValuesCurrentAndPrevious(inputCostTotalLocalVatIncl, orderItem[flagCostTotalLocalVatIncl]); - tdCostTotalLocalVatIncl.appendChild(inputCostTotalLocalVatIncl); - var tdCostUnitLocalVatExcl = document.createElement("td"); - tdCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - var divCostUnitLocalVatExcl = document.createElement("div"); - divCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, validation_Validation.toFixedOrDefault(orderItem[flagCostUnitLocalVatExcl], 3, null)); - tdCostUnitLocalVatExcl.appendChild(divCostUnitLocalVatExcl); - var tdCostUnitLocalVatIncl = document.createElement("td"); - tdCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - var divCostUnitLocalVatIncl = document.createElement("div"); - divCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, validation_Validation.toFixedOrDefault(orderItem[flagCostUnitLocalVatIncl], 3, null)); - tdCostUnitLocalVatIncl.appendChild(divCostUnitLocalVatIncl); - var tdLatencyDeliveryDays = document.createElement("td"); - tdLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - var inputLatencyDeliveryDays = document.createElement("input"); - inputLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - inputLatencyDeliveryDays.type = 'number'; - inputLatencyDeliveryDays.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputLatencyDeliveryDays, orderItem[flagLatencyDeliveryDays]); - tdLatencyDeliveryDays.appendChild(inputLatencyDeliveryDays); - var tdActive = this.createTdActive(orderItem[flagActive]); - var tr = document.createElement("tr"); - tr.classList.add(flagOrderItems); - tr.setAttribute(attrIdSupplierPurchaseOrder, orderItem[attrIdSupplierPurchaseOrder]); - tr.setAttribute(attrIdSupplierPurchaseOrderProductLink, orderItem[attrIdSupplierPurchaseOrderProductLink]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCategory); - tr.appendChild(tdProduct); - tr.appendChild(tdVariations); - tr.appendChild(tdUnitQuantity); - tr.appendChild(tdQuantityOrdered); - tr.appendChild(tdQuantityReceived); - tr.appendChild(tdCostTotalLocalVatExcl); - tr.appendChild(tdCostTotalLocalVatIncl); - tr.appendChild(tdCostUnitLocalVatExcl); - tr.appendChild(tdCostUnitLocalVatIncl); - tr.appendChild(tdLatencyDeliveryDays); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - }, { - key: "hookupFieldsOrderItemDisplayOrder", - value: function hookupFieldsOrderItemDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagDisplayOrder + ' input'); - } - }, { - key: "hookupFieldsOrderItemProductCategory", - value: function hookupFieldsOrderItemProductCategory() { - var _this5 = this; - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductCategory, Utils.getListFromDict(productCategories), function (cellSelector) { - _this5.hookupProductCategoryDdls(cellSelector); - }); - } - }, { - key: "hookupFieldsOrderItemProduct", - value: function hookupFieldsOrderItemProduct() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - /* - hookupFieldsOrderItemProductVariations() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductVariations, (event, element) => this.handleClickProductPermutationVariationsPreview(event, element)); - } - hookupDdlsProductPermutationVariation() { - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation); - } - hookupDdlsProductPermutationVariationType() { - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariationType); - } - */ - }, { - key: "hookupFieldsOrderItemUnitQuantity", - value: function hookupFieldsOrderItemUnitQuantity() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementQuantity, Utils.getListFromDict(unitMeasurements)); - } - }, { - key: "hookupFieldsOrderItemQuantityOrdered", - value: function hookupFieldsOrderItemQuantityOrdered() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityOrdered + ' input'); - } - }, { - key: "hookupFieldsOrderItemQuantityReceived", - value: function hookupFieldsOrderItemQuantityReceived() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityReceived + ' input'); - } - }, { - key: "hookupFieldsOrderItemCostTotalLocalVatExcl", - value: function hookupFieldsOrderItemCostTotalLocalVatExcl() { - var _this6 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatExcl + ' input', function (event, element) { - _this6.handleChangeNestedElementCellTable(event, element); // flagCostTotalLocalVatExcl); - _this6.updateFieldsCostUnitLocalVatExcl(element); - }); - } - }, { - key: "hookupFieldsOrderItemCostTotalLocalVatIncl", - value: function hookupFieldsOrderItemCostTotalLocalVatIncl() { - var _this7 = this; - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatIncl + ' input', function (event, element) { - _this7.handleChangeNestedElementCellTable(event, element); // flagCostTotalLocalVatIncl); - _this7.updateFieldsCostUnitLocalVatIncl(element); - }); - } - }, { - key: "updateFieldsCostUnitLocalVatExcl", - value: function updateFieldsCostUnitLocalVatExcl(elementChanged) { - var row = elementChanged.closest('tr.' + flagOrderItems); - var inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - var costTotalLocalVatExcl = DOM.getElementValueCurrent(inputCostTotalLocalVatExcl); - var inputQuantityOrdered = row.querySelector('td.' + flagQuantityOrdered + ' input'); - var quantityOrdered = DOM.getElementValueCurrent(inputQuantityOrdered); - var divCostUnitLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' div'); - var costUnitLocalVatExcl = quantityOrdered == 0 ? 0 : costTotalLocalVatExcl / quantityOrdered; - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, costUnitLocalVatExcl.toFixed(3)); - var rowSupplierPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - var divCostGrandTotalLocalVatExcl = rowSupplierPurchaseOrder.querySelector('td.' + flagCostTotalLocalVatExcl + ' div'); - var inputsCostTotalLocalVatExcl = rowSupplierPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatExcl + ' input'); - var costGrandTotalLocalVatExcl = Array.from(inputsCostTotalLocalVatExcl).reduce(function (acc, input) { - return acc + Number(DOM.getElementValueCurrent(input)); - }, 0); - DOM.setElementValueCurrent(divCostGrandTotalLocalVatExcl, costGrandTotalLocalVatExcl); - } - }, { - key: "updateFieldsCostUnitLocalVatIncl", - value: function updateFieldsCostUnitLocalVatIncl(elementChanged) { - var row = elementChanged.closest('tr.' + flagOrderItems); - var inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - var costTotalLocalVatIncl = DOM.getElementValueCurrent(inputCostTotalLocalVatIncl); - var inputQuantityOrdered = row.querySelector('td.' + flagQuantityOrdered + ' input'); - var quantityOrdered = DOM.getElementValueCurrent(inputQuantityOrdered); - var divCostUnitLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' div'); - var costUnitLocalVatIncl = quantityOrdered == 0 ? 0 : costTotalLocalVatIncl / quantityOrdered; - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, costUnitLocalVatIncl.toFixed(3)); - var rowSupplierPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - var divCostGrandTotalLocalVatIncl = rowSupplierPurchaseOrder.querySelector('td.' + flagCostTotalLocalVatIncl + ' div'); - var inputsCostTotalLocalVatIncl = rowSupplierPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatIncl + ' input'); - var costGrandTotalLocalVatIncl = Array.from(inputsCostTotalLocalVatIncl).reduce(function (acc, input) { - return acc + Number(DOM.getElementValueCurrent(input)); - }, 0); - DOM.setElementValueCurrent(divCostGrandTotalLocalVatIncl, costGrandTotalLocalVatIncl); - } - }, { - key: "hookupFieldsOrderItemLatencyDeliveryDays", - value: function hookupFieldsOrderItemLatencyDeliveryDays() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagLatencyDeliveryDays + ' input'); - } - }, { - key: "hookupFieldsOrderItemActive", - value: function hookupFieldsOrderItemActive() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' input.' + flagActive); - } - }, { - key: "hookupFieldsOrderItemAddDelete", - value: function hookupFieldsOrderItemAddDelete() { - var selectorButton = idTableMain + ' td.' + flagOrderItems + ' td.' + flagOrderItems + ' button'; - var selectorButtonDelete = selectorButton + '.' + flagDelete; - var selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsOrderItemAdd(); - } - }, { - key: "hookupButtonsOrderItemAdd", - value: function hookupButtonsOrderItemAdd() { - var _this8 = this; - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' th button.' + flagAdd, function (event, element) { - var _supplierOrderItem; - var row = element.closest(idTableMain + ' > tbody > tr'); - var idSupplierPurchaseOrder = row.getAttribute(attrIdSupplierPurchaseOrder); - // let hasActiveOrderItem = row.querySelectorAll('td.' + flagOrderItems + ' input.' + flagActive + ':checked').length > 0; - var countSupplierOrderItems = row.querySelectorAll('td.' + flagOrderItems + ' td.' + flagSupplierPurchaseOrder).length; - var supplierOrderItem = (_supplierOrderItem = {}, supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(_supplierOrderItem, attrIdSupplierPurchaseOrder, idSupplierPurchaseOrder), attrIdSupplierPurchaseOrderProductLink, -1 - countSupplierOrderItems), attrIdProductCategory, 0), attrIdProduct, 0), flagProductVariations, ''), attrIdUnitMeasurementQuantity, 0), flagQuantityOrdered, ''), flagQuantityReceived, ''), flagCostTotalLocalVatExcl, ''), flagCostTotalLocalVatIncl, ''), supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(supplier_purchase_orders_defineProperty(_supplierOrderItem, flagCostUnitLocalVatExcl, ''), flagCostUnitLocalVatIncl, ''), flagLatencyDeliveryDays, ''), flagDisplayOrder, countSupplierOrderItems + 1), flagActive, true)); - var tbody = row.querySelector('td.' + flagOrderItems + ' table tbody'); - _this8.addRowSupplierPurchaseOrderItem(tbody, supplierOrderItem); - /* - if (!hasActiveOrderItem) { - let tdOrderItem = row.querySelector('td.' + flagOrderItems); - // tdOrderItem.setAttribute(attrIdSupplierOrderItem, supplierOrderItem[attrIdSupplierOrderItem]); - DOM.setElementAttributeValueCurrent(tdOrderItem, supplierOrderItem[attrIdSupplierPurchaseOrderProductLink]); - } - */ - _this8.hookupOrderItemsFields(); - }); - } - }, { - key: "leave", - value: function leave() { - supplier_purchase_orders_superPropGet(PageStoreSupplierPurchaseOrders, "leave", this, 3)([]); - } - }]); -}(TableBasePage); -supplier_purchase_orders_defineProperty(PageStoreSupplierPurchaseOrders, "hash", hashPageStoreSupplierPurchaseOrders); -supplier_purchase_orders_defineProperty(PageStoreSupplierPurchaseOrders, "attrIdRowObject", attrIdSupplierPurchaseOrder); - -;// CONCATENATED MODULE: ./static/js/pages/legal/privacy_policy.js +;// ./static/js/pages/legal/privacy_policy.js function privacy_policy_typeof(o) { "@babel/helpers - typeof"; return privacy_policy_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, privacy_policy_typeof(o); } function privacy_policy_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function privacy_policy_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, privacy_policy_toPropertyKey(o.key), o); } } @@ -6823,7 +1956,7 @@ function privacy_policy_callSuper(t, o, e) { return o = privacy_policy_getProtot function privacy_policy_possibleConstructorReturn(t, e) { if (e && ("object" == privacy_policy_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return privacy_policy_assertThisInitialized(t); } function privacy_policy_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function privacy_policy_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (privacy_policy_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function privacy_policy_superPropGet(t, e, o, r) { var p = privacy_policy_get(privacy_policy_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } +function privacy_policy_superPropGet(t, o, e, r) { var p = privacy_policy_get(privacy_policy_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } function privacy_policy_get() { return privacy_policy_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = privacy_policy_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, privacy_policy_get.apply(null, arguments); } function privacy_policy_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = privacy_policy_getPrototypeOf(t));); return t; } function privacy_policy_getPrototypeOf(t) { return privacy_policy_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, privacy_policy_getPrototypeOf(t); } @@ -6853,7 +1986,7 @@ var PagePrivacyPolicy = /*#__PURE__*/function (_BasePage) { }(BasePage); privacy_policy_defineProperty(PagePrivacyPolicy, "hash", hashPagePrivacyPolicy); -;// CONCATENATED MODULE: ./static/js/pages/legal/retention_schedule.js +;// ./static/js/pages/legal/retention_schedule.js function retention_schedule_typeof(o) { "@babel/helpers - typeof"; return retention_schedule_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, retention_schedule_typeof(o); } function retention_schedule_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function retention_schedule_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, retention_schedule_toPropertyKey(o.key), o); } } @@ -6862,7 +1995,7 @@ function retention_schedule_callSuper(t, o, e) { return o = retention_schedule_g function retention_schedule_possibleConstructorReturn(t, e) { if (e && ("object" == retention_schedule_typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return retention_schedule_assertThisInitialized(t); } function retention_schedule_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function retention_schedule_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (retention_schedule_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } -function retention_schedule_superPropGet(t, e, o, r) { var p = retention_schedule_get(retention_schedule_getPrototypeOf(1 & r ? t.prototype : t), e, o); return 2 & r && "function" == typeof p ? function (t) { return p.apply(o, t); } : p; } +function retention_schedule_superPropGet(t, o, e, r) { var p = retention_schedule_get(retention_schedule_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } function retention_schedule_get() { return retention_schedule_get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = retention_schedule_superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, retention_schedule_get.apply(null, arguments); } function retention_schedule_superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = retention_schedule_getPrototypeOf(t));); return t; } function retention_schedule_getPrototypeOf(t) { return retention_schedule_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, retention_schedule_getPrototypeOf(t); } @@ -6892,7 +2025,7 @@ var PageRetentionSchedule = /*#__PURE__*/function (_BasePage) { }(BasePage); retention_schedule_defineProperty(PageRetentionSchedule, "hash", hashPageDataRetentionSchedule); -;// CONCATENATED MODULE: ./static/js/router.js +;// ./static/js/router.js function router_typeof(o) { "@babel/helpers - typeof"; return router_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, router_typeof(o); } function router_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function router_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, router_toPropertyKey(o.key), o); } } @@ -6903,40 +2036,15 @@ function router_toPrimitive(t, r) { if ("object" != router_typeof(t) || !t) retu // Core - - // Legal -// Store - - - - - -// import PageStoreProductPrices from './pages/store/product_prices.js'; - - - - - // User // import PageUserLogin from './pages/user/login.js'; // import PageUserLogout from './pages/user/logout.js'; // import PageUserAccount from './pages/user/account.js'; -/* -import "./lib/common.js"; -import "./lib/constants.js"; -import "./lib/events.js"; -import "./lib/extras.js"; -// import "./DEPRECATED/init.js"; -import "./lib/local_storage.js"; -import "./lib/utils.js"; -import "./lib/validation.js"; -*/ - @@ -6955,10 +2063,6 @@ const pageModules = { // Legal [hashPageAccessibilityStatement]: () => import('./pages/legal/accessibility_statement.js'), [hashPageLicense]: () => import('./pages/legal/license.js'), - // Store - [hashPageStoreProductCategories]: () => import('./pages/store/product_categories.js'), - [hashPageStoreProductPermutations]: () => import('./pages/store/product_permutations.js'), - // [hashPageStoreProducts]: () => import('./pages/store/products.js'), // User // Add other pages here... }; @@ -6972,20 +2076,12 @@ var Router = /*#__PURE__*/function () { // Core this.pages[hashPageHome] = { name: 'PageHome', - module: PageAdminHome + module: PageHome }; // importModule: () => import(/* webpackChunkName: "page_core_home" */ './pages/core/home.js') , pathModule: './pages/core/home.js' this.pages[hashPageContact] = { name: 'PageContact', module: PageContact }; // pathModule: './pages/core/contact.js' }; - this.pages[hashPageServices] = { - name: 'PageServices', - module: PageServices - }; // pathModule: './pages/core/services.js' }; - this.pages[hashPageAdminHome] = { - name: 'PageAdminHome', - module: PageAdminHome - }; // pathModule: './pages/core/admin_home.js' }; // Legal this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', @@ -7003,40 +2099,6 @@ var Router = /*#__PURE__*/function () { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy }; // pathModule: './pages/legal/privacy_policy.js' }; // importModule: () => {return import(/* webpackChunkName: "page_privacy_policy" */ './pages/legal/privacy_policy.js'); } - // Store - this.pages[hashPageStoreManufacturingPurchaseOrders] = { - name: 'PageManufacturingPurchaseOrders', - module: PageStoreManufacturingPurchaseOrders - }; // pathModule - this.pages[hashPageStoreProductCategories] = { - name: 'PageStoreProductCategories', - module: PageStoreProductCategories - }; // pathModule: './pages/store/product_categories.js' }; - this.pages[hashPageStoreProductPermutations] = { - name: 'PageStoreProductPermutations', - module: PageStoreProductPermutations - }; // pathModule: './pages/store/product_permutations.js' }; - // this.pages[hashPageStoreProductPrices] = { name: 'PageStoreProductPrices', module: PageStoreProductPrices }; // pathModule: './pages/store/product_prices.js' }; - this.pages[hashPageStoreProducts] = { - name: 'PageStoreProducts', - module: PageStoreProducts - }; // pathModule: './pages/store/products.js' }; - this.pages[hashPageStoreProductVariations] = { - name: 'PageStoreProductVariations', - module: PageStoreProductVariations - }; // pathModule: './pages/store/product_variations.js' }; - this.pages[hashPageStoreStockItems] = { - name: 'PageStoreStockItems', - module: PageStoreStockItems - }; - this.pages[hashPageStoreSuppliers] = { - name: 'PageStoreSuppliers', - module: PageStoreSuppliers - }; - this.pages[hashPageStoreSupplierPurchaseOrders] = { - name: 'PageSupplierPurchaseOrders', - module: PageStoreSupplierPurchaseOrders - }; // User // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' }; // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' }; @@ -7053,14 +2115,6 @@ var Router = /*#__PURE__*/function () { var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; return _this.navigateToHash(hashPageContact, isPopState); }; - this.routes[hashPageServices] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageServices, isPopState); - }; - this.routes[hashPageAdminHome] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageAdminHome, isPopState); - }; // Legal this.routes[hashPageAccessibilityStatement] = function () { var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; @@ -7078,40 +2132,6 @@ var Router = /*#__PURE__*/function () { var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; return _this.navigateToHash(hashPagePrivacyPolicy, isPopState); }; - // Store - this.routes[hashPageStoreManufacturingPurchaseOrders] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreManufacturingPurchaseOrders, isPopState); - }; - this.routes[hashPageStoreProductCategories] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreProductCategories, isPopState); - }; - this.routes[hashPageStoreProductPermutations] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreProductPermutations, isPopState); - }; - // this.routes[hashPageStoreProductPrices] = (isPopState = false) => this.navigateToHash(hashPageStoreProductPrices, isPopState); - this.routes[hashPageStoreProducts] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreProducts, isPopState); - }; - this.routes[hashPageStoreProductVariations] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreProductVariations, isPopState); - }; - this.routes[hashPageStoreStockItems] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreStockItems, isPopState); - }; - this.routes[hashPageStoreSuppliers] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreSuppliers, isPopState); - }; - this.routes[hashPageStoreSupplierPurchaseOrders] = function () { - var isPopState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return _this.navigateToHash(hashPageStoreSupplierPurchaseOrders, isPopState); - }; // User // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState); // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState); @@ -7190,13 +2210,13 @@ var Router = /*#__PURE__*/function () { console.error(`Hash ${hash} not found`); } */ - var url = api_API.getUrlFromHash(hash, params); + var url = API.getUrlFromHash(hash, params); // if (!isPopState) history.pushState({ data: data, params: params }, '', hash); - api_API.goToUrl(url, data); + API.goToUrl(url, data); } /* beforeunload listener async beforeLeave() { @@ -7212,129 +2232,9 @@ var Router = /*#__PURE__*/function () { var appendHistory = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; // this.beforeLeave(); if (appendHistory) history.pushState(data, '', url); - url = api_API.parameteriseUrl(url, data); - api_API.goToUrl(url); + url = API.parameteriseUrl(url, data); + API.goToUrl(url); } - - /* - static getPages() { - let pages = {}; - pages[hashPageAccessibilityStatement] = PageAccessibilityStatement; - pages[hashPageAdminHome] = PageAdminHome; - pages[hashPageHome] = PageHome; - pages[hashPageContact] = PageContact; - pages[hashPageLicense] = PageLicense; - pages[hashPageServices] = PageServices; - pages[hashPageStoreBasket] = PageStoreBasket; - pages[hashPageStoreHome] = PageStoreHome; - pages[hashPageStoreProductCategories] = PageStoreProductCategories; - pages[hashPageStoreProductPermutations] = PageStoreProductPermutations; - // pages[hashPageStoreProductPrices] = PageStoreProductPrices; - // pages[hashPageStoreProducts] = PageStoreProducts; - // pages[hashPageStoreProductVariations] = PageStoreProductVariations; - pages[hashPageStoreStockItems] = PageStoreStockItems; - console.log("pages: ", pages); - return pages; - } - addRoute(path, handler) { - this.routes[path] = handler; - } - handlePopState(event) { - /* - let url = window.location.pathname; - url = url.split('?')[0]; - let hash = url.replace(_pathHost, ''); - console.log("handlePopState: " + hash); - this.handleRouteHash(hash); - * - let pageCurrent = Router.getPageCurrent(); - pageCurrent.initialize(true); - } - navigateToHash(hash, data = null) { - const url = API.getUrlFromHash(hash); - this.navigateToUrl(url, data); - } - leavePageCurrent() { - const pageCurrent = Router.getPageCurrent(); - if (pageCurrent) pageCurrent.leave(); - } - - static getPageCurrent() { - if (_pageCurrent) return _pageCurrent; - const hashPageCurrent = DOM.getHashPageCurrent(); - console.log("hashPageCurrent: " + hashPageCurrent); - const pages = Router.getPages(); - let page; - for (const key of Object.keys(pages)) { - page = pages[key]; - console.log("page hashL ", page.hash); - if (page.hash == hashPageCurrent) return new page(); - } - throw new Error('Page not found: ' + hashPageCurrent); - } - static parameteriseUrl(url, parameters) { - if (!Validation.isEmpty(parameters)) { - url += '%3F'; // '?'; - let firstParameter = true; - for (var p in parameters) { - if (!firstParameter) { - url += '&'; - } else { - firstParameter = false; - } - url += parameters[p]; - } - } - return url; - } - */ - - /* - handleRouteUrl(url) { - const path = url.split('?')[0]; // Remove query parameters - if (this.routes[path]) { - this.routes[path](); - } else if (url.includes('auth0.com')) { - Router.goToUrl(url); - } else { - console.warn('No handler found for path:', path); - // Optionally, handle 404 or redirect to a default route - } - } - handleRouteHash(hash) { - if (this.routes[hash]) { - this.routes[hash](); - } else { - console.warn('No handler found for hash:', hash); - } - } - */ - - /* - static htmlEncode(value) { - return document.createElement('
').text(value).innerHTML; - } - - static htmlDecode(value) { - if (_domParser == null) _domParser = DOMParser(); // https://www.w3docs.com/snippets/javascript/how-to-html-encode-a-string.html - return _domParser.parseFromString(value, 'text/html').documentElement.textContent; - } - */ - - // Additional utility methods - /* - static getQueryParams() { - return Object.fromEntries(new URLSearchParams(window.location.search)); - } - static updateQueryParams(params) { - const searchParams = new URLSearchParams(window.location.search); - for (const [key, value] of Object.entries(params)) { - searchParams.set(key, value); - } - const newUrl = `${window.location.pathname}?${searchParams.toString()}`; - history.replaceState(null, '', newUrl); - } - */ }], [{ key: "loadPageBodyFromResponse", value: function loadPageBodyFromResponse(response) { @@ -7369,29 +2269,7 @@ export function setupNavigationEvents() { }); } */ -;// CONCATENATED MODULE: ./static/js/app.js -/* -// Bundle css imports -import '../css/lib/reset.css'; -import '../css/lib/typography.css'; -import '../css/lib/variables.css'; -import '../css/lib/utils.css'; - -import '../css/layouts/header.css'; -import '../css/layouts/footer.css'; -import '../css/layouts/table-main.css' - -import '../css/components/button.css'; -import '../css/components/card.css'; -import '../css/components/dialog.css'; -import '../css/components/form.css'; -import '../css/components/modal.css'; -import '../css/components/navigation.css'; -import '../css/components/overlay.css'; - -import '../css/sections/store.css'; -*/ - +;// ./static/js/app.js // Main entry point for the application @@ -7468,116 +2346,65 @@ window.app = app; /* harmony default export */ const js_app = ((/* unused pure expression or super */ null && (app))); })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. -(() => { -// extracted by mini-css-extract-plugin - -})(); - -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { +"use strict"; // extracted by mini-css-extract-plugin })(); diff --git a/static/dist/js/store_home.bundle.js b/static/dist/js/store_home.bundle.js index 90c101bb..60b8fa20 100644 --- a/static/dist/js/store_home.bundle.js +++ b/static/dist/js/store_home.bundle.js @@ -1,12 +1,12 @@ /******/ (() => { // webpackBootstrap /******/ "use strict"; -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin diff --git a/static/dist/js/store_product_categories.bundle.js b/static/dist/js/store_product_categories.bundle.js index fb29e69e..5e8b027d 100644 --- a/static/dist/js/store_product_categories.bundle.js +++ b/static/dist/js/store_product_categories.bundle.js @@ -1,12 +1,12 @@ /******/ (() => { // webpackBootstrap /******/ "use strict"; -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin diff --git a/static/dist/js/store_product_permutations.bundle.js b/static/dist/js/store_product_permutations.bundle.js index adb5e672..c2f66aa1 100644 --- a/static/dist/js/store_product_permutations.bundle.js +++ b/static/dist/js/store_product_permutations.bundle.js @@ -1,12 +1,12 @@ /******/ (() => { // webpackBootstrap /******/ "use strict"; -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin diff --git a/static/dist/js/store_stock_items.bundle.js b/static/dist/js/store_stock_items.bundle.js index d5fce4f1..49e7c1b3 100644 --- a/static/dist/js/store_stock_items.bundle.js +++ b/static/dist/js/store_stock_items.bundle.js @@ -1,12 +1,12 @@ /******/ (() => { // webpackBootstrap /******/ "use strict"; -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin })(); -// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules. +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules. (() => { // extracted by mini-css-extract-plugin diff --git a/static/js/DEPRECATED/init.js b/static/js/DEPRECATED/init.js deleted file mode 100644 index f4dbf1eb..00000000 --- a/static/js/DEPRECATED/init.js +++ /dev/null @@ -1,3 +0,0 @@ -// Shared JS file names: routing, main, shared, localStorage, appDialogs - - diff --git a/static/js/DEPRECATED/main.js b/static/js/DEPRECATED/main.js deleted file mode 100644 index d4970fa0..00000000 --- a/static/js/DEPRECATED/main.js +++ /dev/null @@ -1,65 +0,0 @@ -// main.js - -import { initializeAPI } from './shared/api.js'; -import { setupEventListeners } from './shared/events.js'; -import { initializeComponents } from './components/componentInitializer.js'; -import { router } from './shared/router.js'; -import { CONFIG } from './config/config.js'; - -// DOM ready function -function domReady(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } -} - -// Main initialization function -function initializeApp() { - console.log('Initializing application...'); - - // Initialize API with base URL - initializeAPI(CONFIG.API_BASE_URL); - - // Setup global event listeners - setupEventListeners(); - - // Initialize reusable components - initializeComponents(); - - // Initialize router - router.init(); - - // Page-specific initialization - const currentPage = document.body.dataset.page; - switch (currentPage) { - case 'home': - import('./pages/home.js').then(module => module.initHomePage()); - break; - case 'about': - import('./pages/about.js').then(module => module.initAboutPage()); - break; - case 'contact': - import('./pages/contact.js').then(module => module.initContactPage()); - break; - default: - console.log('No specific initialization for this page'); - } - - console.log('Application initialized'); -} - -// Run the initialization when the DOM is ready -domReady(initializeApp); - -// Expose a global app object if needed -window.app = { - // Add methods or properties that need to be globally accessible - reloadPage: () => { - window.location.reload(); - }, - navigateTo: (url) => { - router.navigateTo(url); - } -}; \ No newline at end of file diff --git a/static/js/DEPRECATED/routing.js b/static/js/DEPRECATED/routing.js deleted file mode 100644 index a3313330..00000000 --- a/static/js/DEPRECATED/routing.js +++ /dev/null @@ -1,111 +0,0 @@ - -import Validation from "./lib/validation.js"; - -function mapHashToController(hash) { - if (hash == null) return mapHashToController(hashPageHome); - - url = _pathHost; // + '/'; - console.log("url: " + url + "\nhash: " + hash); - return url + hash; - - switch (hash) { - case hashPageErrorNoPermission: - url += 'error'; - break; - case hashPageStoreHome: - url += 'store/home'; - break; - case hashPageStoreProduct: - url += 'store/product'; - break; - case hashStoreBasketLoad: - url += 'store/basket_load'; - break; - case hashStoreBasketAdd: - url += 'store/product'; - break; - default: - url += ''; - } - - return url; -} - -/* -function goToPage(pageHash, parameters) { - window.location.href = "{{ url_for(" + pageHash + (parameters == '' ? '' : ',' + parameters) + ") }}"; // getPageRoute(pageHash, parameters); -} -*/ -function goToPage(pageHash, parametersJSON) { - // window.location.href = "{{ url_for(" + pageHash + (parameters == '' ? '' : ',' + parameters) + ") }}"; // getPageRoute(pageHash, parameters); - // ajaxJSONData(pageHash, mapHashToController(pageHash), parameters, null, false); - url = mapHashToController(pageHash); - - - if (!Validation.isEmpty(parametersJSON)) { - url += '%3F'; // '?'; - let firstParameter = true; - for (var p in parametersJSON) { - // url += p + '=' + parametersJSON[p]; - if (!firstParameter) { - url += '&'; - } else { - firstParameter = false; - } - url += parametersJSON[p]; - } - } - - leavePage(); - - window.location.href = url; - // ajaxJSONData(pageHash, url, parametersJSON, loadPageBody, false); -} -function leavePage() {} - -function goToUrl(parameterisedUrl) { - - leavePage(); - - window.location.href = parameterisedUrl; -} - -function htmlEncode(value) { - return document.createElement('
').text(value).innerHTML; -} - -var _domParser = null; -function htmlDecode(value) { - if (_domParser == null) _domParser = DOMParser(); // https://www.w3docs.com/snippets/javascript/how-to-html-encode-a-string.html - return _domParser.parseFromString(value, 'text/html').documentElement.textContent; -} - -function convertForm2JSON(elemForm) { - - formData = {} - - formDataTmp = elemForm.serializeArray(); - - $.each(formDataTmp, function(index, field) { - formData[field.name] = field.value; - /* - console.log('field name: ' + field.name); - console.log('field value: ' + field.value); - console.log('field currentval: ' + getElementValueCurrent(field)); - */ - }); - - return formData; -} - -function loadPageBody(response) { - - let pageBody = document.querySelectorAll(idPageBody); - - console.log('ajax:'); - console.log(response.data); - - pageBody.innerHTML = response.data['html_block']; -} - - diff --git a/static/js/app.js b/static/js/app.js index d766ef45..b42630f0 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -1,25 +1,3 @@ -/* -// Bundle css imports -import '../css/lib/reset.css'; -import '../css/lib/typography.css'; -import '../css/lib/variables.css'; -import '../css/lib/utils.css'; - -import '../css/layouts/header.css'; -import '../css/layouts/footer.css'; -import '../css/layouts/table-main.css' - -import '../css/components/button.css'; -import '../css/components/card.css'; -import '../css/components/dialog.css'; -import '../css/components/form.css'; -import '../css/components/modal.css'; -import '../css/components/navigation.css'; -import '../css/components/overlay.css'; - -import '../css/sections/store.css'; -*/ - // Main entry point for the application 'use strict'; diff --git a/static/js/dom.js b/static/js/dom.js index 37f30ec9..15c78097 100644 --- a/static/js/dom.js +++ b/static/js/dom.js @@ -136,6 +136,7 @@ export default class DOM { return returnVal; } static getElementAttributeValueCurrent(element) { + debugger; if (Validation.isEmpty(element)) return null; return element.getAttribute(attrValueCurrent); if (!Validation.isEmpty(value) && element.type === "checkbox") { diff --git a/static/js/pages/base.js b/static/js/pages/base.js index c8b6097f..e5bc4985 100644 --- a/static/js/pages/base.js +++ b/static/js/pages/base.js @@ -43,46 +43,10 @@ export default class BasePage { hookupCommonElements() { // hookupVideos(); - this.hookupNavigation(); - this.hookupImagesLogo(); + this.hookupLogos(); this.hookupOverlays(); } - hookupNavigation() { - /* Can be removed: */ - let overlayHamburger = document.querySelector(idOverlayHamburger); - let hamburgerOptions = overlayHamburger.querySelectorAll('div.' + flagRow); - let countOptions = hamburgerOptions.length; - // console.log('count nav options: ', countOptions); - // overlayHamburger.css('height', (countOptions * 27) + 'px'); - /* end of can be removed */ - - this.hookupEventHandler("click", idButtonHamburger, (event, element) => { - let overlayHamburger = document.querySelector(idOverlayHamburger); - if (overlayHamburger.classList.contains(flagCollapsed)) { - overlayHamburger.classList.remove(flagCollapsed); - overlayHamburger.classList.add(flagExpanded); - } else { - overlayHamburger.classList.remove(flagExpanded); - overlayHamburger.classList.add(flagCollapsed); - } - // overlayHamburger.classList.add(flagInitialised); - }); - - this.hookupButtonsNavHome(); - this.hookupButtonsNavServices(); - this.hookupButtonsNavContact(); - this.hookupButtonsNavUserAccount(); - this.hookupButtonsNavUserLogout(); - this.hookupButtonsNavUserLogin(); - this.hookupButtonsNavStoreHome(); - this.hookupButtonsNavStoreManufacturingPurchaseOrders(); - this.hookupButtonsNavStoreProductPermutations(); - this.hookupButtonsNavStoreStockItems(); - this.hookupButtonsNavStoreSuppliers(); - this.hookupButtonsNavStoreSupplierPurchaseOrders(); - this.hookupButtonsNavAdminHome(); - } hookupEventHandler(eventType, selector, callback) { Events.initialiseEventHandler(selector, flagInitialised, (element) => { element.addEventListener(eventType, (event) => { @@ -91,77 +55,12 @@ export default class BasePage { }); }); } - hookupButtonsNavHome() { - this.hookupButtonsNav('.' + flagNavHome, hashPageHome); - } - hookupButtonsNav(buttonSelector, hashPageNav) { - this.hookupEventHandler("click", buttonSelector, (event, button) => { - this.router.navigateToHash(hashPageNav); - }); - } - hookupButtonsNavServices() { - this.hookupButtonsNav('.' + flagNavServices, hashPageServices); - } - hookupButtonsNavContact() { - this.hookupButtonsNav('.' + flagNavContact, hashPageContact); - } - hookupButtonsNavUserAccount() { - this.hookupButtonsNav('.' + flagNavUserAccount, hashPageUserAccount); - } - hookupButtonsNavUserLogout() { - this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout); - } - hookupButtonsNavUserLogin() { - this.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => { - event.stopPropagation(); - this.leave(); - API.loginUser() - .then((response) => { - if (response.Success) { - // this.router.navigateToUrl(response[flagCallback], null, false); // window.app. - window.location.href = response[flagCallback]; - } else { - DOM.alertError("Error", response.Message); - } - }); - }); - } - hookupButtonsNavStoreHome() { - this.hookupButtonsNav('.' + flagNavStoreHome, hashPageStoreHome); - } - hookupButtonsNavStoreManufacturingPurchaseOrders() { - this.hookupButtonsNav('.' + flagNavStoreManufacturingPurchaseOrders, hashPageStoreManufacturingPurchaseOrders); - } - hookupButtonsNavStoreProductCategories() { - this.hookupButtonsNav('.' + flagNavStoreProductCategories, hashPageStoreProductCategories); - } - hookupButtonsNavStoreProducts() { - this.hookupButtonsNav('.' + flagNavStoreProducts, hashPageStoreProducts); - } - hookupButtonsNavStoreProductPermutations() { - this.hookupButtonsNav('.' + flagNavStoreProductPermutations, hashPageStoreProductPermutations); - } - hookupButtonsNavStoreProductPrices() { - this.hookupButtonsNav('.' + flagNavStoreProductPrices, hashPageStoreProductPrices); - } - hookupButtonsNavStoreProductVariations() { - this.hookupButtonsNav('.' + flagNavStoreProductVariations, hashPageStoreProductVariations); - } - hookupButtonsNavStoreStockItems() { - this.hookupButtonsNav('.' + flagNavStoreStockItems, hashPageStoreStockItems); - } - hookupButtonsNavAdminHome() { - this.hookupButtonsNav('.' + flagNavAdminHome, hashPageAdminHome); - } - hookupButtonsNavStoreSuppliers() { - this.hookupButtonsNav('.' + flagNavStoreSuppliers, hashPageStoreSuppliers); - } - hookupButtonsNavStoreSupplierPurchaseOrders() { - this.hookupButtonsNav('.' + flagNavStoreSupplierPurchaseOrders, hashPageStoreSupplierPurchaseOrders); - } - hookupImagesLogo() { - this.hookupButtonsNav("img." + flagImageLogo, hashPageHome); + hookupLogos() { + this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => { + if (_verbose) { console.log('clicking logo'); } + this.router.navigateToHash(hashPageHome); + }); } hookupOverlays() { @@ -178,7 +77,6 @@ export default class BasePage { }); } - hookupButtonSave() { Events.initialiseEventHandler('form.' + flagFilter + ' button.' + flagSave, flagInitialised, (button) => { button.addEventListener("click", (event) => { @@ -190,13 +88,6 @@ export default class BasePage { }); } - hookupVideos() { - Events.initialiseEventHandler('video', flagInitialised, (video) => { - video.addEventListener("mouseover", videoPlay(video)); - video.addEventListener("mouseout", videoPause(video)); - }); - } - leave() { if (_verbose) { console.log('Leaving ' + this.title + ' page'); } if (this.constructor === BasePage) { diff --git a/static/js/pages/core/admin_home.js b/static/js/pages/core/admin_home.js deleted file mode 100644 index a517abd6..00000000 --- a/static/js/pages/core/admin_home.js +++ /dev/null @@ -1,46 +0,0 @@ - -import Events from "../../lib/events.js"; -import BasePage from "../base.js"; - -export default class PageAdminHome extends BasePage { - static hash = hashPageAdminHome; - - constructor(router) { - super(router); - } - - initialize() { - this.sharedInitialize(); - this.hookupAdminStore(); - } - - hookupAdminStore() { - this.hookupButtonsNavStoreProductCategories(); - this.hookupButtonsNavStoreProducts(); - this.hookupButtonsNavStoreProductPermutations(); - this.hookupButtonsNavStoreProductPrices(); - this.hookupButtonsNavStoreStockItems(); - this.hookupButtonsNavStoreProductVariations(); - - this.hookupButtonsNavAdminStoreStripeProducts(); - this.hookupButtonsNavAdminStoreStripePrices(); - } - hookupButtonsNavAdminStoreStripeProducts() { - Events.initialiseEventHandler('.' + flagNavAdminStoreStripeProducts, flagInitialised, function(navigator) { - navigator.addEventListener("click", function(event) { - this.router.navigateToHash(hashPageAdminStoreStripeProducts); - }); - }); - } - hookupButtonsNavAdminStoreStripePrices() { - Events.initialiseEventHandler('.' + flagNavAdminStoreStripePrices, flagInitialised, function(navigator) { - navigator.addEventListener("click", function(event) { - this.router.navigateToHash(hashPageAdminStoreStripePrices); - }); - }); - } - - leave() { - super.leave(); - } -} diff --git a/static/js/pages/core/contact.js b/static/js/pages/core/contact.js index 022b3f4b..8924a0ba 100644 --- a/static/js/pages/core/contact.js +++ b/static/js/pages/core/contact.js @@ -10,5 +10,12 @@ export default class PageContact extends BasePage { initialize() { this.sharedInitialize(); + this.hookupButtonSubmitFormContactUs(); + } + + hookupButtonSubmitFormContactUs() { + const button = document.querySelector('form input[type="submit"]'); + button.classList.add(flagButton); + button.classList.add(flagButtonPrimary); } } diff --git a/static/js/pages/core/home.js b/static/js/pages/core/home.js index 35f0227d..ecd48415 100644 --- a/static/js/pages/core/home.js +++ b/static/js/pages/core/home.js @@ -1,5 +1,9 @@ +// internal import BasePage from "../base.js"; +// external +import AOS from 'aos'; + export default class PageHome extends BasePage { static hash = hashPageHome; @@ -11,8 +15,45 @@ export default class PageHome extends BasePage { initialize() { this.sharedInitialize(); this.hookupButtonsNavContact(); + // this.initialiseAOS(); + this.initialiseAnimations(); } + /* AOS */ + initialiseAOS() { + AOS.init({ + duration: 1000, + once: true, + }); + } + /* Manual animations * + initialiseAnimations() { + // Check if IntersectionObserver is supported + if ('IntersectionObserver' in window) { + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + } + }); + }, { + threshold: 0.1, + rootMargin: '50px' + }); + + // Observe all elements with 'reveal' class + document.querySelectorAll('.reveal').forEach((element) => { + observer.observe(element); + }); + } else { + // If IntersectionObserver is not supported, make all elements visible + document.querySelectorAll('.reveal').forEach((element) => { + element.style.opacity = 1; + }); + } + } + */ + leave() { super.leave(); } diff --git a/static/js/pages/core/services.js b/static/js/pages/core/services.js deleted file mode 100644 index 602c38bc..00000000 --- a/static/js/pages/core/services.js +++ /dev/null @@ -1,19 +0,0 @@ - -import BasePage from "../base.js"; - -export default class PageServices extends BasePage { - static hash = hashPageServices; - - constructor(router) { - super(router); - } - - initialize() { - this.sharedInitialize(); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/basket.js b/static/js/pages/store/basket.js deleted file mode 100644 index ff7da1cc..00000000 --- a/static/js/pages/store/basket.js +++ /dev/null @@ -1,198 +0,0 @@ - -import Events from "../../lib/events.js"; -import LocalStorage from "../../lib/local_storage.js"; -import BasePage from "../base.js"; - -export default class PageStoreBasket extends BasePage { - static hash = hashPageStoreBasket; - - constructor(router) { - super(router); - } - - initialize() { - this.sharedInitialize(); - this.hookupStoreCardsInfo(); - this.hookupOverlaysStoreBasketInfo(); - this.hookupButtonCheckoutSession(); - } - - - hookupStoreCardsInfo() { - - document.querySelectorAll(idContainerInfoDelivery).addEventListener("click", function(event) { - if (_verbose) { console.log("delivery modal display method"); } - document.querySelectorAll(idOverlayInfoDelivery).css('display', 'block'); - }); - - document.querySelectorAll(idContainerInfoBilling).addEventListener("click", function(event) { - if (_verbose) { console.log("billing modal display method"); } - document.querySelectorAll(idOverlayInfoBilling).css('display', 'block'); - }); - } - - hookupOverlaysStoreBasketInfo() { - - let elOverlay, elForm; - - // Delivery - elOverlay = document.querySelectorAll(idOverlayInfoDelivery); - elForm = elOverlay.querySelector('form'); - - hookupOverlay(elOverlay); - Events.initialiseEventHandler(elForm, flagInitialised, function() { - elForm.submit(function(event) { - elForm = document.querySelectorAll(elForm); - event.preventDefault(); - if (_verbose) { console.log("delivery submit method"); } - - ajaxData = {}; - ajaxData[keyInfoType] = keyInfoDelivery; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoDelivery); - - ajaxJSONData('info delivery', mapHashToController(hashStoreBasketInfo), ajaxData, loadInfoAddress, false); - // document.querySelectorAll(idOverlayInfoDelivery).css('display', 'none'); - }); - }); - - // Billing - elOverlay = document.querySelectorAll(idOverlayInfoBilling); - elForm = elOverlay.querySelector('form'); - - hookupOverlay(elOverlay); - Events.initialiseEventHandler(elForm, flagInitialised, function() { - elForm.submit(function(event) { - event.preventDefault(); - if (_verbose) { console.log("billing submit method"); } - - ajaxData = {}; - ajaxData[keyInfoType] = keyInfoBilling; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoBilling); // formData; // form.serialize(); - - ajaxJSONData('info billing', mapHashToController(hashStoreBasketInfo), ajaxData, loadInfoAddress, false); - // document.querySelectorAll(idOverlayInfoBilling).css('display', 'none'); - }); - }); - let keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyCity, keyCounty]; - for (var k in keys) { - elForm.querySelector('#' + keys[k]).removeAttr('required'); - } - } - - loadInfoAddress(response) { - - if (_verbose) { console.log('response:'); console.log(response.data); } - let infoType = response.data[keyInfoType]; - let infoAddress = response.data[infoType]; - LocalStorage.setLocalStorage(infoType, infoAddress); - - // update webpage elements in background - if (infoType == keyInfoBilling) { - - let container = document.querySelectorAll(idContainerInfoBilling); - if (infoAddress[keyInfoIdentical]) { - container.querySelector('div').innerHTML = "Same as delivery address"; - } else { - container.querySelector('div').innerHTML = "" + infoAddress[keyNameFull] + ' at ' + infoAddress[keyPostcode] + ""; - } - - document.querySelectorAll(idOverlayInfoBilling).css('display', 'none'); - - document.querySelectorAll(idOverlayInfoBilling).querySelector('form').classList.add(flagSubmitted); - } else { - - let container = document.querySelectorAll(idContainerInfoDelivery); - container.querySelector('div').innerHTML = "" + infoAddress[keyNameFull] + ' at ' + infoAddress[keyPostcode] + ""; - - document.querySelectorAll(idOverlayInfoDelivery).css('display', 'none'); - - document.querySelectorAll(idOverlayInfoDelivery).querySelector('form').classList.add(flagSubmitted); - } - } - - convertFormBilling2JSON(ajaxData, idOverlayInfo) { - - let elOverlay, elForm, elOverlayDelivery, elFormDelivery; - - elOverlay = document.querySelectorAll(idOverlayInfo); - elForm = elOverlay.querySelector('form'); - elOverlay = document.querySelectorAll(idOverlayInfoDelivery); - elForm = elOverlay.querySelector('form'); - - ajaxData[flagForm] = convertForm2JSON(elForm); // formData; // form.serialize(); - let keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyAddress2, keyCity, keyCounty]; - if (_verbose) { - console.log('converting billing form to json\nform ID: ' + elForm.id); - console.log('ajaxData:'); - console.log(ajaxData); - } - ajaxData[flagForm][keyInfoIdentical] = getElementValueCurrent(elForm.querySelector('#' + keyInfoIdentical)); - for (var k in keys) { - if (idOverlayInfo == idOverlayInfoBilling && ajaxData[flagForm][keyInfoIdentical]) { - ajaxData[flagForm][keys[k]] = getElementValueCurrent(elFormDelivery.querySelector('#' + keys[k])); - } else { - ajaxData[flagForm][keys[k]] = getElementValueCurrent(elForm.querySelector('#' + keys[k])); - } - } - if (_verbose) { - console.log('ajaxData:'); - console.log(ajaxData); - } - return ajaxData; - } - - hookupButtonCheckoutSession() { - let btnCheckout = document.querySelectorAll(idButtonCheckout); - btnCheckout.classList.remove(flagInitialised); - Events.initialiseEventHandler(idButtonCheckout, flagInitialised, function() { - - btnCheckout.removeEventListener("click"); - btnCheckout.addEventListener("click", function(event) { - - - //setupPageLocalStorageNext(hashPageStoreBasket); - let basket = LocalStorage.getLocalStorage(keyBasket); - // goToPage(hashPageStoreBasket); - let ajaxData = {}; - ajaxData[keyBasket] = basket; - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoDelivery); - ajaxData = convertFormBilling2JSON(ajaxData, idOverlayInfoBilling); - ajaxData[key_code_currency] = getCurrencySelected(); - // ajaxData[keyIsSubscription] = false; // only checkout one-time payment items for now - - ajaxJSONData('checkout session', mapHashToController(hashPageStoreCheckout), ajaxData, handleResponseCheckout, false); - }); - }); - } - - handleResponseCheckout(response) { - // let tmpData = {}; - // tmpData[keyIdCheckout] = response.data[keyIdCheckout] - // goToPage(hashPageStoreCheckoutSession, tmpData); - window.location.href = response.data[keyUrlCheckout] - } - - hookupButtonFormBillingCopy() { - - // let elButton = document.querySelectorAll(idButtonFormBillingCopy); - - Events.initialiseEventHandler(idButtonFormBillingCopy, flagInitialised, function() { - document.querySelectorAll(idButtonFormBillingCopy).addEventListener("click", function (event) { - - let keys = [keyNameFull, keyPhoneNumber, keyPostcode, keyAddress1, keyAddress2, keyCity, keyCounty]; - - let elFormBilling = document.querySelectorAll(idOverlayInfoBilling).querySelector('form'); - let elFormDelivery = document.querySelectorAll(idOverlayInfoDelivery).querySelector('form'); - - for (var k in keys) { - elFormBilling.querySelector('#' + keys[k]).value = getElementValueCurrent(elFormDelivery.querySelector('#' + keys[k])); - } - }); - }); - } - - - leave() { - super.leave(); - } -} diff --git a/static/js/pages/store/home.js b/static/js/pages/store/home.js deleted file mode 100644 index 26882200..00000000 --- a/static/js/pages/store/home.js +++ /dev/null @@ -1,20 +0,0 @@ - -import BasePage from "../base.js"; - -export default class PageStoreHome extends BasePage { - static hash = hashPageStoreHome; - - constructor(router) { - super(router); - } - - initialize() { - this.sharedInitialize(); - this.hookupFiltersStore(); - this.hookupStoreHome(); - } - - leave() { - super.leave(); - } -} diff --git a/static/js/pages/store/manufacturing_purchase_orders.js b/static/js/pages/store/manufacturing_purchase_orders.js deleted file mode 100644 index 09113a9a..00000000 --- a/static/js/pages/store/manufacturing_purchase_orders.js +++ /dev/null @@ -1,509 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import ProductPermutation from "../../lib/business_objects/store/product_permutation.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreManufacturingPurchaseOrders extends TableBasePage { - static hash = hashPageStoreManufacturingPurchaseOrders; - static attrIdRowObject = attrIdManufacturingPurchaseOrder; - callSaveTableContent = API.saveManufacturingPurchaseOrders; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - - loadRowTable(rowJson) { - } - getJsonRow(row) { - if (row == null) return; - let tdCurrency = row.querySelector('td.' + flagCurrency); - let inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - let inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - let inputPriceTotalLocalVatExcl = row.querySelector('td.' + flagPriceTotalLocalVatExcl + ' input'); - let inputPriceTotalLocalVatIncl = row.querySelector('td.' + flagPriceTotalLocalVatIncl + ' input'); - let trsPurchaseOrderItem = row.querySelectorAll('tr.' + flagOrderItems); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdManufacturingPurchaseOrder] = row.getAttribute(attrIdManufacturingPurchaseOrder); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - jsonRow[flagPriceTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatExcl); - jsonRow[flagPriceTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatIncl); - let orderItems = []; - if (trsPurchaseOrderItem != null) { - trsPurchaseOrderItem.forEach((tr) => { - orderItems.push(this.getJsonRowOrderItem(tr)); - }); - } - jsonRow[flagOrderItems] = orderItems; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - getJsonRowOrderItem(tr) { - let inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - let tdCategory = tr.querySelector('td.' + flagProductCategory); - let tdProduct = tr.querySelector('td.' + flagProduct); - let tdVariations = tr.querySelector('td.' + flagProductVariations); - let tdUnitQuantity = tr.querySelector('td.' + flagUnitMeasurementQuantity); - let inputQuantityUsed = tr.querySelector('td.' + flagQuantityUsed + ' input'); - let inputQuantityProduced = tr.querySelector('td.' + flagQuantityProduced + ' input'); - let tdUnitMeasurementLatencyManufacture = tr.querySelector('td.' + flagUnitMeasurementLatencyManufacture); - let inputLatencyManufacture = tr.querySelector('td.' + flagLatencyManufacture + ' input'); - let buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdManufacturingPurchaseOrder] = tr.getAttribute(attrIdManufacturingPurchaseOrder); - jsonRow[attrIdManufacturingPurchaseOrderProductLink] = tr.getAttribute(attrIdManufacturingPurchaseOrderProductLink); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdVariations); - jsonRow[attrIdUnitMeasurementQuantity] = DOM.getElementAttributeValueCurrent(tdUnitQuantity); - jsonRow[flagQuantityUsed] = DOM.getElementAttributeValueCurrent(inputQuantityUsed); - jsonRow[flagQuantityProduced] = DOM.getElementAttributeValueCurrent(inputQuantityProduced); - jsonRow[attrIdUnitMeasurementLatencyManufacture] = DOM.getElementAttributeValueCurrent(tdUnitMeasurementLatencyManufacture); - jsonRow[flagLatencyManufacture] = DOM.getElementAttributeValueCurrent(inputLatencyManufacture); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - - return jsonRow; - } - initialiseRowNew(tbody, row) { - super.initialiseRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupCurrencyFields(); - this.hookupCostAndPriceInputs(); - this.hookupOrderItemsFields(); - this.hookupFieldsActive(); - } - hookupCostAndPriceInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatIncl + ' input'); - } - hookupOrderItemsFields() { - this.hookupOrderItemsPreviews(); - this.hookupFieldsOrderItemDisplayOrder(); - this.hookupFieldsOrderItemProductCategory(); - this.hookupFieldsOrderItemProduct(); - this.hookupFieldsOrderItemProductVariations(); - this.hookupFieldsOrderItemUnitQuantity(); - this.hookupFieldsOrderItemQuantityUsed(); - this.hookupFieldsOrderItemQuantityProduced(); - this.hookupFieldsOrderItemUnitMeasurementLatencyManufacture(); - this.hookupFieldsOrderItemLatencyManufacture(); - this.hookupFieldsOrderItemActive(); - this.hookupFieldsOrderItemAddDelete(); - this.hookupButtonsOrderItemAdd(); - } - hookupOrderItemsPreviews() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems, (event, td) => { - if (!td.classList.contains(flagCollapsed)) return; - this.handleClickOrderItemsPreview(event, td); - }); - } - handleClickOrderItemsPreview(event, element) { - if (_verbose) { console.log("click order items preview"); } - this.toggleColumnHeaderCollapsed(flagOrderItems, false); - element.classList.remove(flagCollapsed); - let row = DOM.getRowFromElement(element); - let idManufacturingPurchaseOrder = row.getAttribute(attrIdManufacturingPurchaseOrder); - let manufacturingPurchaseOrder = idManufacturingPurchaseOrder > 0 ? manufacturingPurchaseOrders[idManufacturingPurchaseOrder] : { - [flagOrderItems]: [], - }; - let tblOrderItems = document.createElement("table"); - tblOrderItems.classList.add(flagOrderItems); - let thead = document.createElement("thead"); - let tr = document.createElement("tr"); - - let thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - let thCategory = document.createElement("th"); - thCategory.classList.add(flagProductCategory); - thCategory.textContent = 'Category'; - let thProduct = document.createElement("th"); - thProduct.classList.add(flagProduct); - thProduct.textContent = 'Product'; - let thVariations = document.createElement("th"); - thVariations.classList.add(flagProductVariations); - thVariations.classList.add(flagCollapsed); - thVariations.textContent = 'Variations'; - let thUnitQuantity = document.createElement("th"); - thUnitQuantity.classList.add(flagUnitMeasurementQuantity); - thUnitQuantity.textContent = 'Unit Quantity'; - let thQuantityUsed = document.createElement("th"); - thQuantityUsed.classList.add(flagQuantityUsed); - thQuantityUsed.textContent = 'Quantity Used'; - let thQuantityProduced = document.createElement("th"); - thQuantityProduced.classList.add(flagQuantityProduced); - thQuantityProduced.textContent = 'Quantity Produced'; - /* - let thCostTotalLocalVatExcl = document.createElement("th"); - thCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - thCostTotalLocalVatExcl.textContent = 'Cost Total Local VAT Excl'; - let thCostTotalLocalVatIncl = document.createElement("th"); - thCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - thCostTotalLocalVatIncl.textContent = 'Cost Total Local VAT Incl'; - let thCostUnitLocalVatExcl = document.createElement("th"); - thCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - thCostUnitLocalVatExcl.textContent = 'Cost Unit Local VAT Excl'; - let thCostUnitLocalVatIncl = document.createElement("th"); - thCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - thCostUnitLocalVatIncl.textContent = 'Cost Unit Local VAT Incl'; - */ - let thUnitMeasurementLatencyManufacture = document.createElement("th"); - thUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - thUnitMeasurementLatencyManufacture.textContent = 'Unit Measurement Latency Manufacture'; - let thLatencyManufacture = document.createElement("th"); - thLatencyManufacture.classList.add(flagLatencyManufacture); - thLatencyManufacture.textContent = 'Latency Manufacture'; - let thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - let thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - let buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - - tr.appendChild(thDisplayOrder); - tr.appendChild(thCategory); - tr.appendChild(thProduct); - tr.appendChild(thVariations); - tr.appendChild(thUnitQuantity); - tr.appendChild(thQuantityUsed); - tr.appendChild(thQuantityProduced); - /* - tr.appendChild(thCostTotalLocalVatExcl); - tr.appendChild(thCostTotalLocalVatIncl); - tr.appendChild(thCostUnitLocalVatExcl); - tr.appendChild(thCostUnitLocalVatIncl); - */ - tr.appendChild(thUnitMeasurementLatencyManufacture); - tr.appendChild(thLatencyManufacture); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblOrderItems.appendChild(thead); - - let tbody = document.createElement("tbody"); - manufacturingPurchaseOrder[flagOrderItems].forEach((orderItem, index) => { - this.addRowManufacturingPurchaseOrderItem(tbody, orderItem); - }); - tblOrderItems.appendChild(tbody); - - let cell = DOM.getCellFromElement(element); - let cellNew = cell.cloneNode(false); - cellNew.appendChild(tblOrderItems); - row.replaceChild(cellNew, cell); - if (_verbose) { console.log("tblOrderItems: ", tblOrderItems); } - this.hookupOrderItemsFields(); - } - addRowManufacturingPurchaseOrderItem(tbody, orderItem) { // productVariationTypeOptions, productVariationOptions, productCategoryOptions, productOptions, unitMeasurementOptions, - if (_verbose) { console.log("addRowManufacturingPurchaseOrderItem: ", orderItem); } - let tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - let inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, orderItem[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - - let tdCategory = document.createElement("td"); - tdCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCategory, orderItem[attrIdProductCategory]); - let divCategory = document.createElement("div"); - divCategory.classList.add(flagProductCategory); - // DOM.setElementAttributesValuesCurrentAndPrevious(divCategory, orderItem[attrIdProductCategory]); - let productCategory = productCategories[orderItem[attrIdProductCategory]]; - divCategory.textContent = BusinessObjects.getObjectText(productCategory); - tdCategory.appendChild(divCategory); - - let tdProduct = document.createElement("td"); - tdProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(tdProduct, orderItem[attrIdProductCategory]); - let divProduct = document.createElement("div"); - divProduct.classList.add(flagProduct); - // DOM.setElementAttributesValuesCurrentAndPrevious(divProduct, orderItem[attrIdProduct]); - let product = products[orderItem[attrIdProduct]]; - divProduct.textContent = BusinessObjects.getObjectText(product); - tdProduct.appendChild(divProduct); - - let tdVariations = document.createElement("td"); - tdVariations.classList.add(flagProductVariations); - tdVariations.classList.add(flagCollapsed); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariations, orderItem[attrIdProductCategory]); - let divVariations = document.createElement("div"); - divVariations.classList.add(flagProductVariations); - // DOM.setElementAttributesValuesCurrentAndPrevious(divVariations, orderItem[attrIdProductVariation]); - let variationsText = ProductPermutation.getProductVariationsPreviewFromIdCsv(orderItem[flagProductVariations]); - divVariations.textContent = variationsText; - tdVariations.appendChild(divVariations); - - let tdUnitQuantity = document.createElement("td"); - tdUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitQuantity, orderItem[attrIdProductCategory]); - let divUnitQuantity = document.createElement("div"); - divUnitQuantity.classList.add(flagUnitMeasurementQuantity); - // DOM.setElementValuesCurrentAndPrevious(divUnitQuantity, orderItem[flagUnitMeasurementQuantity]); - let unitQuantity = unitMeasurements[orderItem[attrIdUnitMeasurementQuantity]]; - divUnitQuantity.textContent = BusinessObjects.getObjectText(unitQuantity); - tdUnitQuantity.appendChild(divUnitQuantity); - - let tdQuantityUsed = document.createElement("td"); - tdQuantityUsed.classList.add(flagQuantityUsed); - let inputQuantityUsed = document.createElement("input"); - inputQuantityUsed.classList.add(flagQuantityUsed); - inputQuantityUsed.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityUsed, orderItem[flagQuantityUsed]); - tdQuantityUsed.appendChild(inputQuantityUsed); - - let tdQuantityProduced = document.createElement("td"); - tdQuantityProduced.classList.add(flagQuantityProduced); - let inputQuantityProduced = document.createElement("input"); - inputQuantityProduced.classList.add(flagQuantityProduced); - inputQuantityProduced.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityProduced, orderItem[flagQuantityProduced]); - tdQuantityProduced.appendChild(inputQuantityProduced); - - /* - let tdCostTotalLocalVatExcl = document.createElement("td"); - tdCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - let inputCostTotalLocalVatExcl = document.createElement("input"); - inputCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - inputCostTotalLocalVatExcl.type = 'number'; - inputCostTotalLocalVatExcl.step = 0.01; - DOM.setElementAttributesValuesCurrentAndPrevious(inputCostTotalLocalVatExcl, orderItem[flagCostTotalLocalVatExcl]); - tdCostTotalLocalVatExcl.appendChild(inputCostTotalLocalVatExcl); - - let tdCostTotalLocalVatIncl = document.createElement("td"); - tdCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - let inputCostTotalLocalVatIncl = document.createElement("input"); - inputCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - inputCostTotalLocalVatIncl.type = 'number'; - inputCostTotalLocalVatIncl.step = 0.01; - DOM.setElementAttributesValuesCurrentAndPrevious(inputCostTotalLocalVatIncl, orderItem[flagCostTotalLocalVatIncl]); - tdCostTotalLocalVatIncl.appendChild(inputCostTotalLocalVatIncl); - - let tdCostUnitLocalVatExcl = document.createElement("td"); - tdCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - let divCostUnitLocalVatExcl = document.createElement("div"); - divCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, orderItem[flagCostUnitLocalVatExcl]); - tdCostUnitLocalVatExcl.appendChild(divCostUnitLocalVatExcl); - - let tdCostUnitLocalVatIncl = document.createElement("td"); - tdCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - let divCostUnitLocalVatIncl = document.createElement("div"); - divCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, orderItem[flagCostUnitLocalVatIncl]); - tdCostUnitLocalVatIncl.appendChild(divCostUnitLocalVatIncl); - */ - - let tdUnitMeasurementLatencyManufacture = document.createElement("td"); - tdUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitMeasurementLatencyManufacture, orderItem[attrIdUnitMeasurementLatencyManufacture]); - let divUnitMeasurementLatencyManufacture = document.createElement("div"); - divUnitMeasurementLatencyManufacture.classList.add(flagUnitMeasurementLatencyManufacture); - // DOM.setElementValuesCurrentAndPrevious(divUnitMeasurementLatencyManufacture, orderItem[flagUnitMeasurementLatencyManufacture]); - let unitMeasurementLatencyManufacture = unitMeasurementsTime[orderItem[attrIdUnitMeasurementLatencyManufacture]]; - divUnitMeasurementLatencyManufacture.textContent = BusinessObjects.getObjectText(unitMeasurementLatencyManufacture); - tdUnitMeasurementLatencyManufacture.appendChild(divUnitMeasurementLatencyManufacture); - - let tdLatencyManufacture = document.createElement("td"); - tdLatencyManufacture.classList.add(flagLatencyManufacture); - let inputLatencyManufacture = document.createElement("input"); - inputLatencyManufacture.classList.add(flagLatencyManufacture); - inputLatencyManufacture.type = 'number'; - inputLatencyManufacture.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputLatencyManufacture, orderItem[flagLatencyManufacture]); - tdLatencyManufacture.appendChild(inputLatencyManufacture); - - let tdActive = this.createTdActive(orderItem[flagActive]); - - let tr = document.createElement("tr"); - tr.classList.add(flagOrderItems); - tr.setAttribute(attrIdManufacturingPurchaseOrder, orderItem[attrIdManufacturingPurchaseOrder]); - tr.setAttribute(attrIdManufacturingPurchaseOrderProductLink, orderItem[attrIdManufacturingPurchaseOrderProductLink]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCategory); - tr.appendChild(tdProduct); - tr.appendChild(tdVariations); - tr.appendChild(tdUnitQuantity); - tr.appendChild(tdQuantityUsed); - tr.appendChild(tdQuantityProduced); - /* - tr.appendChild(tdCostTotalLocalVatExcl); - tr.appendChild(tdCostTotalLocalVatIncl); - tr.appendChild(tdCostUnitLocalVatExcl); - tr.appendChild(tdCostUnitLocalVatIncl); - */ - tr.appendChild(tdUnitMeasurementLatencyManufacture); - tr.appendChild(tdLatencyManufacture); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - hookupFieldsOrderItemDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagDisplayOrder + ' input'); - } - hookupFieldsOrderItemProductCategory() { - this.hookupTableCellDdlPreviews( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductCategory - , Utils.getListFromDict(productCategories) - , (cellSelector) => { this.hookupProductCategoryDdls(cellSelector); } - ); - } - hookupFieldsOrderItemProduct() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - hookupFieldsOrderItemProductVariations() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductVariations, (event, element) => this.handleClickProductPermutationVariationsPreview(event, element)); - } - hookupFieldsOrderItemUnitQuantity() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementQuantity, Utils.getListFromDict(unitMeasurements)); - } - hookupFieldsOrderItemQuantityUsed() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityUsed + ' input'); - } - hookupFieldsOrderItemQuantityProduced() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityProduced + ' input'); - } - /* - hookupFieldsOrderItemPriceTotalLocalVatExcl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatExcl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - this.updateFieldsPriceUnitLocalVatExcl(element); - } - ); - } - hookupFieldsOrderItemPriceTotalLocalVatIncl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatIncl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - this.updateFieldsPriceUnitLocalVatIncl(element); - } - ); - } - updateFieldsPriceUnitLocalVatExcl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputPriceTotalLocalVatExcl = row.querySelector('td.' + flagPriceTotalLocalVatExcl + ' input'); - let priceTotalLocalVatExcl = DOM.getElementValueCurrent(inputPriceTotalLocalVatExcl); - let inputQuantityUsed = row.querySelector('td.' + flagQuantityUsed + ' input'); - let quantityUsed = DOM.getElementValueCurrent(inputQuantityUsed); - - let divPriceUnitLocalVatExcl = row.querySelector('td.' + flagPriceUnitLocalVatExcl + ' div'); - let priceUnitLocalVatExcl = quantityUsed == 0 ? 0 : priceTotalLocalVatExcl / quantityUsed; - DOM.setElementValuesCurrentAndPrevious(divPriceUnitLocalVatExcl, priceUnitLocalVatExcl); - - let rowManufacturingPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divPriceGrandTotalLocalVatExcl = rowManufacturingPurchaseOrder.querySelector('td.' + flagPriceTotalLocalVatExcl + ' div'); - let inputsPriceTotalLocalVatExcl = rowManufacturingPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatExcl + ' input'); - let priceGrandTotalLocalVatExcl = Array.from(inputsPriceTotalLocalVatExcl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divPriceGrandTotalLocalVatExcl, priceGrandTotalLocalVatExcl); - } - updateFieldsPriceUnitLocalVatIncl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputPriceTotalLocalVatIncl = row.querySelector('td.' + flagPriceTotalLocalVatIncl + ' input'); - let priceTotalLocalVatIncl = DOM.getElementValueCurrent(inputPriceTotalLocalVatIncl); - let inputQuantityUsed = row.querySelector('td.' + flagQuantityUsed + ' input'); - let quantityUsed = DOM.getElementValueCurrent(inputQuantityUsed); - - let divPriceUnitLocalVatIncl = row.querySelector('td.' + flagPriceUnitLocalVatIncl + ' div'); - let priceUnitLocalVatIncl = quantityUsed == 0 ? 0 : priceTotalLocalVatIncl / quantityUsed; - DOM.setElementValuesCurrentAndPrevious(divPriceUnitLocalVatIncl, priceUnitLocalVatIncl); - - let rowManufacturingPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divPriceGrandTotalLocalVatIncl = rowManufacturingPurchaseOrder.querySelector('td.' + flagPriceTotalLocalVatIncl + ' div'); - let inputsPriceTotalLocalVatIncl = rowManufacturingPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagPriceTotalLocalVatIncl + ' input'); - let priceGrandTotalLocalVatIncl = Array.from(inputsPriceTotalLocalVatIncl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divPriceGrandTotalLocalVatIncl, priceGrandTotalLocalVatIncl); - } - hookupFieldsOrderItemPriceUnitLocalVatExcl() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceUnitLocalVatExcl + ' input'); - } - hookupFieldsOrderItemPriceUnitLocalVatIncl() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagPriceUnitLocalVatIncl + ' input'); - } - */ - hookupFieldsOrderItemUnitMeasurementLatencyManufacture() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementLatencyManufacture, Utils.getListFromDict(unitMeasurementsTime)); - } - hookupFieldsOrderItemLatencyManufacture() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagLatencyManufacture + ' input'); - } - hookupFieldsOrderItemActive() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' input.' + flagActive); - } - hookupFieldsOrderItemAddDelete() { - let selectorButton = idTableMain + ' td.' + flagOrderItems + ' td.' + flagOrderItems + ' button'; - let selectorButtonDelete = selectorButton + '.' + flagDelete; - let selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsOrderItemAdd(); - } - hookupButtonsOrderItemAdd() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' th button.' + flagAdd, (event, element) => { - let row = element.closest(idTableMain + ' > tbody > tr'); - let idManufacturingPurchaseOrder = row.getAttribute(attrIdManufacturingPurchaseOrder); - // let hasActiveOrderItem = row.querySelectorAll('td.' + flagOrderItems + ' input.' + flagActive + ':checked').length > 0; - let countManufacturingOrderItems = row.querySelectorAll('td.' + flagOrderItems + ' td.' + flagManufacturingPurchaseOrder).length; - let manufacturingPurchaseOrderItem = { - [attrIdManufacturingPurchaseOrder]: idManufacturingPurchaseOrder, - [attrIdManufacturingPurchaseOrderProductLink]: -1 - countManufacturingOrderItems, - [attrIdProductCategory]: 0, - [attrIdProduct]: 0, - [flagProductVariations]: '', - [attrIdUnitMeasurementQuantity]: 0, - [flagQuantityUsed]: '', - [flagQuantityProduced]: '', - [attrIdUnitMeasurementLatencyManufacture]: 0, - [flagLatencyManufacture]: '', - [flagDisplayOrder]: countManufacturingOrderItems + 1, - [flagActive]: true, // !hasActiveOrderItem, - }; - let tbody = row.querySelector('td.' + flagOrderItems + ' table tbody'); - this.addRowManufacturingPurchaseOrderItem(tbody, manufacturingPurchaseOrderItem); - /* - if (!hasActiveOrderItem) { - let tdOrderItem = row.querySelector('td.' + flagOrderItems); - // tdOrderItem.setAttribute(attrIdManufacturingOrderItem, manufacturingPurchaseOrderItem[attrIdManufacturingOrderItem]); - DOM.setElementAttributeValueCurrent(tdOrderItem, manufacturingPurchaseOrderItem[attrIdManufacturingOrderItem]); - } - */ - this.hookupOrderItemsFields(); - }); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/mixin.js b/static/js/pages/store/mixin.js deleted file mode 100644 index 1496389c..00000000 --- a/static/js/pages/store/mixin.js +++ /dev/null @@ -1,452 +0,0 @@ - -import Events from "../../lib/events.js"; -import LocalStorage from "../../lib/local_storage.js"; -import Validation from "../../lib/validation.js"; -// import BasePage from "../base.js"; -import DOM from "../../dom.js"; -import { isEmpty } from "../../lib/utils.js"; - -export default class StoreMixinPage { - constructor(pageCurrent) { - this.page = pageCurrent; - } - - initialize() { - console.log('hookup store start for ', this.page.hash); - this.hookupFilters(); - this.hookupLocalStorageStore(); - this.hookupBasket(); - this.hookupButtonsAddToBasket(); - } - hookupFilters() { - this.hookupFilterCurrency(); - this.hookupFilterDeliveryRegion(); - this.hookupFilterIsIncludedVAT(); - } - hookupFilterCurrency() { - /* - let elForm = document.querySelectorAll(idFormCurrency); - let elSelector = document.querySelectorAll(elForm.querySelector('select')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function(){ - elForm = document.querySelectorAll(idFormCurrency); - elSelector.addEventListener("change", function(event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - console.log('sending data to currency selector controller: '); console.log(ajaxData); - ajaxJSONData('select currency', mapHashToController(hashStoreSelectCurrency), ajaxData, function() { window.location.reload() }, false); - - let optionSelected = elSelector.options[elSelector.selectedIndex] - let textSelected = optionSelected.getAttribute(attrDataShort) - - }); - }); - console.log("form currency initialised") - */ - - let dropdownCurrency = document.querySelectorAll(idCurrency)[0]; - // dropdownCurrency.options.map(function(option) { - let option, indexHyphen, textOption; - for (let indexOption = 0; indexOption < dropdownCurrency.options.length; indexOption++) { - option = document.querySelectorAll(dropdownCurrency.options[indexOption]); - textOption = option.text(); - indexHyphen = textOption.indexOf('-'); - option.setAttribute(attrTextExpanded, textOption); - option.setAttribute(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); - option.classList.add(flagCollapsed); - } - handleSelectCollapse(dropdownCurrency); - Events.initialiseEventHandler(dropdownCurrency, flagInitialised, function() { - dropdownCurrency = document.querySelectorAll(dropdownCurrency); - dropdownCurrency.addEventListener("focus", function() { - handleSelectExpand(dropdownCurrency); - }); - dropdownCurrency.addEventListener("blur", function() { - handleSelectCollapse(dropdownCurrency); - }); - dropdownCurrency.addEventListener("change", function() { - let selectedCurrency = dropdownCurrency.val(); - if (_verbose) { console.log("selected currency: ", selectedCurrency); } - let basket = LocalStorage.getLocalStorage(keyBasket); - basket[keyIdCurrency] = selectedCurrency; - // LocalStorage.setLocalStorage(keyIdCurrency, selectedCurrency); - LocalStorage.setLocalStorage(keyBasket, basket); - let ajaxData = {}; - ajaxData[keyBasket] = basket; - ajaxJSONData('update currency', mapHashToController(hashPageCurrent), ajaxData, loadPageBody, false); - }); - }); - } - hookupFilterDeliveryRegion() { - /* - let elForm = document.querySelectorAll(idFormDeliveryRegion); - let elSelector = document.querySelectorAll(elForm.querySelector('select')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function(){ - elForm = document.querySelectorAll(idFormDeliveryRegion); - elSelector.addEventListener("change", function(event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - console.log('sending data to delivery region selector controller: '); console.log(ajaxData); - ajaxJSONData('select delivery region', mapHashToController(hashStoreSelectDeliveryRegion), ajaxData, function() { window.location.reload() }, false); - }); - console.log("form delivery region initialised") - }); - */ - - let dropdownRegion = document.querySelectorAll(idRegionDelivery)[0]; - - let option, indexHyphen, textOption; - for (let indexOption = 0; indexOption < dropdownRegion.options.length; indexOption++) { - option = document.querySelectorAll(dropdownRegion.options[indexOption]); - textOption = option.text(); - indexHyphen = textOption.indexOf('-'); - option.setAttribute(attrTextExpanded, textOption); - option.setAttribute(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); - option.classList.add(flagCollapsed); - } - - handleSelectCollapse(dropdownRegion); - - Events.initialiseEventHandler(dropdownRegion, flagInitialised, function() { - dropdownRegion = document.querySelectorAll(dropdownRegion); - dropdownRegion.addEventListener("focus", function() { - if (_verbose) { console.log("dropdown region focused"); } - handleSelectExpand(dropdownRegion); - }); - dropdownRegion.addEventListener("blur", function() { - if (_verbose) { console.log("dropdown region blurred"); } - handleSelectCollapse(dropdownRegion); - }); - dropdownRegion.addEventListener("change", function() { - handleSelectCollapse(dropdownRegion); - let selectedRegion = dropdownRegion.val(); - if (_verbose) { console.log("selected region: ", selectedRegion); } - let basket = LocalStorage.getLocalStorage(keyBasket); - basket[keyIdRegionDelivery] = selectedRegion; - // LocalStorage.setLocalStorage(keyIdRegionDelivery, selectedRegion); - LocalStorage.setLocalStorage(keyBasket, basket); - let ajaxData = {}; - ajaxData[keyIdRegionDelivery] = selectedRegion; - ajaxJSONData('update region', mapHashToController(hashStoreSetRegion), ajaxData, null, false); - }); - }); - } - hookupFilterIsIncludedVAT() { - let elForm = document.querySelectorAll(idFormIsIncludedVAT); - let elSelector = document.querySelectorAll(elForm.querySelector('input[type="checkbox"]')[0]); - Events.initialiseEventHandler(elSelector, flagInitialised, function(){ - elForm = document.querySelectorAll(idFormIsIncludedVAT); - elSelector.addEventListener("change", function(event) { - ajaxData = {}; - ajaxData[flagForm] = convertForm2JSON(elForm); - if (_verbose) { - console.log('sending data to include VAT controller: '); - console.log(ajaxData); - } - ajaxJSONData('set include VAT', mapHashToController(hashStoreSetIsIncludedVAT), ajaxData, function() { window.location.reload() }, false); - }); - if (_verbose) { console.log("form is included VAT initialised"); } - }); - } - hookupLocalStorage() { - - // setupPageLocalStorage(hashPageCurrent); - // let lsPage = getPageLocalStorage(hashPageCurrent); - // let d = {} - // d[keyBasket] = LocalStorage.getLocalStorage(keyBasket); // (keyBasket in lsPage) ? lsPage[keyBasket] : {'items': []}; - // console.log('d:'); console.log(d); - let basketLocalStorage = LocalStorage.getLocalStorage(keyBasket); - if (!StoreMixinPage.validateBasket(basketLocalStorage)) { - if (_verbose) { console.log('locally-stored basket not valid'); } - basketLocalStorage = StoreMixinPage.makeNewBasket(); - } - let basketServer = StoreMixinPage.validateBasket(userBasket) ? userBasket : basketLocalStorage; - let basket = StoreMixinPage.areEqualBaskets(basketLocalStorage, basketServer) ? basketServer : StoreMixinPage.mergeBaskets(basketLocalStorage, basketServer); - if (!StoreMixinPage.areEqualBaskets(basketLocalStorage, basket)) { - LocalStorage.setLocalStorage(keyBasket, basket); - } - if (!StoreMixinPage.areEqualBaskets(basketServer, basket)) { - /* - let ajaxData = {} - ajaxData[keyBasket] = basket; - // console.log("hookupLocalStorageStore\nhashStoreBasketLoad: " + hashStoreBasketLoad + "\n"); - // ajaxData[keyIsIncludedVAT] = LocalStorage.getLocalStorage(keyIsIncludedVAT); - console.log('ajax:' + ajaxData); - ajaxJSONData(keyBasket, mapHashToController(hashStoreBasketLoad), ajaxData, loadBasket, false); - */ - API.saveStoreBasket(basket); - } - userBasket = basket; - } - static validateBasket(basket) { - return ( - Validation.isEmpty(basket) && - Validation.dictHasKey(basket, keyItems) && - Validation.dictHasKey(basket, keyIsIncludedVAT) && - Validation.dictHasKey(basket, keyIdCurrency) && - Validation.dictHasKey(basket, keyIdRegionDelivery) - ); - } - static makeNewBasket() { - return { - [keyItems]: [], - [keyIsIncludedVAT]: true, - [keyIdCurrency]: 1, - [keyIdRegionDelivery]: 1 - }; - } - static areEqualBaskets(basket1, basket2) { - return JSON.stringify(basket1) === JSON.stringify(basket2); - } - static mergeBaskets(basketPrimary, basketSecondary) { - let basket = {...basketSecondary, ...basketPrimary}; - let items = {}; - for (let item of basketSecondary[keyItems]) { - items[item[keyIdPermutation]] = item.Quantity; - } - for (let item of basketPrimary[keyItems]) { - items[item[keyIdPermutation]] = items[item[keyIdPermutation]] ? items[item[keyIdPermutation]] + item.Quantity : item.Quantity; - } - basket[keyItems] = Object.values(items); - return basket; - } - hookupBasket() { - // const containerBasket = document.querySelectorAll(idContainerBasket); - this.toggleShowButtonCheckout(); // containerBasket - this.hookupButtonCheckout(); - this.hookupBasketItemPlusAndMinusButtons(); - this.hookupBasketAddInputs(); - this.hookupBasketEditInputs(); - this.hookupDeleteBasketItemButtons(); - } - toggleShowButtonCheckout() { - if (_verbose) { console.log("toggling checkout button"); } - const buttonCheckout = document.querySelectorAll(idButtonCheckout); - const labelBasketEmpty = document.querySelectorAll(idLabelBasketEmpty); - if (userBasket['items'].length == 0) { - buttonCheckout.style.display = "none"; - labelBasketEmpty.style.display = ""; - } else { - buttonCheckout.style.display = ""; - labelBasketEmpty.style.display = "none"; - } - } - hookupButtonCheckout() { - if (_verbose) { console.log("hooking up checkout button"); } - const buttonCheckout = document.querySelectorAll(idButtonCheckout); - // let lsPage = getPageLocalStorage(hashPageCurrent); - Events.initialiseEventHandler(buttonCheckout, flagInitialised, function() { - buttonCheckout.addEventListener("click", function() { - /* - //setupPageLocalStorageNext(hashPageStoreBasket); - let basket = LocalStorage.getLocalStorage(keyBasket); - // goToPage(hashPageStoreBasket); - let ajaxData = {}; - ajaxData[keyBasket] = basket; - - ajaxJSONData('checkout', mapHashToController(hashPageStoreBasket), ajaxData, null, false); - */ - this.router.navigateToHash(hashPageStoreBasket); - }); - }); - } - hookupBasketItemPlusAndMinusButtons() { - const minVal = 1; - const basket = document.querySelector(idFormBasket); - // Basket Add - // Increment - basket.querySelectorAll('div.btn-increment[' + attrFormType + '=' + typeFormBasketAdd + ']').each(function() { - let elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function(){ - elButton.addEventListener("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - let elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketAdd, elButton)).querySelector('input[type="number"]'); - // console.log('input selector ='); console.log('form[' + attrFormType + '=' + elButton.getAttribute(attrFormType) + '][' + attrIdProduct + '=' + elButton.getAttribute(attrIdProduct) + ']'); - let newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal += 1; - elInput.val(newVal); - }); - }); - }); - // Decrement - basket.querySelectorAll('div.btn-decrement[' + attrFormType + '=' + typeFormBasketAdd + ']').each(function() { - let elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function(){ - elButton.addEventListener("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - // let product = document.querySelectorAll('.card.subcard[' + attrIdProduct +'=' + elButton.getAttribute(attrIdProduct) + ']'); - let elInput= document.querySelectorAll(getFormProductSelector(typeFormBasketAdd, elButton)).querySelector('input[type="number"]'); - let newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal = Math.max(minVal, newVal - 1); - elInput.val(newVal); - }); - }); - }); - - // Basket Edit - // Increment - basket.querySelectorAll('div.btn-increment[' + attrFormType + '=' + typeFormBasketEdit + ']').each(function() { - let elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function(){ - elButton.addEventListener("click", function(event) { - event.stopPropagation(); - // basketItem = document.querySelectorAll('.card.subcard[' + attrIdProduct +'=' + elButton.getAttribute(attrIdProduct) + ']'); - let elInput = document.querySelectorAll(getFormProductSelector(typeFormBasketEdit, elButton)).querySelector('input[type="number"]'); - // console.log('input selector ='); console.log('form[' + attrFormType + '=' + elButton.getAttribute(attrFormType) + '][' + attrIdProduct + '=' + elButton.getAttribute(attrIdProduct) + ']'); - let newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal += 1; - elInput.val(newVal); - elInput.trigger("change"); - }); - }); - }); - // Decrement - basket.querySelectorAll('div.btn-decrement[' + attrFormType + '=' + typeFormBasketEdit + ']').each(function() { - let elButton = this; - Events.initialiseEventHandler(elButton, flagInitialised, function(){ - elButton.addEventListener("click", function(event) { - event.stopPropagation(); - let elInput= document.querySelectorAll(getFormProductSelector(typeFormBasketEdit, elButton)).querySelector('input[type="number"]'); - let newVal = parseInt(DOM.getElementValueCurrent(elInput)); - if (isNaN(newVal)) newVal = minVal; - newVal = Math.max(minVal, newVal - 1); - elInput.val(newVal); - elInput.trigger("change"); - }); - }); - }); - } - hookupBasketAddForms() { - let basketAddFormSelector = 'form[' + attrFormType + '=' + typeFormBasketAdd + ']'; - Events.initialiseEventHandler(basketAddFormSelector, flagInitialised, (basketAddForm) => { - let quantityInput = basketAddForm.querySelector('input[type="number"]'); - quantityInput.addEventListener("change", function(event) { - let newVal = parseInt(quantityInput.value); - if (isNaN(newVal) || newVal < 0) { - quantityInput.value = 0; - } - }); - let buttonSubmit = basketAddForm.querySelector('button'); // [type="submit"] - buttonSubmit.addEventListener("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - let newBasketItem = {}; - newBasketItem[keyIdProductPermutation] = basketAddForm.getAttribute(attrIdPermutation); - newBasketItem[keyQuantity] = quantityInput.value; - API.storeAddToBasket(newBasketItem); - }); - }); - } - hookupBasketEditForms() { - let basketEditFormSelector = 'form[' + attrFormType + '=' + typeFormBasketEdit + ']'; - Events.initialiseEventHandler(basketEditFormSelector, flagInitialised, (basketEditForm) => { - let quantityInput = basketEditForm.querySelector('input[type="number"]'); - quantityInput.addEventListener("change", function(event) { - let newVal = parseInt(quantityInput.value); - if (isNaN(newVal) || newVal < 0) { - quantityInput.value = 0; - } - if (quantityInput.value != basketEditForm.getAttribute(attrQuantity)) { - let newBasketItem = {}; - newBasketItem[keyIdProductPermutation] = basketEditForm.getAttribute(attrIdPermutation); - newBasketItem[keyQuantity] = quantityInput.value; - API.storeSaveBasket(newBasketItem); - } - }); - let deleteButton = basketEditForm.querySelector('button'); // [type="button"] - deleteButton.addEventListener("click", (event) => { - event.preventDefault(); - event.stopPropagation(); - API.storeDeleteBasketItem(basketEditForm.getAttribute(attrIdPermutation)); - }); - }); - } - - loadBasket(response) { - userBasket = response.data[keyBasket]; - let basketForm = document.querySelectorAll(idFormBasket); - /* - basketForm.replaceChildren(); - let items = userBasket[keyItems]; - let basketItem; - items.forEach(item => { - basketItem = document.createElement('div'); - basketForm.appendChild(basketItem); - }); - */ - let htmlBlock = response.data[keyHtmlBlock]; - basketForm.innerHTML = htmlBlock; - this.hookupBasket(); - } - - getCurrencySelected() { - let elementSelectorCurrency = document.querySelectorAll(idSelectorCurrency); - let selectedCurrency = elementSelectorCurrency.val(); - if (_verbose) { console.log("selected currency: ", selectedCurrency); } - return selectedCurrency; - } - - hookupStoreCardsProduct() { - - let d; // , lsShared; - let selectorCardProduct = '.card.subcard'; - Events.initialiseEventHandler(selectorCardProduct, flagInitialised, function(cardProduct) { - if (_verbose) { console.log("initialising product card: ", cardProduct); } - cardProduct.addEventListener("click", function(event) { - // d = { keyIdProduct: product.getAttribute(attrIdProduct) } - var elemClicked = event.target; - if (elemClicked.id != 'submit') { // disable for submit buttons - if (_verbose) { - console.log("product click: " + cardProduct.getAttribute(attrIdProduct)); - console.log("permutation click: " + cardProduct.getAttribute(attrIdPermutation)); - } - var d = {} - d[keyIdProduct] = cardProduct.getAttribute(attrIdProduct) - d[keyIdPermutation] = cardProduct.getAttribute(attrIdPermutation) - // send quantity requested - goToPage(hashPageStoreProduct, d); - } - }); - if (_verbose) { console.log("click method added for product ID: " + cardProduct.getAttribute(attrIdProduct) + ', permutation ID: ', cardProduct.getAttribute(attrIdPermutation)); } - }); - } - - leave() {} - - /* - getFormProductSelector(typeForm, elementInForm) { - idPermutation = elementInForm.getAttribute(attrIdPermutation); - console.log('idPermutation: ', idPermutation); - hasPermutation = !Validation.isEmpty(idPermutation); - console.log('has permutation: ', hasPermutation); - selectorIdPermutation = hasPermutation ? '[' + attrIdPermutation + '=' + idPermutation + ']' : ''; - return 'form[' + attrFormType + '="' + typeForm + '"][' + attrIdProduct + '=' + elementInForm.getAttribute(attrIdProduct) + ']' + selectorIdPermutation; - } - - addMetadataBasketToJSON(jsonData) { - jsonData[keyIdCurrency] = LocalStorage.getLocalStorage(keyIdCurrency); - jsonData[keyIdRegionDelivery] = LocalStorage.getLocalStorage(keyIdRegionDelivery); - jsonData[keyIsIncludedVAT] = LocalStorage.getLocalStorage(keyIsIncludedVAT); - return jsonData; - } - */ - - /* - loadFiltersFromLocalStorage(pageHash, parameters_dict) { - - let lsOld = getPageLocalStorage(pageHashCurrent); - pageHashCurrent = pageHash; - clearPageLocalStorage(pageHashCurrent); - setupPageLocalStorage(pageHashCurrent); - let lsNew = getPageLocalStorage(pageHashCurrent); - lsNew[keyBasket] = (keyBasket in lsOld) ? lsOld[keyBasket] : {'items': []}; - setPageLocalStorage(pageHashCurrent, lsNew); - - goToPage(pageHash, parameters_dict); - } - */ -} diff --git a/static/js/pages/store/mixin_table.js b/static/js/pages/store/mixin_table.js deleted file mode 100644 index 5fe392d6..00000000 --- a/static/js/pages/store/mixin_table.js +++ /dev/null @@ -1,25 +0,0 @@ - -import Events from "../../lib/events.js"; -import LocalStorage from "../../lib/local_storage.js"; -import Validation from "../../lib/validation.js"; -// import BasePage from "../base.js"; -import DOM from "../../dom.js"; -import { isEmpty } from "../../lib/utils.js"; -import StoreMixinPage from "./mixin.js"; - -export default class StoreTableMixinPage extends StoreMixinPage { - constructor(pageCurrent) { - super(pageCurrent); - } - initialize() { - super.initialize(); - this.hookupFilters(); - this.hookupTable(); - } - hookupFilters() { - // Implement filter-specific functionality here - } - hookupTable() { - // Implement table-specific functionality here - } -} \ No newline at end of file diff --git a/static/js/pages/store/product_categories.js b/static/js/pages/store/product_categories.js deleted file mode 100644 index fba6d1d4..00000000 --- a/static/js/pages/store/product_categories.js +++ /dev/null @@ -1,132 +0,0 @@ - -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import API from "../../api.js"; -import DOM from "../../dom.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreProductCategories extends TableBasePage { - static hash = hashPageStoreProductCategories; - static attrIdRowObject = attrIdProductCategory; - callSaveTableContent = API.saveCategories; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterIsNotEmpty(); - this.hookupFilterActive(); - } - hookupFilterIsNotEmpty() { - this.hookupEventHandler("change", idFormFilters + ' .' + flagIsNotEmpty, (event, filter) => { - PageStoreProductCategories.isDirtyFilter(filter); - }); - } - - loadRowTable(rowJson) { - if (rowJson == null) return; - if (_verbose) { console.log("applying data row: ", rowJson); } - let row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - row.classList.remove(flagInitialised); - row.querySelectorAll('.' + flagInitialised).forEach(function(element) { - element.classList.remove(flagInitialised); - }); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - let textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - let textareaName = row.querySelector('td.' + flagName + ' textarea'); - let textareaDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let divAccessLevel = tdAccessLevel.querySelector('div.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - - DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, rowJson[flagDisplayOrder]); - DOM.setElementValuesCurrentAndPrevious(textareaCode, rowJson[flagCode]); - DOM.setElementValuesCurrentAndPrevious(textareaName, rowJson[flagName]); - DOM.setElementValuesCurrentAndPrevious(textareaDescription, rowJson[flagDescription]); - tdAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - tdAccessLevel.setAttribute(flagAccessLevelRequired, rowJson[flagAccessLevelRequired]); - divAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - DOM.setElementValuesCurrentAndPrevious(divAccessLevel, rowJson[attrIdAccessLevel]); - divAccessLevel.textContent = rowJson[flagAccessLevelRequired]; - DOM.setElementValuesCurrentAndPrevious(inputActive, rowJson[flagActive]); - row.setAttribute(rowJson[flagKeyPrimary], rowJson[rowJson[flagKeyPrimary]]); - - let table = TableBasePage.getTableMain(); - let bodyTable = table.querySelector('tbody'); - bodyTable.appendChild(row); - } - getJsonRow(row) { - if (row == null) return; - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - let textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - let textareaName = row.querySelector('td.' + flagName + ' textarea'); - let textareaDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonCategory = {}; - jsonCategory[attrIdProductCategory] = row.getAttribute(attrIdProductCategory); - jsonCategory[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonCategory[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonCategory[flagDescription] = DOM.getElementAttributeValueCurrent(textareaDescription); - // jsonCategory[flagAccessLevelRequired] = tdAccessLevel.getAttribute(flagAccessLevelRequired); - jsonCategory[attrIdAccessLevel] = DOM.getElementAttributeValueCurrent(tdAccessLevel); - jsonCategory[flagActive] = buttonActive.classList.contains(flagDelete); - jsonCategory[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(sliderDisplayOrder); - return jsonCategory; - } - initialiseRowNew(tbody, row) { - if (row == null) return; - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupSlidersDisplayOrderTable(); - this.hookupTextareasCodeTable(); - this.hookupTextareasNameTable(); - this.hookupTextareasDescriptionTable(); - this.hookupTdsAccessLevel(); - this.hookupFieldsActive(); - } - - /* - isDirtyRow(row) { - if (row == null) return false; - console.log("Product Category isDirtyRow"); - console.log("row: ", row); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder); - let inputCode = row.querySelector('td.' + flagCode + ' textarea'); - let inputName = row.querySelector('td.' + flagName + ' textarea'); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - let isDirty = sliderDisplayOrder.classList.contains(flagDirty) || inputCode.classList.contains(flagDirty) || inputName.classList.contains(flagDirty) || - inputDescription.classList.contains(flagDirty) || tdAccessLevel.classList.contains(flagDirty) || inputActive.classList.contains(flagDirty); - DOM.handleDirtyElement(row, isDirty); - return isDirty; - } - */ - - leave() { - super.leave(); - } - - /* - getFiltersDefaults() { - filters = {}; - filters.flagIsNotEmpty = true; - filters.flagActive = true; - return filters; - } - */ -} - diff --git a/static/js/pages/store/product_permutations.js b/static/js/pages/store/product_permutations.js deleted file mode 100644 index 6a64c4e6..00000000 --- a/static/js/pages/store/product_permutations.js +++ /dev/null @@ -1,361 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreProductPermutations extends TableBasePage { - static hash = hashPageStoreProductPermutations; - static attrIdRowObject = attrIdProductPermutation; - callSaveTableContent = API.saveProductPermutations; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterProduct(); - this.hookupFilterOutOfStock(); - this.hookupFilterMinStock(); - this.hookupFilterMaxStock(); - } - hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory, (event, filterCategory) => { - // loadPermutations(); - // let wasDirtyFilter = filterCategory.classList.contains(flagDirty); - PageStoreProductPermutations.isDirtyFilter(filterCategory); - let isDirtyFilter = filterCategory.classList.contains(flagDirty); - let idProductCategory = DOM.getElementValueCurrent(filterCategory); - let products = productCategories[idProductCategory]; - let filterProduct = document.querySelector(idFormFilters + ' .' + flagProduct); - let idProductPrevious = filterProduct.getAttribute(attrValuePrevious); - filterProduct.innerHTML = ''; - let optionJson, option; - option = DOM.createOption(null); - filterProduct.appendChild(option); - products.forEach((product) => { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product, idProductPrevious); - option = DOM.createOption(optionJson); - filterProduct.appendChild(option); - }); - filterProduct.dispatchEvent(new Event('change')); - }); - } - hookupFilterProduct() { - this.hookupFilter(flagProduct); - } - hookupFilterOutOfStock() { - this.hookupFilter(flagIsOutOfStock); - } - hookupFilterMinStock() { - this.hookupFilter(flagQuantityMin); - } - hookupFilterMaxStock() { - this.hookupFilter(flagQuantityMax); - } - - loadRowTable(rowJson) { - if (rowJson == null) return; - if (_verbose) { console.log("applying data row: ", rowJson); } - /* - let tableMain = TableBasePage.getTableMain(); - let row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - let dllCategory = row.querySelector('td.' + flagProductCategory + ' select'); - dllCategory.value = rowJson[attrIdProductCategory]; - let ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - let optionJson, option; - listProducts.forEach(function(product) { - if (product[attrIdProductCategory] != rowJson[attrIdProductCategory]) return; - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product); - option = DOM.createOption(optionJson, rowJson[attrIdProduct]); - ddlProduct.appendChild(option); - }); - ddlProduct.value = rowJson[attrIdProduct]; - row.querySelector('td.' + flagProductVariations + ' textarea').value = rowJson[flagProductVariations]; - let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let textareaProductVariations = tdProductVariations.querySelector('textarea'); - DOM.setElementValuesCurrentAndPrevious(textareaProductVariations, rowJson[flagProductVariations]); - let thProductVariations = row.querySelector('td.' + flagProductVariations); - if (!thProductVariations.classList.contains(flagCollapsed)) tdProductVariations.classList.remove(flagCollapsed); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - DOM.setElementValuesCurrentAndPrevious(inputDescription, rowJson[flagDescription]); - let inputCostLocal = row.querySelector('td.' + flagCostLocal + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputCostLocal, rowJson[flagCostLocal]); - let tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCurrencyCost, rowJson[flagCurrencyCost]); - let ddlCurrencyCost = tdCurrencyCost.querySelector('select'); - DOM.setElementValuesCurrentAndPrevious(ddlCurrencyCost, rowJson[flagCurrencyCost]); - let inputProfitLocalMin = row.querySelector('td.' + flagProfitLocalMin + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputProfitLocalMin, rowJson[flagProfitLocalMin]); - let inputLatencyManufactureDays = row.querySelector('td.' + flagLatencyManufacture + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputLatencyManufactureDays, rowJson[flagLatencyManufacture]); - let inputQuantityStock = row.querySelector('td.' + flagQuantityStock + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityStock, rowJson[flagQuantityStock]); - let inputQuantityMin = row.querySelector('td.' + flagQuantityMin + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityMin, rowJson[flagQuantityMin]); - let inputQuantityMax = row.querySelector('td.' + flagQuantityMax + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityMax, rowJson[flagQuantityMax]); - let inputQuantityStep = row.querySelector('td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - DOM.setElementValuesCurrentAndPrevious(inputQuantityStep, rowJson[flagCountUnitMeasurementPerQuantityStep]); - - - - row.querySelector('td.' + flagQuantityStock + ' input').value = rowJson[flagQuantityStock]; - row.querySelector('td.' + flagQuantityMin + ' input').value = rowJson[flagQuantityMin]; - row.querySelector('td.' + flagQuantityMax + ' input').value = rowJson[flagQuantityMax]; - row.querySelector('td.' + flagCostLocal).innerHTML = rowJson[flagCostLocal]; - row.setAttribute(attrIdProductCategory, rowJson[flagProductCategory]); - row.setAttribute(attrIdProduct, rowJson[flagProduct]); - row.setAttribute(attrIdProductPermutation, rowJson[attrIdProductPermutation]); - let tbody = tableMain.querySelector('tbody'); - tbody.appendChild(row); - */ - } - getJsonRow(row) { - if (row == null) return; - let tdProductCategory = row.querySelector('td.' + flagProductCategory); - let tdProduct = row.querySelector('td.' + flagProduct); - let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - // let inputCostLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' input'); - // let inputCostLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' input'); - let tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - let inputProfitLocalMin = row.querySelector('td.' + flagProfitLocalMin + ' input'); - let inputLatencyManufactureDays = row.querySelector('td.' + flagLatencyManufacture + ' input'); - let inputQuantityStock = row.querySelector('td.' + flagQuantityStock + ' input'); - let inputQuantityMin = row.querySelector('td.' + flagQuantityMin + ' input'); - let inputQuantityMax = row.querySelector('td.' + flagQuantityMax + ' input'); - let inputQuantityStep = row.querySelector('td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - let tdUnitMeasurementQuantity = row.querySelector('td.' + flagUnitMeasurementQuantity); - let checkboxIsSubscription = row.querySelector('td.' + flagIsSubscription + ' input'); - let inputCountIntervalRecurrence = row.querySelector('td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - let tdUnitMeasurementIntervalRecurrence = row.querySelector('td.' + flagUnitMeasurementIntervalRecurrence); - let inputIdStripeProduct = row.querySelector('td.' + flagIdStripeProduct + ' input'); - let checkboxDoesExpireFasterOnceUnsealed = row.querySelector('td.' + flagDoesExpireFasterOnceUnsealed + ' input'); - let inputCountIntervalExpirationUnsealed = row.querySelector('td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - let tdUnitMeasurementIntervalExpirationUnsealed = row.querySelector('td.' + flagUnitMeasurementIntervalExpirationUnsealed); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdProductPermutation] = row.getAttribute(attrIdProductPermutation); - jsonRow[attrIdProductCategory] = tdProductCategory.getAttribute(attrValueCurrent); - jsonRow[attrIdProduct] = tdProduct.getAttribute(attrValueCurrent); - jsonRow[flagProductVariations] = tdProductVariations.getAttribute(attrValueCurrent); - jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonRow[flagDescription] = inputDescription.getAttribute(attrValueCurrent); - // jsonRow[flagCostUnitLocalVatExcl] = inputCostLocalVatExcl.getAttribute(attrValueCurrent); - // jsonRow[flagCostUnitLocalVatIncl] = inputCostLocalVatIncl.getAttribute(attrValueCurrent); - jsonRow[flagCurrencyCost] = tdCurrencyCost.getAttribute(attrValueCurrent); - jsonRow[flagProfitLocalMin] = inputProfitLocalMin.getAttribute(attrValueCurrent); - jsonRow[flagLatencyManufacture] = inputLatencyManufactureDays.getAttribute(attrValueCurrent); - jsonRow[flagQuantityStock] = inputQuantityStock.getAttribute(attrValueCurrent); - jsonRow[flagQuantityMin] = inputQuantityMin.getAttribute(attrValueCurrent); - jsonRow[flagQuantityMax] = inputQuantityMax.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementPerQuantityStep] = inputQuantityStep.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementQuantity] = tdUnitMeasurementQuantity.getAttribute(attrValueCurrent); - jsonRow[flagIsSubscription] = checkboxIsSubscription.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementIntervalRecurrence] = inputCountIntervalRecurrence.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementIntervalRecurrence] = tdUnitMeasurementIntervalRecurrence.getAttribute(attrValueCurrent); - jsonRow[flagIdStripeProduct] = inputIdStripeProduct.getAttribute(attrValueCurrent); - jsonRow[flagDoesExpireFasterOnceUnsealed] = checkboxDoesExpireFasterOnceUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagCountUnitMeasurementIntervalExpirationUnsealed] = inputCountIntervalExpirationUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagUnitMeasurementIntervalExpirationUnsealed] = tdUnitMeasurementIntervalExpirationUnsealed.getAttribute(attrValueCurrent); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - initialiseRowNew(tbody, row) { - this.initialiseRowNewDdlsProductCategoryAndProduct(row); - - let checkboxIsSubscription = row.querySelector('td.' + flagIsSubscription + ' input'); - let checkboxDoesExpireFasterOnceUnsealed = row.querySelector('td.' + flagDoesExpireFasterOnceUnsealed + ' input'); - this.handleChangeCheckboxDoesExpireFasterOnceUnsealed(null, checkboxDoesExpireFasterOnceUnsealed); - this.handleChangeCheckboxIsSubscription(null, checkboxIsSubscription); - } - initialiseRowNewDdlsProductCategoryAndProduct(row) { - let ddlCategoryFilter = document.querySelector(idFormFilters + ' #' + attrIdProductCategory); - let idProductCategoryFilter = DOM.getElementValueCurrent(ddlCategoryFilter); - let hasCategoryFilter = !(Validation.isEmpty(idProductCategoryFilter) || idProductCategoryFilter == '0'); - let ddlProductFilter = document.querySelector(idFormFilters + ' #' + attrIdProduct); - let idProductFilter = DOM.getElementValueCurrent(ddlProductFilter); - let hasProductFilter = !(Validation.isEmpty(idProductFilter) || idProductFilter == '0'); - if (_verbose) { - console.log("initialiseRowNew: ", row); - console.log({ddlCategoryFilter, idProductCategoryFilter, hasCategoryFilter, ddlProductFilter, idProductFilter, hasProductFilter}); - } - if (!hasCategoryFilter && !hasProductFilter) return; - if (hasCategoryFilter) { - let ddlCategory = row.querySelector('td.' + flagProductCategory + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlCategory, idProductCategoryFilter); - this.handleChangeProductCategoryDdl(null, ddlCategory); - } - if (hasProductFilter) { - let ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlProduct, idProductFilter); - } - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupFieldsProductCategory(); - this.hookupProductFields(); - this.hookupFieldsProductPermutationVariation(); - this.hookupDescriptionTextareas(); - this.hookupCostFields(); - this.hookupProfitFields(); - this.hookupLatencyManufactureInputs(); - this.hookupQuantityFields(); - this.hookupSubscriptionFields(); - this.hookupIdStripeProductInputs(); - this.hookupExpirationFields(); - this.hookupFieldsActive(); - } - hookupFieldsProductCategory() { - this.hookupTableCellDdlPreviews( - idTableMain + ' td.' + flagProductCategory - , Utils.getListFromDict(productCategories) - , (cellSelector) => { this.hookupProductCategoryDdls(cellSelector); } - ); - } - hookupProductFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - - hookupDescriptionTextareas() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDescription + ' textarea'); - } - hookupCostFields(){ - this.hookupCurrencyCostFields(); - this.hookupCostInputs(); - } - hookupCurrencyCostFields(){ - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrencyCost, Utils.getListFromDict(currencies)); - } - hookupCostInputs(){ - /* - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatIncl + ' input'); - */ - } - hookupProfitFields(){ - // this.hookupCurrencyProfitFields(); - this.hookupProfitInputs(); - } - /* - hookupCurrencyProfitFields(){ - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrency, Utils.getListFromDict(currencies)); - } - */ - hookupProfitInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProfitLocalMin + ' input'); - } - hookupLatencyManufactureInputs(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagLatencyManufacture + ' input'); - } - hookupQuantityFields(){ - this.hookupQuantityMinInputs(); - this.hookupQuantityMaxInputs(); - this.hookupQuantityStockInputs(); - this.hookupCountUnitMeasurementPerQuantityStepInputs(); - this.hookupUnitMeasurementQuantityFields(); - } - hookupQuantityMinInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityMin + ' input'); - } - hookupQuantityMaxInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityMax + ' input'); - } - hookupQuantityStockInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagQuantityStock + ' input'); - } - hookupCountUnitMeasurementPerQuantityStepInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCountUnitMeasurementPerQuantityStep + ' input'); - } - hookupUnitMeasurementQuantityFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagUnitMeasurementQuantity, Utils.getListFromDict(unitMeasurements)); - } - hookupSubscriptionFields() { - this.hookupIsSubscriptionFields(); - this.hookupIntervalRecurrenceFields(); - this.hookupCountIntervalRecurrenceInputs(); - } - hookupIsSubscriptionFields(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsSubscription + ' input', (event, element) => { - this.handleChangeCheckboxIsSubscription(event, element); - }); - } - handleChangeCheckboxIsSubscription(event, element) { - this.handleChangeNestedElementCellTable(event, element); - let isSubscription = DOM.getElementValueCurrent(element); - let row = DOM.getRowFromElement(element); - let inputCountIntervalRecurrence = row.querySelector('td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - let divOrDdlIntervalRecurrence = row.querySelector('td.' + flagUnitMeasurementIntervalRecurrence + ' .' + flagUnitMeasurementIntervalRecurrence); - if (isSubscription) { - inputCountIntervalRecurrence.classList.remove(flagCollapsed); - divOrDdlIntervalRecurrence.classList.remove(flagCollapsed); - let tdUnitMeasurementIntervalRecurrence = divOrDdlIntervalRecurrence.closest('td'); - tdUnitMeasurementIntervalRecurrence.dispatchEvent(new Event('click')); - } else { - inputCountIntervalRecurrence.classList.add(flagCollapsed); - divOrDdlIntervalRecurrence.classList.add(flagCollapsed); - } - } - hookupIntervalRecurrenceFields(){ - this.hookupTableCellDDlPreviewsWhenNotCollapsed(idTableMain + ' td.' + flagUnitMeasurementIntervalRecurrence, Utils.getListFromDict(unitMeasurementsTime)); - } - hookupCountIntervalRecurrenceInputs(){ - this.hookupChangeHandlerTableCellsWhenNotCollapsed(idTableMain + ' td.' + flagCountUnitMeasurementIntervalRecurrence + ' input'); - } - hookupIdStripeProductInputs(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIdStripeProduct + ' input'); - } - hookupExpirationFields(){ - this.hookupDoesExpireFasterOnceUnsealedCheckboxes(); - this.hookupIntervalExpirationUnsealedFields(); - this.hookupCountIntervalExpirationUnsealedInputs(); - } - hookupDoesExpireFasterOnceUnsealedCheckboxes(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDoesExpireFasterOnceUnsealed + ' input', (event, element) => { - this.handleChangeCheckboxDoesExpireFasterOnceUnsealed(event, element); - }); - } - handleChangeCheckboxDoesExpireFasterOnceUnsealed(event, element) { - this.handleChangeNestedElementCellTable(event, element); - let doesExpireFasterOnceUnsealed = DOM.getElementValueCurrent(element); - let row = DOM.getRowFromElement(element); - let inputCountIntervalExpirationUnsealed = row.querySelector('td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - let divOrDdlIntervalExpirationUnsealed = row.querySelector('td.' + flagUnitMeasurementIntervalExpirationUnsealed + ' .' + flagUnitMeasurementIntervalExpirationUnsealed); - if (doesExpireFasterOnceUnsealed) { - inputCountIntervalExpirationUnsealed.classList.remove(flagCollapsed); - divOrDdlIntervalExpirationUnsealed.classList.remove(flagCollapsed); - let tdUnitMeasurementIntervalExpirationUnsealed = divOrDdlIntervalExpirationUnsealed.closest('td'); - tdUnitMeasurementIntervalExpirationUnsealed.dispatchEvent(new Event('click')); - this.hook - } else { - inputCountIntervalExpirationUnsealed.classList.add(flagCollapsed); - divOrDdlIntervalExpirationUnsealed.classList.add(flagCollapsed); - } - } - hookupIntervalExpirationUnsealedFields(){ - this.hookupTableCellDDlPreviewsWhenNotCollapsed(idTableMain + ' td.' + flagUnitMeasurementIntervalExpirationUnsealed, Utils.getListFromDict(unitMeasurementsTime)); - } - hookupCountIntervalExpirationUnsealedInputs(){ - this.hookupChangeHandlerTableCellsWhenNotCollapsed(idTableMain + ' td.' + flagCountUnitMeasurementIntervalExpirationUnsealed + ' input'); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/product_variations.js b/static/js/pages/store/product_variations.js deleted file mode 100644 index 27b734f8..00000000 --- a/static/js/pages/store/product_variations.js +++ /dev/null @@ -1,240 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreProductVariations extends TableBasePage { - static hash = hashPageStoreProductVariations; - static attrIdRowObject = attrIdProductVariationType; - callSaveTableContent = API.saveProductVariations; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - this.hookupFilterIsNotEmpty(); - } - - loadRowTable(rowJson) { - } - getJsonRow(row) { - if (row == null) return; - let inputDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' input'); - let textareaCode = row.querySelector('td.' + flagCode + ' textarea'); - let textareaName = row.querySelector('td.' + flagName + ' textarea'); - let textareaNamePlural = row.querySelector('td.' + flagNamePlural + ' textarea'); - let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdProductVariationType] = row.getAttribute(attrIdProductVariationType); - if (Validation.isEmpty(jsonRow[attrIdProductVariationType])) jsonRow[attrIdProductVariationType] = -1; - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonRow[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonRow[flagNamePlural] = DOM.getElementAttributeValueCurrent(textareaNamePlural); - - let variations = []; - if (tdProductVariations.classList.contains(flagDirty)) { - let trsProductVariation = tdProductVariations.querySelectorAll('tr.' + flagProductVariation + '.' + flagDirty); - if (trsProductVariation != null) { - trsProductVariation.forEach((tr, indexRow) => { - variations.push(this.getJsonRowProductVariation(tr, indexRow)); - }); - } - } - else { - // variations = BusinessObjects.getListObjectsFromIdDictAndCsv(productVariationTypes, DOM.getElementAttributeValueCurrent(tdProductVariations)); - } - jsonRow[flagProductVariations] = variations; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - getJsonRowProductVariation(tr, indexRow) { - let inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - let textareaCode = tr.querySelector('td.' + flagCode + ' textarea'); - let textareaName = tr.querySelector('td.' + flagName + ' textarea'); - // let checkboxActive = tr.querySelector('td.' + flagActive + ' input'); - let buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdProductVariation] = tr.getAttribute(attrIdProductVariation); - if (Validation.isEmpty(jsonRow[attrIdProductVariation])) jsonRow[attrIdProductVariation] = -1 - indexRow; - jsonRow[attrIdProductVariationType] = tr.getAttribute(attrIdProductVariationType); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[flagCode] = DOM.getElementAttributeValueCurrent(textareaCode); - jsonRow[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - - return jsonRow; - } - initialiseRowNew(tbody, row) { - super.initialiseRowNew(tbody, row); - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupSlidersDisplayOrderTable(); - this.hookupTextareasCodeTable(); - this.hookupTextareasNameTable(); - this.hookupTextareasNamePluralTable(); - this.hookupFieldsProductVariation(); - this.hookupFieldsActive(); - } - hookupTextareasNamePluralTable() { - this.hookupChangeHandlerTableCells(idTableMain + ' tbody tr td.' + flagNamePlural + ' textarea'); - } - hookupFieldsProductVariation() { - this.hookupProductVariationsPreviews(); - this.hookupFieldsProductVariationDisplayOrder(); - this.hookupFieldsProductVariationCode(); - this.hookupFieldsProductVariationName(); - this.hookupFieldsProductVariationActive(); - } - hookupProductVariationsPreviews() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagProductVariations + ' div', (event, element) => { - let td = DOM.getCellFromElement(element); - if (!td.classList.contains(flagCollapsed)) return; - this.handleClickProductVariationsPreview(event, element); - }); - } - handleClickProductVariationsPreview(event, element) { - if (_verbose) { console.log("click order items preview"); } - let row = DOM.getRowFromElement(element); - let idProductVariationType = row.getAttribute(attrIdProductVariationType); - let productVariationType = productVariationTypes[idProductVariationType]; - if (productVariationType == null) productVariationType = { - [flagProductVariations]: [], - }; - let tblProductVariations = document.createElement("table"); - tblProductVariations.classList.add(flagProductVariations); - let thead = document.createElement("thead"); - let tr = document.createElement("tr"); - - let thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - let thCode = document.createElement("th"); - thCode.classList.add(flagCode); - thCode.textContent = 'Code'; - let thName = document.createElement("th"); - thName.classList.add(flagName); - thName.textContent = 'Name'; - let thActive = document.createElement("th"); - thActive.classList.add(flagActive); - // thActive.textContent = 'Active'; - let buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagActive); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thActive.appendChild(buttonAdd); - - tr.appendChild(thDisplayOrder); - tr.appendChild(thCode); - tr.appendChild(thName); - tr.appendChild(thActive); - thead.appendChild(tr); - tblProductVariations.appendChild(thead); - - let tbody = document.createElement("tbody"); - productVariationType[flagProductVariations].forEach((productVariation, index) => { - this.addRowProductVariation(tbody, productVariation); - }); - tblProductVariations.appendChild(tbody); - - let cell = DOM.getCellFromElement(element); - let cellNew = cell.cloneNode(false); - cellNew.appendChild(tblProductVariations); - cellNew.classList.remove(flagCollapsed); - row.replaceChild(cellNew, cell); - if (_verbose) { console.log("tblProductVariations: ", tblProductVariations); } - this.toggleColumnHeaderCollapsed(flagProductVariations, false); - this.hookupFieldsProductVariation(); - } - addRowProductVariation(tbody, productVariation) { - if (_verbose) { console.log("addRowProductVariation: ", productVariation); } - - let tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - let inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, productVariation[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - - let tdCode = document.createElement("td"); - tdCode.classList.add(flagCode); - let textareaCode = document.createElement("textarea"); - textareaCode.classList.add(flagCode); - DOM.setElementValuesCurrentAndPrevious(textareaCode, productVariation[flagCode]); - tdCode.appendChild(textareaCode); - - let tdName = document.createElement("td"); - tdName.classList.add(flagName); - let textareaName = document.createElement("textarea"); - textareaName.classList.add(flagName); - DOM.setElementValuesCurrentAndPrevious(textareaName, productVariation[flagName]); - tdName.appendChild(textareaName); - - let tdActive = this.createTdActive(productVariation[flagActive]); - - let tr = document.createElement("tr"); - tr.classList.add(flagProductVariation); - tr.setAttribute(attrIdProductVariationType, productVariation[attrIdProductVariationType]); - tr.setAttribute(attrIdProductVariation, productVariation[attrIdProductVariation]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCode); - tr.appendChild(tdName); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - hookupFieldsProductVariationDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' td.' + flagDisplayOrder + ' input'); - } - hookupFieldsProductVariationCode() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' textarea.' + flagCode); - } - hookupFieldsProductVariationName() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagProductVariations + ' textarea.' + flagName); - } - hookupFieldsProductVariationActive() { - this.hookupFieldsActive(flagProductVariations, (event, element) => { this.hookupButtonsProductVariationAdd(event, element); }); - } - hookupButtonsProductVariationAdd(event, element) { - let row = element.closest(idTableMain + ' > tbody > tr'); - let idProductVariationType = row.getAttribute(attrIdProductVariationType); - let idProductVariation = row.getAttribute(attrIdProductVariation); - let countProductVariations = row.querySelectorAll('td.' + flagProductVariations + ' tr').length; - let productVariation = { - [attrIdProductVariationType]: idProductVariationType, - [attrIdProductVariation]: idProductVariation, - [flagCode]: '', - [flagName]: '', - [flagDisplayOrder]: countProductVariations, - [flagActive]: true, - }; - let tbody = row.querySelector('td.' + flagProductVariations + ' table tbody'); - this.addRowProductVariation(tbody, productVariation); - this.hookupFieldsProductVariation(); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/products.js b/static/js/pages/store/products.js deleted file mode 100644 index 38087527..00000000 --- a/static/js/pages/store/products.js +++ /dev/null @@ -1,143 +0,0 @@ - -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import API from "../../api.js"; -import DOM from "../../dom.js"; -import StoreTableMixinPage from "./mixin_table.js"; -import Utils from "../../lib/utils.js"; - -export default class PageStoreProducts extends TableBasePage { - static hash = hashPageStoreProducts; - static attrIdRowObject = attrIdProduct; - callSaveTableContent = API.saveProducts; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterIsNotEmpty(); - this.hookupFilterActive(); - } - hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory); - } - - loadRowTable(rowJson) { - return; - if (rowJson == null) return; - let row = _rowBlank.cloneNode(true); - row.classList.remove(flagRowNew); - row.classList.remove(flagInitialised); - row.querySelectorAll('.' + flagInitialised).forEach(function(element) { - element.classList.remove(flagInitialised); - }); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - let tdProductCategory = row.querySelector('td.' + flagProductCategory); - let divProductCategory = tdProductCategory.querySelector('div.' + flagProductCategory); - let textareaName = row.querySelector('td.' + flagName + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let divAccessLevel = tdAccessLevel.querySelector('div.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - - DOM.setElementValuesCurrentAndPrevious(sliderDisplayOrder, rowJson[flagDisplayOrder]); - DOM.setElementValuesCurrentAndPrevious(textareaCode, rowJson[flagCode]); - DOM.setElementValuesCurrentAndPrevious(textareaName, rowJson[flagName]); - DOM.setElementValuesCurrentAndPrevious(textareaDescription, rowJson[flagDescription]); - tdAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - tdAccessLevel.setAttribute(flagAccessLevelRequired, rowJson[flagAccessLevelRequired]); - divAccessLevel.setAttribute(attrIdAccessLevel, rowJson[attrIdAccessLevel]); - DOM.setElementValuesCurrentAndPrevious(divAccessLevel, rowJson[attrIdAccessLevel]); - divAccessLevel.textContent = rowJson[flagAccessLevelRequired]; - DOM.setElementValuesCurrentAndPrevious(inputActive, rowJson[flagActive]); - row.setAttribute(rowJson[flagKeyPrimary], rowJson[rowJson[flagKeyPrimary]]); - - let table = TableBasePage.getTableMain(); - let bodyTable = table.querySelector('tbody'); - bodyTable.appendChild(row); - } - getJsonRow(row) { - if (row == null) return; - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); - let tdProductCategory = row.querySelector('td.' + flagProductCategory); - let textareaName = row.querySelector('td.' + flagName + ' textarea'); - // let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let inputHasVariations = row.querySelector('td.' + flagHasVariations + ' input[type="checkbox"]'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonProduct = {}; - jsonProduct[attrIdProduct] = row.getAttribute(attrIdProduct); - jsonProduct[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdProductCategory); - jsonProduct[flagName] = DOM.getElementAttributeValueCurrent(textareaName); - // jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdProductVariations); - // jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonProduct[flagHasVariations] = DOM.getElementAttributeValueCurrent(inputHasVariations); - // jsonProduct[flagAccessLevelRequired] = tdAccessLevel.getAttribute(flagAccessLevelRequired); - jsonProduct[attrIdAccessLevel] = DOM.getElementAttributeValueCurrent(tdAccessLevel); - jsonProduct[flagActive] = buttonActive.classList.contains(flagDelete); - jsonProduct[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(sliderDisplayOrder); - return jsonProduct; - } - initialiseRowNew(tbody, row) { - if (row == null) return; - this.initialiseSliderDisplayOrderRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupSlidersDisplayOrderTable(); - this.hookupTdsProductCategory(); - this.hookupTextareasNameTable(); - this.hookupInputsHasVariationsTable(); - this.hookupTdsAccessLevel(); - this.hookupFieldsActive(); - } - hookupTdsProductCategory() { - let cellSelector = idTableMain + ' tbody td.' + flagProductCategory; - this.hookupTableCellDdlPreviews(cellSelector, Utils.getListFromDict(productCategories)); - } - hookupInputsHasVariationsTable() { - let cellSelector = idTableMain + ' tbody td.' + flagHasVariations + ' input[type="checkbox"]'; - this.hookupChangeHandlerTableCells(cellSelector); - } - - /* - isDirtyRow(row) { - if (row == null) return false; - console.log("Product Product isDirtyRow"); - console.log("row: ", row); - let sliderDisplayOrder = row.querySelector('td.' + flagDisplayOrder); - let inputCode = row.querySelector('td.' + flagCode + ' textarea'); - let inputName = row.querySelector('td.' + flagName + ' textarea'); - let inputDescription = row.querySelector('td.' + flagDescription + ' textarea'); - let tdAccessLevel = row.querySelector('td.' + flagAccessLevel); - let inputActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); - let isDirty = sliderDisplayOrder.classList.contains(flagDirty) || inputCode.classList.contains(flagDirty) || inputName.classList.contains(flagDirty) || - inputDescription.classList.contains(flagDirty) || tdAccessLevel.classList.contains(flagDirty) || inputActive.classList.contains(flagDirty); - DOM.handleDirtyElement(row, isDirty); - return isDirty; - } - */ - - leave() { - super.leave(); - } - - /* - getFiltersDefaults() { - filters = {}; - filters.flagIsNotEmpty = true; - filters.flagActive = true; - return filters; - } - */ -} - diff --git a/static/js/pages/store/stock_items.js b/static/js/pages/store/stock_items.js deleted file mode 100644 index 3555bd9e..00000000 --- a/static/js/pages/store/stock_items.js +++ /dev/null @@ -1,355 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreStockItems extends TableBasePage { - static hash = hashPageStoreStockItems; - static attrIdRowObject = attrIdStockItem; - callSaveTableContent = API.saveStockItems; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterProductCategory(); - this.hookupFilterProduct(); - this.hookupFilterOutOfStock(); - this.hookupFilterMinStock(); - this.hookupFilterMaxStock(); - } - hookupFilterProductCategory() { - this.hookupFilter(flagProductCategory, (event, filterCategory) => { - // loadPermutations(); - // let wasDirtyFilter = filterCategory.classList.contains(flagDirty); - PageStoreStockItems.isDirtyFilter(filterCategory); - let isDirtyFilter = filterCategory.classList.contains(flagDirty); - let idProductCategory = DOM.getElementValueCurrent(filterCategory); - let products = productCategories[idProductCategory]; - let filterProduct = document.querySelector(idFormFilters + ' .' + flagProduct); - let idProductPrevious = filterProduct.getAttribute(attrValuePrevious); - filterProduct.innerHTML = ''; - let optionJson, option; - option = DOM.createOption(null); - filterProduct.appendChild(option); - products.forEach((product) => { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(product, idProductPrevious); - option = DOM.createOption(optionJson); - filterProduct.appendChild(option); - }); - filterProduct.dispatchEvent(new Event('change')); - }); - } - hookupFilterProduct() { - this.hookupFilter(flagProduct); - } - hookupFilterOutOfStock() { - this.hookupFilter(flagIsOutOfStock); - } - hookupFilterMinStock() { - this.hookupFilter(flagQuantityMin); - } - hookupFilterMaxStock() { - this.hookupFilter(flagQuantityMax); - } - - loadRowTable(rowJson) { - } - getJsonRow(row) { - if (row == null) return; - let tdProductCategory = row.querySelector('td.' + flagProductCategory); - let tdProduct = row.querySelector('td.' + flagProduct); - let tdProductVariations = row.querySelector('td.' + flagProductVariations); - let tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - let inputCostLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' input'); - let inputCostLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' input'); - let inputDatePurchased = row.querySelector('td.' + flagDatePurchased + ' input'); - let inputDateReceived = row.querySelector('td.' + flagDateReceived + ' input'); - let tdStorageLocation = row.querySelector('td.' + flagStorageLocation); - let inputIsSealed = row.querySelector('td.' + flagIsSealed + ' input'); - let inputDateUnsealed = row.querySelector('td.' + flagDateUnsealed + ' input'); - let inputDateExpiration = row.querySelector('td.' + flagDateExpiration + ' input'); - let inputIsConsumed = row.querySelector('td.' + flagIsConsumed + ' input'); - let inputDateConsumed = row.querySelector('td.' + flagDateConsumed + ' input'); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdStockItem] = row.getAttribute(attrIdStockItem); - jsonRow[attrIdProductPermutation] = tdProductVariations.getAttribute(attrIdProductPermutation); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdProductCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdProductVariations); - jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; - jsonRow[flagCurrencyCost] = DOM.getElementAttributeValueCurrent(tdCurrencyCost); - jsonRow[flagCostUnitLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatExcl); - jsonRow[flagCostUnitLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatIncl); - jsonRow[flagDatePurchased] = DOM.getElementAttributeValueCurrent(inputDatePurchased); - jsonRow[flagDateReceived] = DOM.getElementAttributeValueCurrent(inputDateReceived); - jsonRow[attrIdStorageLocation] = DOM.getElementAttributeValueCurrent(tdStorageLocation); - jsonRow[flagIsSealed] = DOM.getElementAttributeValueCurrent(inputIsSealed); - jsonRow[flagDateUnsealed] = DOM.getElementAttributeValueCurrent(inputDateUnsealed); - jsonRow[flagDateExpiration] = DOM.getElementAttributeValueCurrent(inputDateExpiration); - jsonRow[flagIsConsumed] = DOM.getElementAttributeValueCurrent(inputIsConsumed); - jsonRow[flagDateConsumed] = DOM.getElementAttributeValueCurrent(inputDateConsumed); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - initialiseRowNew(tbody, row) { - super.initialiseRowNew(tbody, row); - let ddlCategoryFilter = document.querySelector(idFormFilters + ' #' + attrIdProductCategory); - let idProductCategoryFilter = DOM.getElementValueCurrent(ddlCategoryFilter); - let hasCategoryFilter = !(Validation.isEmpty(idProductCategoryFilter) || idProductCategoryFilter == '0'); - let ddlProductFilter = document.querySelector(idFormFilters + ' #' + attrIdProduct); - let idProductFilter = DOM.getElementValueCurrent(ddlProductFilter); - let hasProductFilter = !(Validation.isEmpty(idProductFilter) || idProductFilter == '0'); - if (_verbose) { - console.log("initialiseRowNew: ", row); - console.log({ddlCategoryFilter, idProductCategoryFilter, hasCategoryFilter, ddlProductFilter, idProductFilter, hasProductFilter}); - } - if (!hasCategoryFilter && !hasProductFilter) return; - if (hasCategoryFilter) { - let ddlCategory = row.querySelector('td.' + flagProductCategory + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlCategory, idProductCategoryFilter); - this.handleChangeProductCategoryDdl(null, ddlCategory); - } - if (hasProductFilter) { - let ddlProduct = row.querySelector('td.' + flagProduct + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlProduct, idProductFilter); - } - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupProductCategoryFields(); - this.hookupProductFields(); - this.hookupFieldsProductPermutationVariation(); - this.hookupCurrencyCostFields(); - this.hookupCostInputs(); - this.hookupOrderDateInputs(); - this.hookupStorageLocationFields(); - this.hookupSealingInputs(); - this.hookupExpirationDateInputs(); - this.hookupConsumationInputs(); - this.hookupFieldsActive(); - } - hookupProductCategoryFields() { - this.hookupTableCellDdlPreviews( - idTableMain + ' td.' + flagProductCategory - , Utils.getListFromDict(productCategories) - , (event, element) => { this.hookupProductCategoryDdls(event, element); } - ); - } - hookupProductFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - - /* - handleClickProductPermutationVariationsPreview(event, element) { - let row = DOM.getRowFromElement(element); - let tdProduct = row.querySelector('td.' + flagProduct); - let idProduct = DOM.getElementValueCurrent(tdProduct); - let product = products[idProduct]; - if (!product[flagHasVariations]) return; - super.handleClickProductPermutationVariationsPreview(event, element); - } - */ - handleClickButtonProductPermutationVariationsAdd(event, element) { - let row = DOM.getRowFromElement(element); - let tbody = row.querySelector('tbody'); - let permutationVariation = PageStoreStockItems.createOptionUnselectedProductVariation(); - this.addProductPermutationVariationRow(tbody, permutationVariation); - } - - hookupCurrencyCostFields(){ - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrencyCost, Utils.getListFromDict(currencies)); - } - hookupCostInputs(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatIncl + ' input'); - } - hookupOrderDateInputs(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDatePurchased + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDateReceived + ' input'); - } - - hookupStorageLocationFields(){ - this.hookupEventHandler( - "click", - idTableMain + ' td.' + flagStorageLocation + ' div', - (event, element) => this.handleClickStorageLocationPreview(event, element) - ); - } - handleClickStorageLocationPreview(event, element) { - this.toggleColumnCollapsed(flagStorageLocation, false); - let idPlant = element.getAttribute(attrIdPlant); - let idStorageLocation = element.getAttribute(attrIdStorageLocation); - let tblStorageLocation = document.createElement("table"); - tblStorageLocation.classList.add(flagStorageLocation); - let thead = document.createElement("thead"); - let thPlant = document.createElement("th"); - thPlant.textContent = 'Plant'; - let thLocation = document.createElement("th"); - thLocation.textContent = 'Location'; - let trHead = document.createElement("tr"); - trHead.appendChild(thPlant); - trHead.appendChild(thLocation); - thead.appendChild(trHead); - tblStorageLocation.appendChild(thead); - let tbody = document.createElement("tbody"); - - let plant, optionPlantJson, optionPlant, storageLocation, optionStorageLocationJson, optionStorageLocation; - let plantKeys = Object.keys(plants); - let storageLocationKeys = Object.keys(storageLocations); - - debugger; - let plantJson = idPlant != null ? plants[idPlant] : { - [attrIdPlant]: null, - }; - let storageLocationJson = idStorageLocation != null ? storageLocations[idStorageLocation] : { - [attrIdStorageLocation]: null, - }; - - let tdPlant = document.createElement("td"); - tdPlant.classList.add(flagPlant); - DOM.setElementAttributesValuesCurrentAndPrevious(tdPlant, plantJson[attrIdPlant]); - - let ddlPlant = document.createElement("select"); - ddlPlant.classList.add(flagPlant); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlPlant, plantJson[attrIdPlant]); - - optionPlant = DOM.createOption(null); - if (_verbose) { console.log("optionPlant: ", optionPlant); } - ddlPlant.appendChild(optionPlant); - - plantKeys.forEach((plantKey) => { - plant = plants[plantKey]; - optionPlantJson = BusinessObjects.getOptionJsonFromObjectJson( - plant, // objectJson - plantJson[attrIdPlant] // valueSelected - ); - optionPlant = DOM.createOption(optionPlantJson); - if (_verbose) { console.log("optionPlant: ", optionPlant); } - ddlPlant.appendChild(optionPlant); - }); - - let tdStorageLocation = document.createElement("td"); - tdStorageLocation.classList.add(flagStorageLocation); - DOM.setElementAttributesValuesCurrentAndPrevious(tdStorageLocation, storageLocationJson[attrIdStorageLocation]); - - let ddlStorageLocation = document.createElement("select"); - ddlStorageLocation.classList.add(flagStorageLocation); - DOM.setElementAttributesValuesCurrentAndPrevious(ddlStorageLocation, storageLocationJson[attrIdStorageLocation]); - - optionStorageLocation = DOM.createOption(null); - if (_verbose) { console.log("optionStorageLocation: ", optionStorageLocation); } - ddlStorageLocation.appendChild(optionStorageLocation); - - storageLocationKeys.forEach((StorageLocationKey) => { - storageLocation = storageLocations[StorageLocationKey]; - optionStorageLocationJson = BusinessObjects.getOptionJsonFromObjectJson( - storageLocation, // objectJson - storageLocationJson[attrIdStorageLocation] // valueSelected - ); - optionStorageLocation = DOM.createOption(optionStorageLocationJson); - if (_verbose) { console.log("optionStorageLocation: ", optionStorageLocation); } - ddlStorageLocation.appendChild(optionStorageLocation); - }); - - let trBody = document.createElement("tr"); - tdPlant.appendChild(ddlPlant); - trBody.appendChild(tdPlant); - tdStorageLocation.appendChild(ddlStorageLocation); - trBody.appendChild(tdStorageLocation); - tbody.appendChild(trBody); - - tblStorageLocation.appendChild(tbody); - let tdParent = DOM.getCellFromElement(element); - tdParent.innerHTML = ''; - tdParent.appendChild(tblStorageLocation); - if (_verbose) { console.log("tblStorageLocation: ", tblStorageLocation); } - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPlant + ' select', (event, element) => { this.handleChangeStoragePlantDdl(event, element); }); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagStorageLocation + ' select', (event, element) => { this.handleChangeStorageLocationDdl(event, element); }); - } - handleChangeStoragePlantDdl(event, ddlPlant) { - this.handleChangeNestedElementCellTable(event, ddlPlant); - let row = DOM.getRowFromElement(ddlPlant); - let ddlStorageLocation = row.querySelector('td.' + flagStorageLocation + ' select'); - ddlStorageLocation.innerHTML = ''; - ddlStorageLocation.appendChild(DOM.createOption(null)); - let idPlant = DOM.getElementValueCurrent(ddlPlant); - let storageLocations = plants[idPlant][flagStorageLocations]; - let optionJson, option; - storageLocations.forEach((storageLocation) => { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(storageLocation); - option = DOM.createOption(optionJson); - ddlStorageLocation.appendChild(option); - }); - this.handleChangeNestedElementCellTable(event, ddlStorageLocation); - } - handleChangeStorageLocationDdl(event, ddlStorageLocation) { - this.handleChangeNestedElementCellTable(event, ddlStorageLocation); - } - - hookupSealingInputs() { - this.hookupIsSealedFields(); - this.hookupDateUnsealedInputs(); - } - hookupIsSealedFields(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsSealed + ' input', (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - let isSealed = DOM.getElementValueCurrent(element); - let row = DOM.getRowFromElement(element); - let inputDateUnsealed = row.querySelector('td.' + flagDateUnsealed + ' input'); - if (isSealed) { - inputDateUnsealed.classList.add(flagCollapsed); - } else { - inputDateUnsealed.classList.remove(flagCollapsed); - } - }); - } - hookupDateUnsealedInputs(){ - this.hookupChangeHandlerTableCellsWhenNotCollapsed("change", idTableMain + ' td.' + flagDateUnsealed + ' input'); - } - - hookupExpirationDateInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDateExpiration + ' input'); - } - - hookupConsumationInputs() { - this.hookupIsConsumedFields(); - this.hookupDateConsumedInputs(); - } - hookupIsConsumedFields(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagIsConsumed + ' input', (event, element) => { - this.handleChangeNestedElementCellTable(event, element); - let isConsumed = DOM.getElementValueCurrent(element); - let row = DOM.getRowFromElement(element); - let inputDateConsumed = row.querySelector('td.' + flagDateConsumed + ' input'); - if (isConsumed) { - inputDateConsumed.classList.remove(flagCollapsed); - } else { - inputDateConsumed.classList.add(flagCollapsed); - } - }); - } - hookupDateConsumedInputs(){ - this.hookupChangeHandlerTableCellsWhenNotCollapsed("change", idTableMain + ' td.' + flagDateConsumed + ' input'); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/supplier_purchase_orders.js b/static/js/pages/store/supplier_purchase_orders.js deleted file mode 100644 index fc8b8575..00000000 --- a/static/js/pages/store/supplier_purchase_orders.js +++ /dev/null @@ -1,509 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import ProductPermutation from "../../lib/business_objects/store/product_permutation.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreSupplierPurchaseOrders extends TableBasePage { - static hash = hashPageStoreSupplierPurchaseOrders; - static attrIdRowObject = attrIdSupplierPurchaseOrder; - callSaveTableContent = API.saveSupplierPurchaseOrders; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - - loadRowTable(rowJson) { - } - getJsonRow(row) { - if (row == null) return; - let tdSupplier = row.querySelector('td.' + flagSupplier); - let tdCurrency = row.querySelector('td.' + flagCurrency); - let inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - let inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - let trsPurchaseOrderItem = row.querySelectorAll('tr.' + flagOrderItems); - let buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdSupplierPurchaseOrder] = row.getAttribute(attrIdSupplierPurchaseOrder); - jsonRow[attrIdSupplier] = DOM.getElementAttributeValueCurrent(tdSupplier); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - // jsonRow[flagOrderItems] = DOM.getElementAttributeValueCurrent(tdItems); - let orderItems = []; - if (trsPurchaseOrderItem != null) { - trsPurchaseOrderItem.forEach((tr) => { - orderItems.push(this.getJsonRowOrderItem(tr)); - }); - } - jsonRow[flagOrderItems] = orderItems; - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - getJsonRowOrderItem(tr) { - let inputDisplayOrder = tr.querySelector('td.' + flagDisplayOrder + ' input'); - let tdCategory = tr.querySelector('td.' + flagProductCategory); - let tdProduct = tr.querySelector('td.' + flagProduct); - let tdVariations = tr.querySelector('td.' + flagProductVariations); - let tdUnitQuantity = tr.querySelector('td.' + flagUnitMeasurementQuantity); - let inputQuantityOrdered = tr.querySelector('td.' + flagQuantityOrdered + ' input'); - let inputQuantityReceived = tr.querySelector('td.' + flagQuantityReceived + ' input'); - let inputCostTotalLocalVatExcl = tr.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - let inputCostTotalLocalVatIncl = tr.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - let inputLatencyDeliveryDays = tr.querySelector('td.' + flagLatencyDeliveryDays + ' input'); - let buttonActive = tr.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdSupplierPurchaseOrder] = tr.getAttribute(attrIdSupplierPurchaseOrder); - jsonRow[attrIdSupplierPurchaseOrderProductLink] = tr.getAttribute(attrIdSupplierPurchaseOrderProductLink); - jsonRow[flagDisplayOrder] = DOM.getElementAttributeValueCurrent(inputDisplayOrder); - jsonRow[attrIdProductCategory] = DOM.getElementAttributeValueCurrent(tdCategory); - jsonRow[attrIdProduct] = DOM.getElementAttributeValueCurrent(tdProduct); - jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdVariations); - jsonRow[attrIdUnitMeasurementQuantity] = DOM.getElementAttributeValueCurrent(tdUnitQuantity); - jsonRow[flagQuantityOrdered] = DOM.getElementAttributeValueCurrent(inputQuantityOrdered); - jsonRow[flagQuantityReceived] = DOM.getElementAttributeValueCurrent(inputQuantityReceived); - jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); - jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); - jsonRow[flagLatencyDeliveryDays] = DOM.getElementAttributeValueCurrent(inputLatencyDeliveryDays); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - - return jsonRow; - } - initialiseRowNew(tbody, row) { - super.initialiseRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupSupplierFields(); - this.hookupCurrencyFields(); - this.hookupCostInputs(); - this.hookupOrderItemsFields(); - this.hookupFieldsActive(); - } - hookupSupplierFields() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagSupplier, Utils.getListFromDict(suppliers)); - } - hookupCostInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); - } - hookupOrderItemsFields() { - this.hookupOrderItemsPreviews(); - this.hookupFieldsOrderItemDisplayOrder(); - this.hookupFieldsOrderItemProductCategory(); - this.hookupFieldsOrderItemProduct(); - // this.hookupFieldsOrderItemProductVariations(); - this.hookupFieldsProductPermutationVariation(); - this.hookupFieldsOrderItemUnitQuantity(); - this.hookupFieldsOrderItemQuantityOrdered(); - this.hookupFieldsOrderItemQuantityReceived(); - this.hookupFieldsOrderItemCostTotalLocalVatExcl(); - this.hookupFieldsOrderItemCostTotalLocalVatIncl(); - this.hookupFieldsOrderItemLatencyDeliveryDays(); - this.hookupFieldsOrderItemActive(); - this.hookupFieldsOrderItemAddDelete(); - } - hookupOrderItemsPreviews() { - this.hookupEventHandler("click", idTableMain + ' > tbody > tr > td.' + flagOrderItems + ' > div', (event, div) => { - let td = DOM.getCellFromElement(div); - if (!td.classList.contains(flagCollapsed)) return; - this.handleClickOrderItemsPreview(event, div); - }); - } - handleClickOrderItemsPreview(event, element) { - if (_verbose) { console.log("click order items preview"); } - this.toggleColumnHeaderCollapsed(flagOrderItems, false); - /* - let td = DOM.getCellFromElement(element); - td.classList.remove(flagCollapsed); - */ - - let row = DOM.getRowFromElement(element); - let idSupplierPurchaseOrder = row.getAttribute(attrIdSupplierPurchaseOrder); - // if (idSupplierPurchaseOrder == null || idSupplierPurchaseOrder < 1) return; - let supplierPurchaseOrder = supplierPurchaseOrders[idSupplierPurchaseOrder]; - if (supplierPurchaseOrder == null) supplierPurchaseOrder = { - [flagOrderItems]: [], - }; - let tblOrderItems = document.createElement("table"); - tblOrderItems.classList.add(flagOrderItems); - let thead = document.createElement("thead"); - let tr = document.createElement("tr"); - - let thDisplayOrder = document.createElement("th"); - thDisplayOrder.classList.add(flagDisplayOrder); - thDisplayOrder.textContent = 'Display Order'; - let thCategory = document.createElement("th"); - thCategory.classList.add(flagProductCategory); - thCategory.textContent = 'Category'; - let thProduct = document.createElement("th"); - thProduct.classList.add(flagProduct); - thProduct.textContent = 'Product'; - let thVariations = document.createElement("th"); - thVariations.classList.add(flagProductVariations); - thVariations.classList.add(flagCollapsed); - thVariations.textContent = 'Variations'; - let thUnitQuantity = document.createElement("th"); - thUnitQuantity.classList.add(flagUnitMeasurementQuantity); - thUnitQuantity.textContent = 'Unit Quantity'; - let thQuantityOrdered = document.createElement("th"); - thQuantityOrdered.classList.add(flagQuantityOrdered); - thQuantityOrdered.textContent = 'Quantity Ordered'; - let thQuantityReceived = document.createElement("th"); - thQuantityReceived.classList.add(flagQuantityReceived); - thQuantityReceived.textContent = 'Quantity Received'; - let thCostTotalLocalVatExcl = document.createElement("th"); - thCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - thCostTotalLocalVatExcl.textContent = 'Cost Total Local VAT Excl'; - let thCostTotalLocalVatIncl = document.createElement("th"); - thCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - thCostTotalLocalVatIncl.textContent = 'Cost Total Local VAT Incl'; - let thCostUnitLocalVatExcl = document.createElement("th"); - thCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - thCostUnitLocalVatExcl.textContent = 'Cost Unit Local VAT Excl'; - let thCostUnitLocalVatIncl = document.createElement("th"); - thCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - thCostUnitLocalVatIncl.textContent = 'Cost Unit Local VAT Incl'; - let thLatencyDeliveryDays = document.createElement("th"); - thLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - thLatencyDeliveryDays.textContent = 'Latency Delivery (Days)'; - let thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - let thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - let buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - - tr.appendChild(thDisplayOrder); - tr.appendChild(thCategory); - tr.appendChild(thProduct); - tr.appendChild(thVariations); - tr.appendChild(thUnitQuantity); - tr.appendChild(thQuantityOrdered); - tr.appendChild(thQuantityReceived); - tr.appendChild(thCostTotalLocalVatExcl); - tr.appendChild(thCostTotalLocalVatIncl); - tr.appendChild(thCostUnitLocalVatExcl); - tr.appendChild(thCostUnitLocalVatIncl); - tr.appendChild(thLatencyDeliveryDays); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblOrderItems.appendChild(thead); - - let tbody = document.createElement("tbody"); - supplierPurchaseOrder[flagOrderItems].forEach((orderItem, index) => { - this.addRowSupplierPurchaseOrderItem(tbody, orderItem); - }); - tblOrderItems.appendChild(tbody); - - let cell = DOM.getCellFromElement(element); - let cellNew = cell.cloneNode(false); - cellNew.appendChild(tblOrderItems); - cellNew.classList.remove(flagCollapsed); - row.replaceChild(cellNew, cell); - if (_verbose) { console.log("tblOrderItems: ", tblOrderItems); } - this.hookupOrderItemsFields(); - } - addRowSupplierPurchaseOrderItem(tbody, orderItem) { // productVariationTypeOptions, productVariationOptions, productCategoryOptions, productOptions, unitMeasurementOptions, - if (_verbose) { console.log("addRowSupplierPurchaseOrderItem: ", orderItem); } - - let tdDisplayOrder = document.createElement("td"); - tdDisplayOrder.classList.add(flagDisplayOrder); - let inputDisplayOrder = document.createElement("input"); - inputDisplayOrder.classList.add(flagDisplayOrder); - inputDisplayOrder.type = 'number'; - inputDisplayOrder.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputDisplayOrder, orderItem[flagDisplayOrder]); - tdDisplayOrder.appendChild(inputDisplayOrder); - - let tdCategory = document.createElement("td"); - tdCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(tdCategory, orderItem[attrIdProductCategory]); - let divCategory = document.createElement("div"); - divCategory.classList.add(flagProductCategory); - DOM.setElementAttributesValuesCurrentAndPrevious(divCategory, orderItem[attrIdProductCategory]); - // divCategory.textContent = orderItem[flagProductCategory]; - let productCategory = productCategories[orderItem[attrIdProductCategory]]; - divCategory.textContent = BusinessObjects.getObjectText(productCategory); - tdCategory.appendChild(divCategory); - - let tdProduct = document.createElement("td"); - tdProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(tdProduct, orderItem[attrIdProduct]); - let divProduct = document.createElement("div"); - divProduct.classList.add(flagProduct); - DOM.setElementAttributesValuesCurrentAndPrevious(divProduct, orderItem[attrIdProduct]); - // divProduct.textContent = orderItem[flagProduct]; - let product = products[orderItem[attrIdProduct]]; - divProduct.textContent = BusinessObjects.getObjectText(product); - tdProduct.appendChild(divProduct); - - let tdVariations = document.createElement("td"); - tdVariations.classList.add(flagProductVariations); - tdVariations.classList.add(flagCollapsed); - DOM.setElementAttributesValuesCurrentAndPrevious(tdVariations, orderItem[flagProductVariations]); - let divVariations = document.createElement("div"); - divVariations.classList.add(flagProductVariations); - DOM.setElementAttributesValuesCurrentAndPrevious(divVariations, orderItem[flagProductVariations]); - // divVariations.textContent = orderItem[flagProductVariations]; - let variationsText = ProductPermutation.getProductVariationsPreviewFromIdCsv(orderItem[flagProductVariations]); - divVariations.textContent = variationsText; - tdVariations.appendChild(divVariations); - - let tdUnitQuantity = document.createElement("td"); - tdUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(tdUnitQuantity, orderItem[attrIdUnitMeasurementQuantity]); - let divUnitQuantity = document.createElement("div"); - divUnitQuantity.classList.add(flagUnitMeasurementQuantity); - DOM.setElementAttributesValuesCurrentAndPrevious(divUnitQuantity, orderItem[attrIdUnitMeasurementQuantity]); - let unitQuantity = unitMeasurements[orderItem[attrIdUnitMeasurementQuantity]]; - divUnitQuantity.textContent = BusinessObjects.getObjectText(unitQuantity); - tdUnitQuantity.appendChild(divUnitQuantity); - - let tdQuantityOrdered = document.createElement("td"); - tdQuantityOrdered.classList.add(flagQuantityOrdered); - let inputQuantityOrdered = document.createElement("input"); - inputQuantityOrdered.classList.add(flagQuantityOrdered); - inputQuantityOrdered.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityOrdered, orderItem[flagQuantityOrdered]); - tdQuantityOrdered.appendChild(inputQuantityOrdered); - - let tdQuantityReceived = document.createElement("td"); - tdQuantityReceived.classList.add(flagQuantityReceived); - let inputQuantityReceived = document.createElement("input"); - inputQuantityReceived.classList.add(flagQuantityReceived); - inputQuantityReceived.type = 'number'; - DOM.setElementValuesCurrentAndPrevious(inputQuantityReceived, orderItem[flagQuantityReceived]); - tdQuantityReceived.appendChild(inputQuantityReceived); - - let tdCostTotalLocalVatExcl = document.createElement("td"); - tdCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - let inputCostTotalLocalVatExcl = document.createElement("input"); - inputCostTotalLocalVatExcl.classList.add(flagCostTotalLocalVatExcl); - inputCostTotalLocalVatExcl.type = 'number'; - inputCostTotalLocalVatExcl.step = 0.01; - DOM.setElementValuesCurrentAndPrevious(inputCostTotalLocalVatExcl, orderItem[flagCostTotalLocalVatExcl]); - tdCostTotalLocalVatExcl.appendChild(inputCostTotalLocalVatExcl); - - let tdCostTotalLocalVatIncl = document.createElement("td"); - tdCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - let inputCostTotalLocalVatIncl = document.createElement("input"); - inputCostTotalLocalVatIncl.classList.add(flagCostTotalLocalVatIncl); - inputCostTotalLocalVatIncl.type = 'number'; - inputCostTotalLocalVatIncl.step = 0.01; - DOM.setElementValuesCurrentAndPrevious(inputCostTotalLocalVatIncl, orderItem[flagCostTotalLocalVatIncl]); - tdCostTotalLocalVatIncl.appendChild(inputCostTotalLocalVatIncl); - - let tdCostUnitLocalVatExcl = document.createElement("td"); - tdCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - let divCostUnitLocalVatExcl = document.createElement("div"); - divCostUnitLocalVatExcl.classList.add(flagCostUnitLocalVatExcl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, Validation.toFixedOrDefault(orderItem[flagCostUnitLocalVatExcl], 3, null)); - tdCostUnitLocalVatExcl.appendChild(divCostUnitLocalVatExcl); - - let tdCostUnitLocalVatIncl = document.createElement("td"); - tdCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - let divCostUnitLocalVatIncl = document.createElement("div"); - divCostUnitLocalVatIncl.classList.add(flagCostUnitLocalVatIncl); - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, Validation.toFixedOrDefault(orderItem[flagCostUnitLocalVatIncl], 3, null)); - tdCostUnitLocalVatIncl.appendChild(divCostUnitLocalVatIncl); - - let tdLatencyDeliveryDays = document.createElement("td"); - tdLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - let inputLatencyDeliveryDays = document.createElement("input"); - inputLatencyDeliveryDays.classList.add(flagLatencyDeliveryDays); - inputLatencyDeliveryDays.type = 'number'; - inputLatencyDeliveryDays.step = 1; - DOM.setElementValuesCurrentAndPrevious(inputLatencyDeliveryDays, orderItem[flagLatencyDeliveryDays]); - tdLatencyDeliveryDays.appendChild(inputLatencyDeliveryDays); - - let tdActive = this.createTdActive(orderItem[flagActive]); - - let tr = document.createElement("tr"); - tr.classList.add(flagOrderItems); - tr.setAttribute(attrIdSupplierPurchaseOrder, orderItem[attrIdSupplierPurchaseOrder]); - tr.setAttribute(attrIdSupplierPurchaseOrderProductLink, orderItem[attrIdSupplierPurchaseOrderProductLink]); - tr.appendChild(tdDisplayOrder); - tr.appendChild(tdCategory); - tr.appendChild(tdProduct); - tr.appendChild(tdVariations); - tr.appendChild(tdUnitQuantity); - tr.appendChild(tdQuantityOrdered); - tr.appendChild(tdQuantityReceived); - tr.appendChild(tdCostTotalLocalVatExcl); - tr.appendChild(tdCostTotalLocalVatIncl); - tr.appendChild(tdCostUnitLocalVatExcl); - tr.appendChild(tdCostUnitLocalVatIncl); - tr.appendChild(tdLatencyDeliveryDays); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - hookupFieldsOrderItemDisplayOrder() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagDisplayOrder + ' input'); - } - hookupFieldsOrderItemProductCategory() { - this.hookupTableCellDdlPreviews( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductCategory - , Utils.getListFromDict(productCategories) - , (cellSelector) => { this.hookupProductCategoryDdls(cellSelector); } - ); - } - hookupFieldsOrderItemProduct() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagOrderItems + ' td.' + flagProduct, Utils.getListFromDict(products)); - } - /* - hookupFieldsOrderItemProductVariations() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' td.' + flagProductVariations, (event, element) => this.handleClickProductPermutationVariationsPreview(event, element)); - } - hookupDdlsProductPermutationVariation() { - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariation); - } - hookupDdlsProductPermutationVariationType() { - this.hookupTableCellDdls(idTableMain + ' td.' + flagProductVariations + ' td.' + flagProductVariationType); - } - */ - hookupFieldsOrderItemUnitQuantity() { - this.hookupTableCellDdlPreviews( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagUnitMeasurementQuantity - , Utils.getListFromDict(unitMeasurements) - ); - } - hookupFieldsOrderItemQuantityOrdered() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityOrdered + ' input' - ); - } - hookupFieldsOrderItemQuantityReceived() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagQuantityReceived + ' input' - ); - } - hookupFieldsOrderItemCostTotalLocalVatExcl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatExcl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); // flagCostTotalLocalVatExcl); - this.updateFieldsCostUnitLocalVatExcl(element); - } - ); - } - hookupFieldsOrderItemCostTotalLocalVatIncl() { - this.hookupChangeHandlerTableCells( - idTableMain + ' td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatIncl + ' input' - , (event, element) => { - this.handleChangeNestedElementCellTable(event, element); // flagCostTotalLocalVatIncl); - this.updateFieldsCostUnitLocalVatIncl(element); - } - ); - } - updateFieldsCostUnitLocalVatExcl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); - let costTotalLocalVatExcl = DOM.getElementValueCurrent(inputCostTotalLocalVatExcl); - let inputQuantityOrdered = row.querySelector('td.' + flagQuantityOrdered + ' input'); - let quantityOrdered = DOM.getElementValueCurrent(inputQuantityOrdered); - - let divCostUnitLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' div'); - let costUnitLocalVatExcl = quantityOrdered == 0 ? 0 : costTotalLocalVatExcl / quantityOrdered; - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatExcl, costUnitLocalVatExcl.toFixed(3)); - - let rowSupplierPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divCostGrandTotalLocalVatExcl = rowSupplierPurchaseOrder.querySelector('td.' + flagCostTotalLocalVatExcl + ' div'); - let inputsCostTotalLocalVatExcl = rowSupplierPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatExcl + ' input'); - let costGrandTotalLocalVatExcl = Array.from(inputsCostTotalLocalVatExcl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divCostGrandTotalLocalVatExcl, costGrandTotalLocalVatExcl); - } - updateFieldsCostUnitLocalVatIncl(elementChanged) { - let row = elementChanged.closest('tr.' + flagOrderItems); - let inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); - let costTotalLocalVatIncl = DOM.getElementValueCurrent(inputCostTotalLocalVatIncl); - let inputQuantityOrdered = row.querySelector('td.' + flagQuantityOrdered + ' input'); - let quantityOrdered = DOM.getElementValueCurrent(inputQuantityOrdered); - - let divCostUnitLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' div'); - let costUnitLocalVatIncl = quantityOrdered == 0 ? 0 : costTotalLocalVatIncl / quantityOrdered; - DOM.setElementValuesCurrentAndPrevious(divCostUnitLocalVatIncl, costUnitLocalVatIncl.toFixed(3)); - - let rowSupplierPurchaseOrder = row.closest(idTableMain + ' > tbody > tr'); - let divCostGrandTotalLocalVatIncl = rowSupplierPurchaseOrder.querySelector('td.' + flagCostTotalLocalVatIncl + ' div'); - let inputsCostTotalLocalVatIncl = rowSupplierPurchaseOrder.querySelectorAll('td.' + flagOrderItems + ' td.' + flagCostTotalLocalVatIncl + ' input'); - let costGrandTotalLocalVatIncl = Array.from(inputsCostTotalLocalVatIncl).reduce((acc, input) => acc + Number(DOM.getElementValueCurrent(input)), 0); - DOM.setElementValueCurrent(divCostGrandTotalLocalVatIncl, costGrandTotalLocalVatIncl); - } - hookupFieldsOrderItemLatencyDeliveryDays() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' td.' + flagLatencyDeliveryDays + ' input'); - } - hookupFieldsOrderItemActive() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagOrderItems + ' input.' + flagActive); - } - hookupFieldsOrderItemAddDelete() { - let selectorButton = idTableMain + ' td.' + flagOrderItems + ' td.' + flagOrderItems + ' button'; - let selectorButtonDelete = selectorButton + '.' + flagDelete; - let selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsOrderItemAdd(); - } - hookupButtonsOrderItemAdd() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagOrderItems + ' th button.' + flagAdd, (event, element) => { - let row = element.closest(idTableMain + ' > tbody > tr'); - let idSupplierPurchaseOrder = row.getAttribute(attrIdSupplierPurchaseOrder); - // let hasActiveOrderItem = row.querySelectorAll('td.' + flagOrderItems + ' input.' + flagActive + ':checked').length > 0; - let countSupplierOrderItems = row.querySelectorAll('td.' + flagOrderItems + ' td.' + flagSupplierPurchaseOrder).length; - let supplierOrderItem = { - [attrIdSupplierPurchaseOrder]: idSupplierPurchaseOrder, - [attrIdSupplierPurchaseOrderProductLink]: -1 - countSupplierOrderItems, - [attrIdProductCategory]: 0, - [attrIdProduct]: 0, - [flagProductVariations]: '', - [attrIdUnitMeasurementQuantity]: 0, - [flagQuantityOrdered]: '', - [flagQuantityReceived]: '', - [flagCostTotalLocalVatExcl]: '', - [flagCostTotalLocalVatIncl]: '', - [flagCostUnitLocalVatExcl]: '', - [flagCostUnitLocalVatIncl]: '', - [flagLatencyDeliveryDays]: '', - [flagDisplayOrder]: countSupplierOrderItems + 1, - [flagActive]: true, // !hasActiveOrderItem, - }; - let tbody = row.querySelector('td.' + flagOrderItems + ' table tbody'); - this.addRowSupplierPurchaseOrderItem(tbody, supplierOrderItem); - /* - if (!hasActiveOrderItem) { - let tdOrderItem = row.querySelector('td.' + flagOrderItems); - // tdOrderItem.setAttribute(attrIdSupplierOrderItem, supplierOrderItem[attrIdSupplierOrderItem]); - DOM.setElementAttributeValueCurrent(tdOrderItem, supplierOrderItem[attrIdSupplierPurchaseOrderProductLink]); - } - */ - this.hookupOrderItemsFields(); - }); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/pages/store/suppliers.js b/static/js/pages/store/suppliers.js deleted file mode 100644 index 45d0faf5..00000000 --- a/static/js/pages/store/suppliers.js +++ /dev/null @@ -1,381 +0,0 @@ - -import API from "../../api.js"; -import BusinessObjects from "../../lib/business_objects/business_objects.js"; -import DOM from "../../dom.js"; -import Events from "../../lib/events.js"; -import TableBasePage from "../base_table.js"; -import Utils from "../../lib/utils.js"; -import Validation from "../../lib/validation.js"; -import StoreTableMixinPage from "./mixin_table.js"; - -export default class PageStoreSuppliers extends TableBasePage { - static hash = hashPageStoreSuppliers; - static attrIdRowObject = attrIdSupplier; - callSaveTableContent = API.saveSuppliers; - - constructor(router) { - super(router); - this.storeMixin = new StoreTableMixinPage(this); - } - - initialize() { - this.sharedInitialize(); - } - - hookupFilters() { - this.sharedHookupFilters(); - this.hookupFilterActive(); - } - - loadRowTable(rowJson) { - } - getJsonRow(row) { - if (row == null) return; - let textareaNameCompany = row.querySelector('td.' + flagNameCompany + ' textarea'); - let textareaNameContact = row.querySelector('td.' + flagNameContact + ' textarea'); - let textareaDepartmentContact = row.querySelector('td.' + flagDepartmentContact + ' textarea'); - let tdAddress = row.querySelector('td.' + flagAddress); - let textareaPhoneNumber = row.querySelector('td.' + flagPhoneNumber + ' textarea'); - let textareaFax = row.querySelector('td.' + flagFax + ' textarea'); - let textareaEmail = row.querySelector('td.' + flagEmail + ' textarea'); - let textareaWebsite = row.querySelector('td.' + flagWebsite + ' textarea'); - let tdCurrency = row.querySelector('td.' + flagCurrency); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); - - let jsonRow = {}; - jsonRow[attrIdSupplier] = row.getAttribute(attrIdSupplier); - jsonRow[flagNameCompany] = DOM.getElementAttributeValueCurrent(textareaNameCompany); - jsonRow[flagNameContact] = DOM.getElementAttributeValueCurrent(textareaNameContact); - jsonRow[flagDepartmentContact] = DOM.getElementAttributeValueCurrent(textareaDepartmentContact); - jsonRow[attrIdSupplierAddress] = DOM.getElementAttributeValueCurrent(tdAddress); - jsonRow[flagSupplierAddress] = this.getSupplierAddressesFromRow(row); - jsonRow[flagPhoneNumber] = DOM.getElementAttributeValueCurrent(textareaPhoneNumber); - jsonRow[flagFax] = DOM.getElementAttributeValueCurrent(textareaFax); - jsonRow[flagEmail] = DOM.getElementAttributeValueCurrent(textareaEmail); - jsonRow[flagWebsite] = DOM.getElementAttributeValueCurrent(textareaWebsite); - jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); - jsonRow[flagActive] = buttonActive.classList.contains(flagDelete); - return jsonRow; - } - getSupplierAddressesFromRow(row) { - let supplierAddresses = []; - let trs = row.querySelectorAll('td.' + flagAddress + ' tbody tr'); - let address, inputPostcode, inputAddressLine1, inputAddressLine2, inputCity, inputCounty, ddlRegion, inputActive; - trs.forEach((tr) => { - inputPostcode = tr.querySelector('td.' + flagPostcode + ' textarea'); - inputAddressLine1 = tr.querySelector('td.' + flagAddressLine1 + ' textarea'); - inputAddressLine2 = tr.querySelector('td.' + flagAddressLine2 + ' textarea'); - inputCity = tr.querySelector('td.' + flagCity + ' textarea'); - inputCounty = tr.querySelector('td.' + flagCounty + ' textarea'); - ddlRegion = tr.querySelector('td.' + flagRegion + ' select'); - inputActive = tr.querySelector('td.' + flagActive + ' input'); - address = { - [attrIdSupplierAddress]: tr.getAttribute(attrIdSupplierAddress), - [attrIdSupplier]: row.getAttribute(attrIdSupplier), - [flagPostcode]: DOM.getElementAttributeValueCurrent(inputPostcode), - [flagAddressLine1]: DOM.getElementAttributeValueCurrent(inputAddressLine1), - [flagAddressLine2]: DOM.getElementAttributeValueCurrent(inputAddressLine2), - [flagCity]: DOM.getElementAttributeValueCurrent(inputCity), - [flagCounty]: DOM.getElementAttributeValueCurrent(inputCounty), - [attrIdRegion]: DOM.getElementAttributeValueCurrent(ddlRegion), - [flagActive]: DOM.getElementAttributeValueCurrent(inputActive), - }; - supplierAddresses.push(address); - }); - return supplierAddresses; - } - initialiseRowNew(tbody, row) { - super.initialiseRowNew(tbody, row); - } - - hookupTableMain() { - super.hookupTableMain(); - this.hookupNameCompanyInputs(); - this.hookupNameContactInputs(); - this.hookupDepartmentContactInputs(); - this.hookupAddressFields(); - this.hookupPhoneNumberInputs(); - this.hookupFaxInputs(); - this.hookupEmailInputs(); - this.hookupWebsiteInputs(); - this.hookupCurrencyFields(); - this.hookupFieldsActive(); - } - hookupNameCompanyInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameCompany + ' textarea'); - } - hookupNameContactInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameContact + ' textarea'); - } - hookupDepartmentContactInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDepartmentContact + ' textarea'); - } - - hookupAddressFields() { - this.hookupAddressPreviews(); - this.hookupAddressPostcodeInputs(); - this.hookupAddressLine1Inputs(); - this.hookupAddressLine2Inputs(); - this.hookupAddressCityInputs(); - this.hookupAddressCountyInputs(); - this.hookupAddressRegionDdls(); - this.hookupAddressActiveCheckboxes(); - this.hookupAddressDeleteButtons(); - this.hookupAddressUndeleteButtons(); - this.hookupAddressAddButtons(); - } - hookupAddressPreviews() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress, (event, td) => { - if (!td.classList.contains(flagCollapsed)) return; - this.handleClickAddressPreview(event, td); - }); - } - handleClickAddressPreview(event, element) { - if (_verbose) { console.log("click address preview"); } - this.toggleColumnHeaderCollapsed(flagAddress, false); - element.classList.remove(flagCollapsed); - let row = DOM.getRowFromElement(element); - let idSupplier = row.getAttribute(attrIdSupplier); - let supplierAddressList = idSupplier > 0 ? supplierAddresses[idSupplier] : []; - let tblAddresses = document.createElement("table"); - tblAddresses.classList.add(flagAddress); - let thead = document.createElement("thead"); - let tr = document.createElement("tr"); - let thPostcode = document.createElement("th"); - thPostcode.classList.add(flagPostcode); - thPostcode.textContent = 'Postcode'; - let thAddressLine1 = document.createElement("th"); - thAddressLine1.classList.add(flagAddressLine1); - thAddressLine1.textContent = 'Address Line 1'; - let thAddressLine2 = document.createElement("th"); - thAddressLine2.classList.add(flagAddressLine2); - thAddressLine2.textContent = 'Address Line 2'; - let thCity = document.createElement("th"); - thCity.classList.add(flagCity); - thCity.textContent = 'City'; - let thCounty = document.createElement("th"); - thCounty.classList.add(flagCounty); - thCounty.textContent = 'County'; - let thRegion = document.createElement("th"); - thRegion.classList.add(flagRegion); - thRegion.textContent = 'Region'; - let thActive = document.createElement("th"); - thActive.classList.add(flagActive); - thActive.textContent = 'Active'; - let thAddDelete = document.createElement("th"); - thAddDelete.classList.add(flagAdd); - let buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - thAddDelete.appendChild(buttonAdd); - - tr.appendChild(thPostcode); - tr.appendChild(thAddressLine1); - tr.appendChild(thAddressLine2); - tr.appendChild(thCity); - tr.appendChild(thCounty); - tr.appendChild(thRegion); - tr.appendChild(thActive); - tr.appendChild(thAddDelete); - thead.appendChild(tr); - tblAddresses.appendChild(thead); - - let tbody = document.createElement("tbody"); - let regionOptions = Utils.getListFromDict(regions); - supplierAddressList.forEach((supplierAddress, index) => { - this.addRowSupplierAddress(tbody, supplierAddress, regionOptions); - }); - tblAddresses.appendChild(tbody); - - let cell = DOM.getCellFromElement(element); - let cellNew = cell.cloneNode(false); - cellNew.appendChild(tblAddresses); - row.replaceChild(cellNew, cell); - if (_verbose) { console.log("tblAddresses: ", tblAddresses); } - this.hookupAddressFields(); - } - addRowSupplierAddress(tbody, supplierAddress, regionOptions) { - if (_verbose) { console.log("addRowSupplierAddress: ", supplierAddress); } - let tdPostcode = document.createElement("td"); - tdPostcode.classList.add(flagPostcode); - let textareaPostcode = document.createElement("textarea"); - textareaPostcode.classList.add(flagPostcode); - DOM.setElementValuesCurrentAndPrevious(textareaPostcode, supplierAddress[flagPostcode]); - tdPostcode.appendChild(textareaPostcode); - - let tdAddressLine1 = document.createElement("td"); - tdAddressLine1.classList.add(flagAddressLine1); - let textareaAddressLine1 = document.createElement("textarea"); - textareaAddressLine1.classList.add(flagAddressLine1); - DOM.setElementValuesCurrentAndPrevious(textareaAddressLine1, supplierAddress[flagAddressLine1]); - tdAddressLine1.appendChild(textareaAddressLine1); - - let tdAddressLine2 = document.createElement("td"); - tdAddressLine2.classList.add(flagAddressLine2); - let textareaAddressLine2 = document.createElement("textarea"); - textareaAddressLine2.classList.add(flagAddressLine2); - DOM.setElementValuesCurrentAndPrevious(textareaAddressLine2, supplierAddress[flagAddressLine2]); - tdAddressLine2.appendChild(textareaAddressLine2); - - let tdCity = document.createElement("td"); - tdCity.classList.add(flagCity); - let textareaCity = document.createElement("textarea"); - textareaCity.classList.add(flagCity); - DOM.setElementValuesCurrentAndPrevious(textareaCity, supplierAddress[flagCity]); - tdCity.appendChild(textareaCity); - - let tdCounty = document.createElement("td"); - tdCounty.classList.add(flagCounty); - let textareaCounty = document.createElement("textarea"); - textareaCounty.classList.add(flagCounty); - DOM.setElementValuesCurrentAndPrevious(textareaCounty, supplierAddress[flagCounty]); - tdCounty.appendChild(textareaCounty); - - let region = supplierAddress[flagRegion]; - if (!region) region = {[attrIdRegion]: ''}; - let tdRegion = document.createElement("td"); - tdRegion.classList.add(flagRegion); - DOM.setElementAttributesValuesCurrentAndPrevious(tdRegion, region[attrIdRegion]); - let ddlRegion = document.createElement("select"); - ddlRegion.classList.add(flagRegion); - let optionJson, option; - option = DOM.createOption(null); - ddlRegion.appendChild(option); - regionOptions.forEach((regionOption) => { - optionJson = BusinessObjects.getOptionJsonFromObjectJson(regionOption); - option = DOM.createOption(optionJson); - ddlRegion.appendChild(option); - }); - DOM.setElementValuesCurrentAndPrevious(ddlRegion, region[attrIdRegion]); - tdRegion.appendChild(ddlRegion); - - let tdActive = this.createTdActive(supplierAddress[flagActive]); - - let tr = document.createElement("tr"); - tr.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); - tr.setAttribute(attrIdSupplier, supplierAddress[attrIdSupplier]); - tr.appendChild(tdPostcode); - tr.appendChild(tdAddressLine1); - tr.appendChild(tdAddressLine2); - tr.appendChild(tdCity); - tr.appendChild(tdCounty); - tr.appendChild(tdRegion); - tr.appendChild(tdActive); - tbody.appendChild(tr); - } - hookupAddressPostcodeInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagPostcode); - } - hookupAddressLine1Inputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine1); - } - hookupAddressLine2Inputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine2); - } - hookupAddressCityInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCity); - } - hookupAddressCountyInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCounty); - } - hookupAddressRegionDdls() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' select.' + flagRegion); - } - hookupAddressActiveCheckboxes() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' input.' + flagActive, (event, element) => { - let rowSupplierAddress = element.closest('tr'); - let idAddress = rowSupplierAddress.getAttribute(attrIdSupplierAddress); - DOM.setElementAttributeValueCurrent(rowSupplierAddress, idAddress); - let rowSupplier = rowSupplierAddress.closest(idTableMain + ' > tbody > tr'); - let checkboxesActive = rowSupplier.querySelectorAll('td.' + flagAddress + ' input.' + flagActive); - let isActive = element.checked; - if (isActive) { - checkboxesActive.forEach((checkbox) => { - if (checkbox == element) return; - DOM.setElementValueCurrent(checkbox, false); - }); - } - /* - else if (checkboxesActive.length > 0) { - DOM.setElementValueCurrent(checkboxesActive[0], false); - } - */ - }); - } - hookupFieldsAddressAddDelete() { - let selectorButton = idTableMain + ' td.' + flagAddress + ' button'; - let selectorButtonDelete = selectorButton + '.' + flagDelete; - let selectorButtonUndelete = selectorButton + '.' + flagAdd; - this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); - this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); - } - hookupAddressDeleteButtons() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' button.' + flagDelete, (event, element) => { - let row = DOM.getRowFromElement(element); - row.classList.add(flagDelete); - - let buttonAdd = document.createElement("button"); - buttonAdd.classList.add(flagAdd); - buttonAdd.textContent = '+'; - element.replaceWith(buttonAdd); - this.hookupAddressUndeleteButtons(); - }); - } - hookupAddressUndeleteButtons() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' td button.' + flagAdd, (event, element) => { - let row = DOM.getRowFromElement(element); - row.classList.remove(flagDelete); - - let buttonDelete = document.createElement("button"); - buttonDelete.classList.add(flagDelete); - buttonDelete.textContent = 'x'; - element.replaceWith(buttonDelete); - this.hookupAddressDeleteButtons(); - }); - } - hookupAddressAddButtons() { - this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' th button.' + flagAdd, (event, element) => { - let row = element.closest(idTableMain + ' > tbody > tr'); - let idSupplier = row.getAttribute(attrIdSupplier); - let hasActiveAddress = row.querySelectorAll('td.' + flagAddress + ' input.' + flagActive + ':checked').length > 0; - let countSupplierAddresses = row.querySelectorAll('td.' + flagAddress + ' td.' + flagAddress).length; - let supplierAddress = { - [attrIdSupplier]: idSupplier, - [attrIdSupplierAddress]: -1 - countSupplierAddresses, - [flagPostcode]: '', - [flagAddressLine1]: '', - [flagAddressLine2]: '', - [flagCity]: '', - [flagCounty]: '', - [attrIdRegion]: '', - [flagActive]: !hasActiveAddress, - }; - let tbody = row.querySelector('td.' + flagAddress + ' table tbody'); - this.addRowSupplierAddress(tbody, supplierAddress, Utils.getListFromDict(regions)); - if (!hasActiveAddress) { - let tdAddress = row.querySelector('td.' + flagAddress); - // tdAddress.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); - DOM.setElementAttributeValueCurrent(tdAddress, supplierAddress[attrIdSupplierAddress]); - } - this.hookupAddressFields(); - }); - } - - hookupPhoneNumberInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPhoneNumber + ' textarea'); - } - hookupFaxInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagFax + ' textarea'); - } - hookupEmailInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagEmail + ' textarea'); - } - hookupWebsiteInputs() { - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagWebsite + ' textarea'); - } - - leave() { - super.leave(); - } -} - diff --git a/static/js/router.js b/static/js/router.js index bbda72a8..ae01d0a0 100644 --- a/static/js/router.js +++ b/static/js/router.js @@ -1,42 +1,18 @@ // Pages // Core -import PageAdminHome from './pages/core/admin_home.js'; import PageHome from './pages/core/home.js'; import PageContact from './pages/core/contact.js'; -import PageServices from './pages/core/services.js'; // Legal import PageAccessibilityReport from './pages/legal/accessibility_report.js'; import PageAccessibilityStatement from './pages/legal/accessibility_statement.js'; import PageLicense from './pages/legal/license.js'; -// Store -import PageStoreBasket from './pages/store/basket.js'; -import PageStoreHome from './pages/store/home.js'; -import PageStoreManufacturingPurchaseOrders from './pages/store/manufacturing_purchase_orders.js'; -import PageStoreProductCategories from './pages/store/product_categories.js'; -import PageStoreProductPermutations from './pages/store/product_permutations.js'; -// import PageStoreProductPrices from './pages/store/product_prices.js'; -import PageStoreProducts from './pages/store/products.js'; -import PageStoreProductVariations from './pages/store/product_variations.js'; -import PageStoreStockItems from './pages/store/stock_items.js'; -import PageStoreSuppliers from './pages/store/suppliers.js'; -import PageStoreSupplierPurchaseOrders from './pages/store/supplier_purchase_orders.js'; // User // import PageUserLogin from './pages/user/login.js'; // import PageUserLogout from './pages/user/logout.js'; // import PageUserAccount from './pages/user/account.js'; -/* -import "./lib/common.js"; -import "./lib/constants.js"; -import "./lib/events.js"; -import "./lib/extras.js"; -// import "./DEPRECATED/init.js"; -import "./lib/local_storage.js"; -import "./lib/utils.js"; -import "./lib/validation.js"; -*/ import API from './api.js'; import DOM from './dom.js'; @@ -56,10 +32,6 @@ const pageModules = { // Legal [hashPageAccessibilityStatement]: () => import('./pages/legal/accessibility_statement.js'), [hashPageLicense]: () => import('./pages/legal/license.js'), - // Store - [hashPageStoreProductCategories]: () => import('./pages/store/product_categories.js'), - [hashPageStoreProductPermutations]: () => import('./pages/store/product_permutations.js'), - // [hashPageStoreProducts]: () => import('./pages/store/products.js'), // User // Add other pages here... }; @@ -70,25 +42,13 @@ export default class Router { // Pages this.pages = {}; // Core - this.pages[hashPageHome] = { name: 'PageHome', module: PageAdminHome }; // importModule: () => import(/* webpackChunkName: "page_core_home" */ './pages/core/home.js') , pathModule: './pages/core/home.js' + this.pages[hashPageHome] = { name: 'PageHome', module: PageHome }; // importModule: () => import(/* webpackChunkName: "page_core_home" */ './pages/core/home.js') , pathModule: './pages/core/home.js' this.pages[hashPageContact] = { name: 'PageContact', module: PageContact }; // pathModule: './pages/core/contact.js' }; - this.pages[hashPageServices] = { name: 'PageServices', module: PageServices }; // pathModule: './pages/core/services.js' }; - this.pages[hashPageAdminHome] = { name: 'PageAdminHome', module: PageAdminHome }; // pathModule: './pages/core/admin_home.js' }; // Legal this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement }; // pathModule: '../../static/js/pages/legal/accessibility_statement.js' }; // , page: PageAccessibilityStatement this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule }; // pathModule: './pages/legal/data_retention_schedule.js' }; this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense }; // pathModule: './pages/legal/license.js' }; this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy }; // pathModule: './pages/legal/privacy_policy.js' }; // importModule: () => {return import(/* webpackChunkName: "page_privacy_policy" */ './pages/legal/privacy_policy.js'); } - // Store - this.pages[hashPageStoreManufacturingPurchaseOrders] = { name: 'PageManufacturingPurchaseOrders', module: PageStoreManufacturingPurchaseOrders }; // pathModule - this.pages[hashPageStoreProductCategories] = { name: 'PageStoreProductCategories', module: PageStoreProductCategories }; // pathModule: './pages/store/product_categories.js' }; - this.pages[hashPageStoreProductPermutations] = { name: 'PageStoreProductPermutations', module: PageStoreProductPermutations }; // pathModule: './pages/store/product_permutations.js' }; - // this.pages[hashPageStoreProductPrices] = { name: 'PageStoreProductPrices', module: PageStoreProductPrices }; // pathModule: './pages/store/product_prices.js' }; - this.pages[hashPageStoreProducts] = { name: 'PageStoreProducts', module: PageStoreProducts }; // pathModule: './pages/store/products.js' }; - this.pages[hashPageStoreProductVariations] = { name: 'PageStoreProductVariations', module: PageStoreProductVariations }; // pathModule: './pages/store/product_variations.js' }; - this.pages[hashPageStoreStockItems] = { name: 'PageStoreStockItems', module: PageStoreStockItems }; - this.pages[hashPageStoreSuppliers] = { name: 'PageStoreSuppliers', module: PageStoreSuppliers }; - this.pages[hashPageStoreSupplierPurchaseOrders] = { name: 'PageSupplierPurchaseOrders', module: PageStoreSupplierPurchaseOrders }; // User // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' }; // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' }; @@ -99,23 +59,11 @@ export default class Router { // Core this.routes[hashPageHome] = (isPopState = false) => this.navigateToHash(hashPageHome, isPopState); this.routes[hashPageContact] = (isPopState = false) => this.navigateToHash(hashPageContact, isPopState); - this.routes[hashPageServices] = (isPopState = false) => this.navigateToHash(hashPageServices, isPopState); - this.routes[hashPageAdminHome] = (isPopState = false) => this.navigateToHash(hashPageAdminHome, isPopState); // Legal this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState); this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState); this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState); this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState); - // Store - this.routes[hashPageStoreManufacturingPurchaseOrders] = (isPopState = false) => this.navigateToHash(hashPageStoreManufacturingPurchaseOrders, isPopState); - this.routes[hashPageStoreProductCategories] = (isPopState = false) => this.navigateToHash(hashPageStoreProductCategories, isPopState); - this.routes[hashPageStoreProductPermutations] = (isPopState = false) => this.navigateToHash(hashPageStoreProductPermutations, isPopState); - // this.routes[hashPageStoreProductPrices] = (isPopState = false) => this.navigateToHash(hashPageStoreProductPrices, isPopState); - this.routes[hashPageStoreProducts] = (isPopState = false) => this.navigateToHash(hashPageStoreProducts, isPopState); - this.routes[hashPageStoreProductVariations] = (isPopState = false) => this.navigateToHash(hashPageStoreProductVariations, isPopState); - this.routes[hashPageStoreStockItems] = (isPopState = false) => this.navigateToHash(hashPageStoreStockItems, isPopState); - this.routes[hashPageStoreSuppliers] = (isPopState = false) => this.navigateToHash(hashPageStoreSuppliers, isPopState); - this.routes[hashPageStoreSupplierPurchaseOrders] = (isPopState = false) => this.navigateToHash(hashPageStoreSupplierPurchaseOrders, isPopState); // User // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState); // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState); @@ -193,134 +141,6 @@ export default class Router { API.goToUrl(url); } - /* - static getPages() { - let pages = {}; - pages[hashPageAccessibilityStatement] = PageAccessibilityStatement; - pages[hashPageAdminHome] = PageAdminHome; - pages[hashPageHome] = PageHome; - pages[hashPageContact] = PageContact; - pages[hashPageLicense] = PageLicense; - pages[hashPageServices] = PageServices; - pages[hashPageStoreBasket] = PageStoreBasket; - pages[hashPageStoreHome] = PageStoreHome; - pages[hashPageStoreProductCategories] = PageStoreProductCategories; - pages[hashPageStoreProductPermutations] = PageStoreProductPermutations; - // pages[hashPageStoreProductPrices] = PageStoreProductPrices; - // pages[hashPageStoreProducts] = PageStoreProducts; - // pages[hashPageStoreProductVariations] = PageStoreProductVariations; - pages[hashPageStoreStockItems] = PageStoreStockItems; - console.log("pages: ", pages); - return pages; - } - - addRoute(path, handler) { - this.routes[path] = handler; - } - - handlePopState(event) { - /* - let url = window.location.pathname; - url = url.split('?')[0]; - let hash = url.replace(_pathHost, ''); - console.log("handlePopState: " + hash); - this.handleRouteHash(hash); - * - let pageCurrent = Router.getPageCurrent(); - pageCurrent.initialize(true); - } - - navigateToHash(hash, data = null) { - const url = API.getUrlFromHash(hash); - this.navigateToUrl(url, data); - } - - - leavePageCurrent() { - const pageCurrent = Router.getPageCurrent(); - if (pageCurrent) pageCurrent.leave(); - } - - static getPageCurrent() { - if (_pageCurrent) return _pageCurrent; - const hashPageCurrent = DOM.getHashPageCurrent(); - console.log("hashPageCurrent: " + hashPageCurrent); - const pages = Router.getPages(); - let page; - for (const key of Object.keys(pages)) { - page = pages[key]; - console.log("page hashL ", page.hash); - if (page.hash == hashPageCurrent) return new page(); - } - throw new Error('Page not found: ' + hashPageCurrent); - } - - static parameteriseUrl(url, parameters) { - if (!Validation.isEmpty(parameters)) { - url += '%3F'; // '?'; - let firstParameter = true; - for (var p in parameters) { - if (!firstParameter) { - url += '&'; - } else { - firstParameter = false; - } - url += parameters[p]; - } - } - return url; - } - */ - - /* - handleRouteUrl(url) { - const path = url.split('?')[0]; // Remove query parameters - if (this.routes[path]) { - this.routes[path](); - } else if (url.includes('auth0.com')) { - Router.goToUrl(url); - } else { - console.warn('No handler found for path:', path); - // Optionally, handle 404 or redirect to a default route - } - } - - handleRouteHash(hash) { - if (this.routes[hash]) { - this.routes[hash](); - } else { - console.warn('No handler found for hash:', hash); - } - } - */ - - /* - static htmlEncode(value) { - return document.createElement('
').text(value).innerHTML; - } - - static htmlDecode(value) { - if (_domParser == null) _domParser = DOMParser(); // https://www.w3docs.com/snippets/javascript/how-to-html-encode-a-string.html - return _domParser.parseFromString(value, 'text/html').documentElement.textContent; - } - */ - - // Additional utility methods - /* - static getQueryParams() { - return Object.fromEntries(new URLSearchParams(window.location.search)); - } - - static updateQueryParams(params) { - const searchParams = new URLSearchParams(window.location.search); - for (const [key, value] of Object.entries(params)) { - searchParams.set(key, value); - } - const newUrl = `${window.location.pathname}?${searchParams.toString()}`; - history.replaceState(null, '', newUrl); - } - */ - static loadPageBodyFromResponse(response) { DOM.loadPageBody(response.data); } diff --git a/static/js/sections/store.js b/static/js/sections/store.js deleted file mode 100644 index e69de29b..00000000 diff --git a/templates/DEPRECATED/DEPRECATED_block_store_product.html b/templates/DEPRECATED/DEPRECATED_block_store_product.html deleted file mode 100644 index 8b58a82f..00000000 --- a/templates/DEPRECATED/DEPRECATED_block_store_product.html +++ /dev/null @@ -1,24 +0,0 @@ - -{% if product.has_permutations() %} - {% set permutation = product.get_permutation_selected() %} -
-
- Template product image -
- {% if permutation.is_available() %} - {% set form = product.form_basket_add %} -
- {{ form.hidden_tag() }} -

{{ product.name }}

-

{{ permutation.output_price(model.is_included_VAT) }}

- {% set tmp_quantity = 1 %} - {% include 'components/common/inputs/_input_number_plus_minus.html' %} - {{ form.submit() }} -

Get it: {{ permutation.output_delivery_date() }}

-
- {% endif %} - -
-{% endif %} \ No newline at end of file diff --git a/templates/DEPRECATED/DEPRECATED_block_store_product_price.html b/templates/DEPRECATED/DEPRECATED_block_store_product_price.html deleted file mode 100644 index aaa58302..00000000 --- a/templates/DEPRECATED/DEPRECATED_block_store_product_price.html +++ /dev/null @@ -1,16 +0,0 @@ - - -
-

{{ product.output_price() }}

- {% set form = product.form_basket_add %} -
- {{ form.hidden_tag() }} - {% set tmp_quantity = 1 %} - {% include 'components/common/inputs/_input_number_plus_minus.html' %} - {{ form.submit() }} -
- -
\ No newline at end of file diff --git a/templates/DEPRECATED/DEPRECATED_page_home.html b/templates/DEPRECATED/DEPRECATED_page_home.html deleted file mode 100644 index 2fbe2f12..00000000 --- a/templates/DEPRECATED/DEPRECATED_page_home.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block title %}{{ model.title }}{% endblock %} - -{% block page_body %} - - - - -
-
-

Offering a full suite of software engineering services.

-
-
- - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/DEPRECATED/DEPRECATEDlayout_store.html b/templates/DEPRECATED/DEPRECATEDlayout_store.html deleted file mode 100644 index 1c3fefc6..00000000 --- a/templates/DEPRECATED/DEPRECATEDlayout_store.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - {% block title %}{% endblock %} - PARTS - - - - - - - - - - - - - - -
-
- -
-
-

Precision And Research Technology Systems Limited

-
-
- -
- -
- Store -
-
- -
- {{ model.form_is_included_VAT.hidden_tag() }} -
- {{ model.form_is_included_VAT.is_included.label }} - {{ model.form_is_included_VAT.is_included() }} - {% for error in model.form_is_included_VAT.is_included.errors %} -

{{ error }}

- {% endfor %} -
-
-
-
-
- {{ model.form_delivery_region.hidden_tag() }} -
- {{ model.form_delivery_region.id_region_delivery.label }} - {{ model.form_delivery_region.id_region_delivery() }} - {% for error in model.form_delivery_region.id_region_delivery.errors %} -

{{ error }}

- {% endfor %} -
-
-
-
-
- {{ model.form_currency.hidden_tag() }} -
- {{ model.form_currency.id_currency.label }} - {{ model.form_currency.id_currency() }} - {% for error in model.form_currency.id_currency.errors %} -

{{ error }}

- {% endfor %} -
-
-
- -
- - -
- {% block page_body %}{% endblock %} -
- - - - - - - - - - - \ No newline at end of file diff --git a/templates/DEPRECATED/_block_select_access_level.html b/templates/DEPRECATED/_block_select_access_level.html deleted file mode 100644 index da831bc9..00000000 --- a/templates/DEPRECATED/_block_select_access_level.html +++ /dev/null @@ -1,5 +0,0 @@ -{% if id_access_level is defined %} - -{% else %} - -{% endif %} \ No newline at end of file diff --git a/templates/DEPRECATED/_block_slider.html b/templates/DEPRECATED/_block_slider.html deleted file mode 100644 index 047dca0f..00000000 --- a/templates/DEPRECATED/_block_slider.html +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/templates/DEPRECATED/_block_store_product_category_card.html b/templates/DEPRECATED/_block_store_product_category_card.html deleted file mode 100644 index cba6e922..00000000 --- a/templates/DEPRECATED/_block_store_product_category_card.html +++ /dev/null @@ -1,9 +0,0 @@ - -
-

{{ cat.name }}

-
- {% for product in cat.products %} - {% include 'components/store/_product.html' %} - {% endfor %} -
-
diff --git a/templates/DEPRECATED/layout - stripe.html b/templates/DEPRECATED/layout - stripe.html deleted file mode 100644 index 323d4edb..00000000 --- a/templates/DEPRECATED/layout - stripe.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - {% block title %}{% endblock %} - PARTS - - - - - - - - - - -
-
- -
-
-

Precision And Research Technology Systems Limited

-
-
- -
- Home - Store - - Contact -
- -
- {% block content %}{% endblock %} -
- - - - - - - - - - \ No newline at end of file diff --git a/templates/layouts/layout.html b/templates/layouts/layout.html index 57c2647b..381b3146 100644 --- a/templates/layouts/layout.html +++ b/templates/layouts/layout.html @@ -3,75 +3,45 @@ - {{ model.title }} - {{ model.NAME_COMPANY }} + {{ model.title }} - {{ model.NAME_COMPANY_SHORT }} - - + +
+
+ + + +
+
+ + + + diff --git a/templates/pages/core/_admin_home.html b/templates/pages/core/_admin_home.html deleted file mode 100644 index cd45a418..00000000 --- a/templates/pages/core/_admin_home.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block title %}{{ model.title }}{% endblock %} - -{% block page_body %} - - - - -
-
-

Store

-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/core/_contact.html b/templates/pages/core/_contact.html index 27afcbc5..4ba25967 100644 --- a/templates/pages/core/_contact.html +++ b/templates/pages/core/_contact.html @@ -1,14 +1,17 @@ {% extends 'layouts/layout.html' %} -{% block title %}{{ model.title }}{% endblock %} +{% block page_head %} + +{% endblock %} + +{% block page_nav_links %} + {# + Contact Form + Contact Details + #} +{% endblock %} {% block page_body %} - - - - -
-
-

Complete the form or find our details below.

- - {{ model.form_contact.hidden_tag() }} -
- {{ model.form_contact.email.label }} - {{ model.form_contact.email(size=254) }} - {% for error in model.form_contact.email.errors %} -

{{ error }}

- {% endfor %} -
- -
- {{ model.form_contact.name.label }} - {{ model.form_contact.name(size=50) }} - {% for error in model.form_contact.name.errors %} -

{{ error }}

- {% endfor %} -
-
- {{ model.form_contact.message.label }} - {{ model.form_contact.message(rows=4, cols=80) }} - {% for error in model.form_contact.name.errors %} -

{{ error }}

- {% endfor %} -
-
- {{ model.form_contact.recaptcha() }} -
-
- {{ model.form_contact.submit() }} -
-
-
+ - + + + {% set form = model.form_contact %} +
+
+

Contact Us

+

Please fill in the form below and we'll get back to you as soon as possible.

+ +
+ {{ form.csrf_token }} + +
+ +
+ {{ form.email(class="form-input", required=True) }} +
+ + +
+ {{ form.contact_name(class="form-input", required=True) }} +
+ + +
+ {{ form.company_name(class="form-input", required=True) }} +
+ + +
+ {{ form.message(class="form-input", required=True) }} +
+
+ + +
+ {{ model.form_contact.recaptcha() }} +
+
+ {{ model.form_contact.submit() }} +
+
+ +
+

How we use your information

+

We will use the information you provide in this form to:

+
    +
  • Respond to your inquiry about our ERP implementation services
  • +
  • Create and send you a proposal if requested
  • +
  • Contact you regarding your interest in our services
  • +
+ +

If you opt in to marketing communications, we will also use your email address to send you updates about our services, ERPNext features, and relevant industry news. You can unsubscribe from these communications at any time.

+ +

We retain contact form submissions for customer service purposes and retain marketing consent records as required by law. For details about how long we keep your information, please see our data retention schedule.

+ +

For full details about how we handle your personal data, please read our Privacy Policy.

+
+
+
+ + {# included in footer now +
+
+

Our contact details

+
+ +
+
+
+ #} + {% endblock %} \ No newline at end of file diff --git a/templates/pages/core/_home.html b/templates/pages/core/_home.html index d82fc16a..f375e343 100644 --- a/templates/pages/core/_home.html +++ b/templates/pages/core/_home.html @@ -2,32 +2,119 @@ {% extends 'layouts/layout.html' %} -{% block page_body %} - +{% block page_head %} + +{% endblock %} - -
-

We make websites, web apps, and desktop software

- {% set block_id = 'button_get_in_touch' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
- - - - + - --> {% endblock %} \ No newline at end of file diff --git a/templates/pages/core/_services.html b/templates/pages/core/_services.html deleted file mode 100644 index 46ee1edf..00000000 --- a/templates/pages/core/_services.html +++ /dev/null @@ -1,120 +0,0 @@ - - -{% extends 'layouts/layout.html' %} - -{% block title %}{{ model.title }}{% endblock %} - -{% block page_body %} - - - - -
-
-

Services

-

Website, Web App, & Desktop Software Development

-
    -
  • Custom software tailored to your unique business needs
  • -
  • Leverage the latest technologies for seamless, high-performance solutions
  • -
  • Intuitive user interface design to delight your users and boost productivity
  • -
-

Cloud Migration & Architecture Design

-
    -
  • Expertise to guide your cloud journey and optimize your architecture
  • -
  • Ensure scalability, security and cost-efficiency in the cloud
  • -
  • Unlock the power of cloud-native services, like AI, to accelerate innovation
  • -
-
-
- -
-

Technologies

-

We are most experienced with these technologies, in case you have any requirements.

- - - - - - - - - - - - - - - - - - - - - - - - - -
DatabaseServer / Application
MySQLpython
Microsoft SQL ServerC sharp dot NET
FirebaseNode dot js
Java
- - - - - - - - - - - - - - - - - - - - - - - - - -
WebFrameworks
HTML5React
CSS3Flask
JavaScriptModel View Controller
REST
-
- -
-

FAQs

-

Websites, Web apps, and Software - what's the difference?

-
    -
  • Not much! A web app is a type of website and they are both types of software that are accessed on the internet using web browser software.
  • -
  • Web apps have more complex functionality than simple text and image pages.
  • -
  • For example, this is a website. Google Maps is a web app. Notepad is a piece of desktop sofware.
  • -
-

Why choose us?

-
    -
  • Work directly with the person responsible for delivering your project
  • -
  • Faster decision-making process without bureaucratic hurdles
  • -
  • Transparent pricing structure with no hidden fees
  • -
-
- - - - -{% endblock %} diff --git a/templates/pages/legal/_privacy_policy.html b/templates/pages/legal/_privacy_policy.html index a7f863e4..47d2b666 100644 --- a/templates/pages/legal/_privacy_policy.html +++ b/templates/pages/legal/_privacy_policy.html @@ -16,7 +16,7 @@

This privacy notice tells you what to expect us to do with your personal information.

Our contact details

Email

-

teddy@partsltd.co.uk

+

{{ model.get_mail_contact_public() }}

What information we collect, use, and why

We collect or use the following information to provide services and goods, including delivery:

    diff --git a/templates/pages/store/_basket.html b/templates/pages/store/_basket.html deleted file mode 100644 index e9dd9865..00000000 --- a/templates/pages/store/_basket.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_head %} - - -{% endblock %} - - -{% block page_body %} - -
    -
    -
    -

    Delivery Information

    -
    - Valid delivery information not submitted -
    -
    -
    -

    Billing Information

    -
    - Valid billing information not submitted -
    -
    -
    -
    - {% include 'components/store/_basket.html' %} -
    - -
    -
    -
    - - {% set form = model.form_delivery %} - {% set overlay_id = model.id_overlay_info_delivery %} - {% set overlay_title = 'Delivery Information' %} - {% include 'components/common/temporary/_overlay_address.html' %} - - {% set form = model.form_billing %} - {% set overlay_id = model.id_overlay_info_billing %} - {% set overlay_title = 'Billing Information' %} - {% include 'components/common/temporary/_overlay_address.html' %} - - - - {% set block_id = 'checkout' %} - {% include 'layouts/_shared_store.html' %} - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_checkout_success.html b/templates/pages/store/_checkout_success.html deleted file mode 100644 index 6ed59979..00000000 --- a/templates/pages/store/_checkout_success.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block title %}{{ model.title }}{% endblock %} - -{% block page_body %} - - - - -
    -
    -
    -

    Order successful!

    -
    -
    Order reference: {{ model.CHECKOUT_SESSION.ID }}
    -
    You will receive an order acknowledgement by email
    -
    - {% if model.IS_USER_LOGGED_IN %} -
    -

    Your order:

    -
    - {% endif %} -
    -
    -
    - - - {% set block_id = 'checkout' %} - {% include 'layouts/_shared_store.html' %} - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_home.html b/templates/pages/store/_home.html deleted file mode 100644 index 7495cf87..00000000 --- a/templates/pages/store/_home.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_head %} - - -{% endblock %} - - -{% block page_body %} - {% include 'components/store/_home_body.html' %} -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_manufacturing_purchase_orders.html b/templates/pages/store/_manufacturing_purchase_orders.html deleted file mode 100644 index 8ce1ff9c..00000000 --- a/templates/pages/store/_manufacturing_purchase_orders.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_head %} - - -{% endblock %} - -{% block page_body %} -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.date_from.label }} - {{ model.form_filters.date_from() }} - {% for error in model.form_filters.date_from.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.date_to.label }} - {{ model.form_filters.date_to() }} - {% for error in model.form_filters.date_to.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for order in model.manufacturing_purchase_orders %} - {% include 'components/store/_row_manufacturing_purchase_order.html' %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_manufacturing_purchase_order.html' %} - -
    ItemsCurrencyCost Total VAT Excl.Cost Total VAT Incl.Price Total VAT Excl.Price Total VAT Incl. - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_product_categories.html b/templates/pages/store/_product_categories.html deleted file mode 100644 index 21e4f587..00000000 --- a/templates/pages/store/_product_categories.html +++ /dev/null @@ -1,71 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.is_not_empty.label }} - {{ model.form_filters.is_not_empty() }} - {% for error in model.form_filters.is_not_empty.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for category in model.category_list.categories %} - {% include 'components/store/_row_product_category.html' %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_product_category.html' %} - -
    Display OrderCodeNameDescriptionAccess Level Required - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_product_permutations.html b/templates/pages/store/_product_permutations.html deleted file mode 100644 index 07eef05c..00000000 --- a/templates/pages/store/_product_permutations.html +++ /dev/null @@ -1,137 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.id_category.label }} - {{ model.form_filters.id_category() }} - {% for error in model.form_filters.id_category.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.id_product.label }} - {{ model.form_filters.id_product() }} - {% for error in model.form_filters.id_product.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.is_out_of_stock.label }} - {{ model.form_filters.is_out_of_stock() }} - {% for error in model.form_filters.is_out_of_stock.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.quantity_min.label }} - {{ model.form_filters.quantity_min() }} - {% for error in model.form_filters.quantity_min.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.quantity_max.label }} - {{ model.form_filters.quantity_max() }} - {% for error in model.form_filters.quantity_max.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {% set units_measurement_dict = model.convert_list_objects_to_dict_json_by_attribute_key_default(model.units_measurement) | console_log %} - {% set units_measurement_time_dict = model.convert_list_objects_to_dict_json_by_attribute_key_default(model.units_measurement_time) | console_log %} - - {% set is_blank_row = False %} - {% for category in model.category_list.categories %} - {% for product in category.products %} - {% for permutation in product.permutations %} - {% include 'components/store/_row_product_permutation.html' %} - {% endfor %} - {% endfor %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_product_permutation.html' %} - -
    CategoryProductVariationsDescriptionQuantity StockQuantity MinQuantity MaxQuantity StepUnitSubscription?Count Recurrence IntervalRecurrence IntervalStripe Product IDExpires Faster Once Unsealed?Count Interval Expiration UnsealedInterval Expiration UnsealedCost Local VAT Excl.Cost Local VAT Incl.Cost CurrencyProfit Local MinManufacturing Latency - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_product_variations.html b/templates/pages/store/_product_variations.html deleted file mode 100644 index fffde180..00000000 --- a/templates/pages/store/_product_variations.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.is_not_empty.label }} - {{ model.form_filters.is_not_empty() }} - {% for error in model.form_filters.is_not_empty.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for variation_type in model.variation_types %} - {% include 'components/store/_row_product_variation_type.html' %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_product_variation_type.html' %} - -
    Display OrderCodeNameName PluralVariations - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_products.html b/templates/pages/store/_products.html deleted file mode 100644 index a3f78e34..00000000 --- a/templates/pages/store/_products.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.id_category.label }} - {{ model.form_filters.id_category() }} - {% for error in model.form_filters.id_category.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.is_not_empty.label }} - {{ model.form_filters.is_not_empty() }} - {% for error in model.form_filters.is_not_empty.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for category in model.category_list.categories %} - {% for product in category.products %} - {% include 'components/store/_row_product.html' %} - {% endfor %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_product.html' %} - -
    Display OrderCategoryNameHas Variations?Access Level Required - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_stock_items.html b/templates/pages/store/_stock_items.html deleted file mode 100644 index 48587081..00000000 --- a/templates/pages/store/_stock_items.html +++ /dev/null @@ -1,133 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.id_category.label }} - {{ model.form_filters.id_category() }} - {% for error in model.form_filters.id_category.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.id_product.label }} - {{ model.form_filters.id_product() }} - {% for error in model.form_filters.id_product.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.is_out_of_stock.label }} - {{ model.form_filters.is_out_of_stock() }} - {% for error in model.form_filters.is_out_of_stock.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.quantity_min.label }} - {{ model.form_filters.quantity_min() }} - {% for error in model.form_filters.quantity_min.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.quantity_max.label }} - {{ model.form_filters.quantity_max() }} - {% for error in model.form_filters.quantity_max.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - - - - - - - - {% set date_time_now = model.format_date(datetime.now()) %} - {% set is_blank_row = False %} - {% for category in model.category_list.categories %} - {% for product in category.products %} - {% for permutation in product.permutations %} - {% for stock_item in permutation.stock_items %} - {% include 'components/store/_row_stock_item.html' %} - {% endfor %} - {% endfor %} - {% endfor %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_stock_item.html' %} - -
    CategoryProductVariationsCurrencyCost Local (VAT excl.)Cost Local (VAT incl.)Date PurchasedDate ReceivedStorage LocationIs SealedDate UnsealedDate ExpirationIs ConsumedDate Consumed - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_supplier.html b/templates/pages/store/_supplier.html deleted file mode 100644 index 44664372..00000000 --- a/templates/pages/store/_supplier.html +++ /dev/null @@ -1,117 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block title %}{{ model.title }}{% endblock %} - -{% block page_body %} - {% set supplier = model.supplier %} - {% set block_id = 'styles' %} - {% include 'layouts/_shared_store.html' %} - - - - -
    -
    -

    Supplier

    - {{ model.form.hidden_tag() }} -
    -
    - {{ model.form.name_company.label }} - {{ model.form.name_company(size=100) }} - {% for error in model.form.name_company.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -

    Contact

    -
    - {{ model.form.name_contact.label }} - {{ model.form.name_contact(size=50) }} - {% for error in model.form.name_contact.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.department_contact.label }} - {{ model.form.department_contact(size=50) }} - {% for error in model.form.department_contact.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.id_address.label }} - {{ model.form.id_address() }} - {% for error in model.form.id_address.errors %} -

    {{ error }}

    - {% endfor %} - -
    -
    - {{ model.form.phone_number.label }} - {{ model.form.phone_number(size=20) }} - {% for error in model.form.phone_number.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.fax.label }} - {{ model.form.fax(size=20) }} - {% for error in model.form.fax.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.email.label }} - {{ model.form.email(size=254) }} - {% for error in model.form.email.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.website.label }} - {{ model.form.website(size=254) }} - {% for error in model.form.website.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.id_currency.label }} - {{ model.form.id_currency() }} - {% for error in model.form.id_currency.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - {{ model.form.recaptcha() }} -
    -
    - {{ model.form.submit() }} -
    -
    -
    -
    - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_supplier_purchase_orders.html b/templates/pages/store/_supplier_purchase_orders.html deleted file mode 100644 index 491117e3..00000000 --- a/templates/pages/store/_supplier_purchase_orders.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.date_from.label }} - {{ model.form_filters.date_from() }} - {% for error in model.form_filters.date_from.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    -
    -
    - {{ model.form_filters.date_to.label }} - {{ model.form_filters.date_to() }} - {% for error in model.form_filters.date_to.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for order in model.supplier_purchase_orders %} - {% include 'components/store/_row_supplier_purchase_order.html' %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_supplier_purchase_order.html' %} - -
    SupplierItemsCurrencyCost Total VAT Excl.Cost Total VAT Incl. - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_suppliers.html b/templates/pages/store/_suppliers.html deleted file mode 100644 index c38a7db3..00000000 --- a/templates/pages/store/_suppliers.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'layouts/layout.html' %} - -{% block page_body %} - - -
    - {{ model.form_filters.hidden_tag() }} -
    -
    - {{ model.form_filters.active.label }} - {{ model.form_filters.active() }} - {% for error in model.form_filters.active.errors %} -

    {{ error }}

    - {% endfor %} -
    -
    - - {% set block_id = 'buttons_table_default' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - - - - - - - - - - - - - - - - - - {% set is_blank_row = False %} - {% for supplier in model.suppliers %} - {% include 'components/store/_row_supplier.html' %} - {% endfor %} - - {% set is_blank_row = True %} - {% include 'components/store/_row_supplier.html' %} - -
    CompanyContact NameContact DepartmentAddressPhone NumberFax NumberEmailWebsiteCurrency - {% set block_id = 'button_add' %} - {% include 'components/common/buttons/_buttons_save_cancel.html' %} -
    - - {% include 'components/common/temporary/_overlay_confirm.html' %} - {% include 'components/common/temporary/_overlay_error.html' %} - - - - -{% endblock %} \ No newline at end of file diff --git a/todo.txt b/todo.txt new file mode 100644 index 00000000..94eba6bb --- /dev/null +++ b/todo.txt @@ -0,0 +1,2 @@ + +Dark mode / light mode \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 6d902e44..a792af43 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -8,18 +8,8 @@ module.exports = { path.resolve(__dirname, 'static/js/app.js'), path.resolve(__dirname, 'static/css/main.css'), path.resolve(__dirname, 'static/css/components/button.css'), - path.resolve(__dirname, 'static/css/components/card.css'), - path.resolve(__dirname, 'static/css/components/dialog.css'), - path.resolve(__dirname, 'static/css/components/form.css'), - path.resolve(__dirname, 'static/css/components/image.css'), - path.resolve(__dirname, 'static/css/components/label.css'), - path.resolve(__dirname, 'static/css/components/modal.css'), - path.resolve(__dirname, 'static/css/components/navigation.css'), - path.resolve(__dirname, 'static/css/components/overlay.css'), - path.resolve(__dirname, 'static/css/components/table.css'), path.resolve(__dirname, 'static/css/layouts/header.css'), path.resolve(__dirname, 'static/css/layouts/footer.css'), - path.resolve(__dirname, 'static/css/layouts/table-main.css'), path.resolve(__dirname, 'static/css/lib/reset.css'), path.resolve(__dirname, 'static/css/lib/typography.css'), path.resolve(__dirname, 'static/css/lib/utils.css'), @@ -36,14 +26,6 @@ module.exports = { path.resolve(__dirname, 'static/css/sections/core.css'), path.resolve(__dirname, 'static/css/pages/core/contact.css') ], - core_services: [ - path.resolve(__dirname, 'static/css/sections/core.css'), - path.resolve(__dirname, 'static/css/pages/core/services.css') - ], - core_admin_home: [ - path.resolve(__dirname, 'static/css/sections/core.css'), - path.resolve(__dirname, 'static/css/pages/core/admin_home.css') - ], // Legal /* legal_accessibility_report: [ @@ -68,43 +50,6 @@ module.exports = { path.resolve(__dirname, 'static/css/sections/legal.css'), path.resolve(__dirname, 'static/css/pages/legal/privacy_policy.css') ], - // Store - store_home: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/home.css') - ], - store_products: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/products.css') - ], - store_product_categories: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/product_categories.css') - ], - store_product_permutations: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/product_permutations.css') - ], - store_product_variations: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/product_variations.css') - ], - store_stock_items: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/stock_items.css') - ], - store_suppliers: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/supplier.css') - ], - store_supplier_purchase_orders: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/supplier_purchase_order.css') - ], - store_manufacturing_purchase_orders: [ - path.resolve(__dirname, 'static/css/sections/store.css'), - path.resolve(__dirname, 'static/css/pages/store/manufacturing_purchase_order.css') - ], }, output: { filename: 'js/[name].bundle.js',