Initial commit

This commit is contained in:
2024-04-17 15:07:51 +01:00
commit f1b095ba83
280 changed files with 30850 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
<!-- Product price display with purchase options -->
<div class="container column">
<h2>{{ product.output_price() }}</h2> <!-- product.price_GBP -->
{% set form = product.form_basket_add %}
<form {{ model.attr_form_type }}="{{ form.form_type }}" {{ model.attr_id_product }}="{{ product.id_product }}" {{ model.attr_id_permutation }}="{{ permutation.id_permutation }}" class="container column">
{{ form.hidden_tag() }}
{% set tmp_quantity = 1 %}
{% include '_block_input_number_plus_minus.html' %}
{{ form.submit() }}
</form>
<!--
<button class="{{ model.flag_btn_basket_add }}" type="submit" {{ model.attr_id_product }}="{{ product.id }}">Add to basket</button>
<button class="{{ model.flag_btn_buy_now }}" type="submit" {{ model.attr_id_product }}="{{ product.id }}">Buy it now</button>
-->
</div>

View File

@@ -0,0 +1,26 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/home.css') }}">
<!-- HTML content -->
<div class="card">
<div class="container column">
<h1>Offering a full suite of software engineering services.</h1>
</div>
</div>
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/home.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_home }}";
$(document).ready(function() {
hookupPageHome();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,140 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8"/>
<title>{% block title %}{% endblock %} - PARTS</title>
<!-- Scripts -->
<script src="{{ url_for('static', filename='js/shared.js') }}"></script>
<script src="https://code.jquery.com/jquery-3.7.1.js"></script> <!-- Include jQuery from a CDN -->
<script>
var flagBtnOverlayClose = "{{ model.flag_btn_overlay_close }}";
var flagBtnSubmit = "{{ model.flag_btn_submit }}";
var flagCard = "{{ model.flag_card }}";
var flagCollapsible = "{{ model.flag_collapsible }}";
var flagColumn = "{{ model.flag_column }}";
var flagContainer = "{{ model.flag_container }}";
var flagContainerInput = "{{ model.flag_container_input }}";
var flagRow = "{{ model.flag_row }}";
var flagScrollable = "{{ model.flag_scrollable }}";
var flagBtnOverlayClose = "{{ model.flag_btn_overlay_close }}";
var flagInitialised = "{{ model.flag_initalised }}";
var flagSubmitted = "{{ model.flag_submitted }}";
var hashPageContact = "{{ model.hash_page_contact }}";
var hashPageErrorNoPermission = "{{ model.hash_page_error_no_permission }}";
var hashPageHome = "{{ model.hash_page_home }}";
var hashPageStoreHome = "{{ model.hash_page_store_home }}";
var hashPageStoreProduct = "{{ model.hash_page_store_product }}";
var idFormCurrency = "#{{ model.id_form_currency }}";
var idFormDeliveryRegion = "#{{ model.id_form_delivery_region }}";
var idFormIsIncludedVAT = "#{{ model.id_form_is_included_VAT }}";
var idNavContact = "#{{ model.id_nav_contact }}";
var idNavHome = "#{{ model.id_nav_home }}";
var idNavStoreHome = "#{{ model.id_nav_store_home }}";
var idNavStoreProduct = "#{{ model.id_nav_store_product }}";
var idPageBody = "#{{ model.id_page_body }}";
var isUserLoggedIn = {{ model.output_bool(model.is_user_logged_in) }};
var keyBasket = "{{ model.key_basket }}";
var keyForm = "{{ model.key_form }}";
var keyPrice = "{{ model.key_price }}";
var keyQuantity = "{{ model.key_quantity }}";
var keyShared = "shared";
var _pathHost = "{{ model.url_host }}";
</script>
<!-- Stylesheets -->
<link href="{{ url_for('static', filename='css/shared.css') }}" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="header card">
<div class="container">
<img class="header-logo" src="{{ url_for('static', filename='images/Logo.png') }}" alt="PARTS logo">
</div>
<div class="container">
<h1>Precision And Research Technology Systems Limited</h1>
</div>
</div>
<div class="topnav container row">
<div class="container column">
<a id="{{ model.id_nav_home }}">Home</a> <!-- href="{{ url_for('home') }}" -->
</div>
<div class="container column">
<a id="{{ model.id_nav_store_home }}">Store</a>
</div>
<div class="container column">
<!-- <a href="{ url_ for('create_price_dummy') }">Create template price</a> -->
<form id="{{ model.id_form_is_included_VAT }}" class="container" action="{{ url_for('set_is_included_VAT') }}" method="POST">
{{ model.form_is_included_VAT.hidden_tag() }}
<div class="container-input">
{{ 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 %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<form id="{{ model.id_form_delivery_region }}" class="container" action="{{ url_for('set_delivery_region') }}" method="POST">
{{ model.form_delivery_region.hidden_tag() }}
<div class="container-input">
{{ 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 %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<form id="{{ model.id_form_currency }}" class="container" action="{{ url_for('set_currency') }}" method="POST">
{{ model.form_currency.hidden_tag() }}
<div class="container-input">
{{ model.form_currency.id_currency.label }}
{{ model.form_currency.id_currency() }}
{% for error in model.form_currency.id_currency.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<a href="{{ url_for('logout') if model.is_user_logged_in else url_for('login') }}" style="float:right">{{ 'Logout' if model.is_user_logged_in else 'Login' }}</a>
</div>
</div>
<!-- Page body -->
<div id="{{ model.id_page_body }}" class="container" style="display: block;">
{% block page_body %}{% endblock %}
</div>
<div class="footer">
<h4>Copyright (C) Precision And Research Technology Systems Limited. All rights reserved.</h4>
<h5>Company number 13587499</h5>
</div>
</body>
</html>
<!-- Scripts --
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
-->
<!-- Include jQuery from a CDN --
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-->
<script>
$(document).ready(function() {
// alert("naughty boy");
hookupShared();
});
</script>

View File

@@ -0,0 +1,17 @@
<!-- Input Number with +/- buttons -->
<!-- requires:
Product product
Form_Product form - with product id attribute for accessing input element attribute
int tmp_quantity - placeholder
-->
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}" style="flex: none;">
<div class="btn-decrement" {{ model.ATTR_ID_PRODUCT }}="{{ product.id_product }}" {{ model.ATTR_ID_PERMUTATION }}="{{ permutation.id_permutation }}" {{ model.ATTR_FORM_TYPE }}="{{ form.form_type }}">-</div>
</div>
<div class="{{ model.FLAG_CONTAINER }}-input {{ model.FLAG_COLUMN }}" style="flex: none;">
{{ form.quantity(value=tmp_quantity) }} <!-- model.attr_id_product=product.id -->
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}" style="flex: none;">
<div class="btn-increment" {{ model.ATTR_ID_PRODUCT }}="{{ product.id_product }}" {{ model.ATTR_ID_PERMUTATION }}="{{ permutation.id_permutation }}" {{ model.ATTR_FORM_TYPE }}="{{ form.form_type }}">+</div>
</div>
</div>

View File

@@ -0,0 +1,10 @@
{% extends '_template_overlay.html' %}
<!-- Requirements
Form_Billing form
string overlay_id
string overlay_title
-->
{% block overlay_body %}
{% include '_block_store_address.html' %}
{% endblock %}

View File

@@ -0,0 +1,79 @@
<!-- Address form
<div class="card"> -->
<form id="{{ form.output_id() }}" class="{{ model.flag_container }}">
{{ form.hidden_tag() }}
{% if form.form_type_billing_not_delivery %}
<div class="{{ model.flag_container_input }}">
{{ form.identical.label }}
{{ form.identical(checked=True) }}
</div>
{% endif %}
<div class="{{ model.flag_container_input }}">
{{ form.region.label }}
{{ form.region() }}
{% for error in form.region.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.name_full.label }}
{{ form.name_full(size=100) }}
{% for error in form.name_full.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.phone_number.label }}
{{ form.phone_number(size=20) }}
{% for error in form.phone_number.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.postcode.label }}
{{ form.postcode(size=10) }}
{% for error in form.postcode.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.address_1.label }}
{{ form.address_1(size=254) }}
{% for error in form.address_1.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.address_2.label }}
{{ form.address_2(size=254) }}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.city.label }}
{{ form.city(size=100) }}
{% for error in form.city.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.county.label }}
{{ form.county(size=100) }}
{% for error in form.county.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="{{ model.flag_container_input }}">
{{ form.submit() }}
</div>
</form>
<!--</div>-->

View File

@@ -0,0 +1,18 @@
<!-- Basket -->
{% set show_delivery_option = False %}
<div id="{{ model.id_basket }}" class="{{ model.flag_card }} {{ model.flag_scrollable }}">
<div class="container column">
<div class="container row">
<h2>Basket</h2>
<img class="img-icon" src="{{ url_for('static', filename='images/icon_basket.png')}}" alt="Basket icon">
</div>
{% for basket_item in model.basket.items %}
{% include '_block_store_basket_item.html' %}
{% endfor %}
<h3 id="{{ model.id_basket_total }}">Total: {{ model.output_basket_total() }}</h3>{% if not model.app.is_included_VAT %}<h4> + VAT </h4>{% endif %}
<p id="{{ model.id_label_basket_empty}}" style="margin: 1vh;">Buy some shit dawg!</p>
<!-- <div id="{{ model.id_basket_notices }}"> include line above
</div> -->
<button id="{{ model.id_btn_checkout }}" type="submit">Checkout</button>
</div>
</div>

View File

@@ -0,0 +1,35 @@
<!-- Basket Item -->
<!-- requires:
Basket_Item basket_item
bool show_delivery_option
-->
<div class="container row">
{% set product = basket_item.product %}
{% set permutation = product.get_permutation_selected() %}
<div class="container">
<img class="img-thumbnail" src="{{ product.get_image_from_index(0).url }}" alt="Basket icon"> <!-- model.get_many_product_image_src(product.id_product, '', True, 'THUMBNAIL') -->
</div>
{% set form = product.form_basket_edit %}
<!-- <form {{ model.attr_form_type }}="{{ form.form_type }}" {{ model.attr_id_product }}="{{ product.id }}" class="container column" action="{{ url_for('basket_add') }}" method="POST"> -->
<form {{ model.attr_form_type }}="{{ form.form_type }}" class="{{ model.flag_container }} {{ model.flag_column }}" {{ model.attr_id_product }}="{{ product.id_product}}" {{ model.attr_id_permutation }}="{{ permutation.id_permutation }}"> <!-- id="form_basket_item_id_{{ basket_item.product.id }}" -->
{{ form.hidden_tag() }}
<h2>{{ product.name }}</h2>
{% if permutation.is_available %}
<h3 style="white-space: nowrap;">{{ basket_item.quantity }} x {{ product.output_price(model.app.is_included_VAT) }} = {{ basket_item.output_subtotal() }}</h3>
{% set tmp_quantity = basket_item.quantity %}
{% include '_block_input_number_plus_minus.html' %}
{% elif permutation.is_unavailable_in_currency_or_region %}
<h3 style="white-space: nowrap;">Product not available in currency and region</h3>
{% else %}
<h3 style="white-space: nowrap;">Product not available</h3>
{% endif %}
<a class="{{ model.flag_basket_item_delete }}">Delete</a>
{% if show_delivery_option %}
<div class="{{ model.flag_container_input }}">
{{ product.form_delivery_option.label }}
{{ product.form_delivery_option() }}
</div>
{% endif %}
<script>console.log('creating basket item for:');console.log('product id: {{ product.id_product }}');console.log('permutation id: {{ product.get_id_permutation() }}');console.log('quantity: {{ basket_item.quantity }}');</script>
</form>
</div>

View File

@@ -0,0 +1,22 @@
<!-- Store Product Card
for insertion in _store_product_category_card
-->
{% set permutation = product.get_permutation_selected() %}
<div class="card subcard" {{ model.attr_id_product }}="{{ product.id_product }}" {{ model.attr_id_permutation }}="{{ permutation.id_permutation }}">
<div class="container">
<img class="img-product" src="{{ permutation.get_image_from_index(0).url }}" alt="Template product image"> <!-- model.get_many_product_image_src(product.id_product, '', True, 'FULL') -->
</div>
{% set form = product.form_basket_add %}
<form {{ model.attr_form_type }}="{{ form.form_type }}" {{ model.attr_id_product }}="{{ product.id_product }}" {{ model.attr_id_permutation }}="{{ permutation.id_permutation }}" class="container column" action="{{ url_for('basket_add') }}" method="POST">
{{ form.hidden_tag() }}
<h2>{{ product.name }}</h2>
<h3>{{ permutation.output_price(model.app.is_included_VAT) }}</h3>
{% if permutation.is_available %}
{% set tmp_quantity = 1 %}
{% include '_block_input_number_plus_minus.html' %}
{{ form.submit() }}
<p>Get it: <strong>{{ permutation.output_delivery_date() }}</strong></p>
{% endif %}
</form>
<!-- { % inc !!!! broken to ignore !!!! lude '_block_store_product_price!!!! broken to ignore !!!!.html' % } -->
</div>

View File

@@ -0,0 +1,9 @@
<!-- Store Product Category Card -->
<div class="card" {{ model.attr_product_category_id }}="{{ cat.id_category }}">
<h3 style="width: 100%; justify-self: left; margin-left: 3vh; display: inline-flex;">{{ cat.name }}</h4>
<div class="container">
{% for product in cat.products %}
{% include '_block_store_product.html' %}
{% endfor %}
</div>
</div>

View File

@@ -0,0 +1,94 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/store_home.css') }}">
<!-- HTML content -->
<div class="card">
<form id="{{ model.id_form_contact }}" class="container" action="{{ url_for('contact') }}" method="POST">
<h2 class="label-title">Complete the form or find our details below.</h2>
<!--
<div class="container-input">
<label for="sender_email">Email address</label> <!-- class="input-label" --
<input type="email" id="sender_email" name="sender_email" placeholder="Please enter your email address so we can get back to you." style="width: 50%;"/>
</div>
<div class="container-input">
<label for="sender_CC">
<input type="checkbox" id="sender_CC" name="sender_CC" checked/>Uncheck this box if you do not wish to receive a copy of the email
</label>
</div>
<div class="container-input">
<label for="sender_name">Name</label> <!-- class="input-label" --
<input type="text" id="sender_name" name="sender_name" placeholder="Please enter your preferred name." style="width: 30%;"/>
</div>
<div class="container-input">
<label for="sender_message">Message</label> <!-- class="input-label" --
<textarea id="sender_message" name="sender_message" rows="4" cols="80" placeholder="How can we help?"></textarea>
</div>
<button type="submit" id="submit_form_email">Submit request</button>
-->
{{ model.form.hidden_tag() }}
<div class="container-input">
{{ model.form.email.label }}
{{ model.form.email(size=254) }}
{% for error in model.form.email.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<!--
<div class="container-input">
{{ model.form.CC.label }}
{{ model.form.CC(checked=True) }}
{% for error in model.form.name.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
-->
<div class="container-input">
{{ model.form.name.label }}
{{ model.form.name(size=50) }}
{% for error in model.form.name.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="container-input">
{{ model.form.msg.label }}
{{ model.form.msg(rows=4, cols=80) }}
{% for error in model.form.name.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
<div class="container-input">
{{ model.form.submit() }}
</div>
</form>
</div>
<div class="card">
<h3 class="label-title">Contact Details</h3>
<div class="container">
<h4>edward.middletonsmith@gmail.com</h4>
<a href="{{ model.url_LinkedIn }}" class="container-icon-label"><img class="img-icon" src="{{ url_for('static', filename='images/Logo_LinkedIn.png') }}"/><h4>LinkedIn</h4></a>
<a href="{{ model.url_GitHub }}" class="container-icon-label"><img class="img-icon" src="{{ url_for('static', filename='images/Logo_GitHub.png') }}"/><h4>GitHub</h4></a>
</div>
<div class="container">
<h4>Unit 12c, Somers Road</h4>
<h4>Rugby, Warwickshire</h4>
<h4>CV22 7DH</h4>
</div>
</div>
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/contact.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_contact }}";
$(document).ready(function() {
hookupPageContact();
});
</script>
{% endblock %}

142
templates/_page_home.html Normal file
View File

@@ -0,0 +1,142 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/home.css') }}">
<!-- HTML content -->
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h1>Offering a full suite of software engineering services.</h1>
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Web App & Database Design</h2>
<p>Crafting seamless digital experiences with expertly designed web applications and robust database solutions.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video --
<video controls class="img-demo" name="Web app and database design">
<source src="{{ url_for('static', filename='images/webapp_db_design.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
-->
<!-- gif --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.gif')}}" alt="Web app and database design gif">
-->
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Programming services (C++, Python, etc.)</h2>
<p>Empowering businesses with efficient automation, web manipulation, and cutting-edge AI/ML solutions for complex tasks.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video -->
<video controls class="img-demo" name="Programming services">
<source src="{{ url_for('static', filename='images/programming_services.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
<!-- gif --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.gif')}}" alt="Web app and database design gif">
-->
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>MS Office Data Analysis & Automation</h2>
<p>Unleashing the power of MS Office for streamlined data analysis, automation, and enhanced productivity across Excel, PowerPoint, and Outlook.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video -->
<video controls class="img-demo" name="MS Office automation">
<source src="{{ url_for('static', filename='images/ms_automation.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
<!-- gif --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.gif')}}" alt="Web app and database design gif">
-->
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Mechatronics Design</h2>
<p>Integrating mechanical and electronic components seamlessly for innovative mechatronic solutions, elevating your product design.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video --
<video controls class="img-demo">
<source src="{{ url_for('static', filename='images/programming_services.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
-->
<!-- gif -->
<img class="img-demo" src="{{ url_for('static', filename='images/mechatronics_design.gif')}}" alt="Mechatronics design gif">
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>CAD, DFM, DFAM</h2>
<p>Transforming concepts into reality with precision CAD designs, Design for Manufacturing (DFM), and Design for Additive Manufacturing (DFAM) expertise.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video --
<video controls class="img-demo">
<source src="{{ url_for('static', filename='images/programming_services.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
-->
<!-- gif -->
<img class="img-demo" src="{{ url_for('static', filename='images/CAD.gif')}}" alt="Computer aided design gif">
</div>
</div>
<div class="{{ model.FLAG_CARD }}">
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<h2>Photopolymerisation, Materials Science, AM Advice</h2>
<p>Navigating the forefront of materials science and additive manufacturing, providing expert advice on photopolymerisation and innovative AM solutions.</p>
</div>
<div class="{{ model.FLAG_CONTAINER }}">
<!-- image --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.jpg')}}" alt="Web app and database design image">
-->
<!-- MP4 video --
<video controls class="img-demo">
<source src="{{ url_for('static', filename='images/programming_services.mp4')}}" type="video/mp4">
Your browser does not support the video format mp4.
</video>
-->
<!-- gif --
<img class="img-demo" src="{{ url_for('static', filename='images/webapp_db_design.gif')}}" alt="Web app and database design gif">
-->
</div>
</div>
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/home.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_home }}";
$(document).ready(function() {
hookupPageHome();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,78 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/home.css') }}">
<!-- HTML content -->
<div class="row">
<div class="leftcolumn">
<div class="card">
<div class="container column">
<button id="{{ model.id_btn_admin_stripe_product_new }}">Add new Stripe products</button>
</div>
</div>
<div class="card">
<div class="container column">
<button id="{{ model.id_btn_admin_stripe_price_new }}">Add new Stripe prices</button>
</div>
</div>
<div class="card">
<div class="container column">
<button>Admin template 1</button>
</div>
</div>
</div>
<div class="rightcolumn">
<div class="card">
<div class="container">
<h3 class="label-title">About Us</h3>
<img class="img-featured" src="{{ url_for('static', filename='images/Tag_Molly1.jpg')}}" alt="Molly tag image">
<p>We are open for business!</p>
</div>
</div>
<div class="card">
<div class="container">
<h3 class="label-title">Promoted content</h3>
<div class="card">
<div class="container">
<img class="img-featured" src="{{ url_for('static', filename='images/Braille_Translator_Demo.png')}}" alt="Braille translator demo image">
</div>
<div class="container">
<p>Braille Keyboard Learning Tool</p>
</div>
</div>
<div class="card">
<div class="container">
<img class="img-featured" src="{{ url_for('static', filename='images/Prosthetics_Demo.gif')}}" alt="Prosthetics demo gif">
</div>
<div class="container">
<p>FREE Prosthetic Hands by e-NABLE</p>
</div>
</div>
</div>
</div>
<div class="card">
<div class="container">
<h3 class="label-title">Where to find us</h3>
<a href="{{ model.url_LinkedIn }}" class="container-icon-label"><img class="img-icon" src="{{ url_for('static', filename='images/Logo_LinkedIn.png') }}"/><h4>LinkedIn</h4></a>
<a href="{{ model.url_GitHub }}" class="container-icon-label"><img class="img-icon" src="{{ url_for('static', filename='images/Logo_GitHub.png') }}"/><h4>GitHub</h4></a>
</div>
</div>
</div>
</div>
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/store_admin.js') }}"></script>
<script src="{{ url_for('static', filename='js/store_shared.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_home }}";
$(document).ready(function() {
hookupPageStoreAdminHome();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,89 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheets -->
{% set block_id = 'styles' %}
{% include '_shared_store.html' %}
<!-- <link rel="stylesheet" href="{{ url_for('static', filename='css/store_home.css') }}"> css/store_basket.css -->
<!-- HTML content -->
<div class="{{ model.flag_card }}">
<div class="{{ model.flag_container }} {{ model.flag_column }}">
<div id="{{ model.id_container_info_delivery }}" class="{{ model.flag_container }} {{ model.flag_row }}" style="border-bottom: 1px black;">
<h2>Delivery Information</h2>
<div class="{{ model.flag_container }} {{ model.flag_row }}">
Valid delivery information not submitted
</div>
</div>
<div id="{{ model.id_container_info_billing }}" class="{{ model.flag_container }} {{ model.flag_row }}" style="border-bottom: 1px black;">
<h2>Billing Information</h2>
<div class="{{ model.flag_container }} {{ model.flag_row }}">
Valid billing information not submitted
</div>
</div>
<div class="{{ model.flag_container }}">
<div id="{{ model.id_basket_container }}">
{% include '_block_store_basket.html' %}
</div>
<!-- Comes with basket block
<div class="{{ model.flag_container }}">
<!-- subtotal --
<h2 id="id_basket_total">Order total: £{{ model.output_basket_total() }}</h2>
<!-- checkout button - hidden unless valid details entered everywhere above --
<button type="submit" class="{{ model.flag_btn_submit }}">Complete Purchase</button>
</div>
-->
</div>
</div>
</div>
{% set form = model.form_delivery %}
{% set overlay_id = model.id_overlay_info_delivery %}
{% set overlay_title = 'Delivery Information' %}
{% include '_block_overlay_address.html' %}
{% set form = model.form_billing %}
{% set overlay_id = model.id_overlay_info_billing %}
{% set overlay_title = 'Billing Information' %}
{% include '_block_overlay_address.html' %}
<!-- Include JavaScript -->
{% set block_id = 'scripts' %}
{% include '_shared_store.html' %}
<script src="{{ url_for('static', filename='js/store_page_basket.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_store_basket }}";
var hashPageStoreCheckout = "{{ model.hash_page_store_checkout }}";
var hashPageStoreCheckoutSession = "{{ model.hash_page_store_checkout_session }}";
var hashStoreBasketInfo = "{{ model.hash_store_basket_info }}";
var idOverlayInfoBilling = "#{{ model.id_overlay_info_billing }}";
var idOverlayInfoDelivery = "#{{ model.id_overlay_info_delivery }}";
var idContainerInfoBilling = "#{{ model.id_container_info_billing }}";
var idContainerInfoDelivery = "#{{ model.id_container_info_delivery }}";
var keyIdCheckout = "{{ model.key_id_checkout }}";
var keyInfoBilling = "{{ model.key_info_billing }}";
var keyInfoDelivery = "{{ model.key_info_delivery }}";
var keyInfoIdentical = "{{ model.key_info_identical }}";
var keyInfoType = "{{ model.key_info_type }}";
var keyIsSubscription = "{{ model.key_is_subscription }}";
var keyAddress1 = "{{ model.key_address1 }}";
var keyAddress2 = "{{ model.key_address2 }}";
var keyCity = "{{ model.key_city }}";
var keyCounty = "{{ model.key_county }}";
var keyNameFull = "{{ model.key_name_full }}";
var keyPhoneNumber = "{{ model.key_phone_number }}";
var keyPostcode = "{{ model.key_postcode }}";
var keyRegion = "{{ model.key_region }}";
var keyUrlCheckout = "{{ model.key_url_checkout }}";
$(document).ready(function() {
console.log('Hooking up store basket review page...');
hookupStorePageBasket();
// hookupStorePageBilling();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,63 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
<!-- Include Stylesheets -->
{% set block_id = 'styles' %}
{% include '_shared_store.html' %}
<!-- <link rel="stylesheet" href="{{ url_for('static', filename='css/store_home.css') }}"> css/store_basket.css -->
<!-- HTML content -->
<div class="{{ model.flag_card }}">
<div class="{{ model.flag_container }} {{ model.flag_column }}">
<div id="{{ model.id_container_info_delivery }}" class="{{ model.flag_container }} {{ model.flag_row }}" style="border-bottom: 1px black;">
<h2>Order successful!</h2>
<div class="{{ model.flag_container }} {{ model.flag_row }}">
<div class="{{ model.flag_label }}"><strong>Order reference: {{ model.checkout_session.id }}</strong></div>
<div class="{{ model.flag_label }}">You will receive an order acknowledgement by email</div>
</div>
{% if model.is_user_logged_in %}
<div class="{{ model.flag_container }} {{ model.flag_row }}">
<h3>Your order:</h3>
</div>
{% endif %}
</div>
</div>
</div>
<!-- Include JavaScript -->
{% set block_id = 'scripts' %}
{% include '_shared_store.html' %}
<script src="{{ url_for('static', filename='js/store_page_basket.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_store_basket }}";
var hashPageStoreCheckout = "{{ model.hash_page_store_checkout }}";
var hashPageStoreCheckoutSession = "{{ model.hash_page_store_checkout_session }}";
var hashStoreBasketInfo = "{{ model.hash_store_basket_info }}";
var idOverlayInfoBilling = "#{{ model.id_overlay_info_billing }}";
var idOverlayInfoDelivery = "#{{ model.id_overlay_info_delivery }}";
var idContainerInfoBilling = "#{{ model.id_container_info_billing }}";
var idContainerInfoDelivery = "#{{ model.id_container_info_delivery }}";
var keyIdCheckout = "{{ model.key_id_checkout }}";
var keyInfoBilling = "{{ model.key_info_billing }}";
var keyInfoDelivery = "{{ model.key_info_delivery }}";
var keyInfoIdentical = "{{ model.key_info_identical }}";
var keyInfoType = "{{ model.key_info_type }}";
var keyIsSubscription = "{{ model.key_is_subscription }}";
var keyAddress1 = "{{ model.key_address1 }}";
var keyAddress2 = "{{ model.key_address2 }}";
var keyCity = "{{ model.key_city }}";
var keyCounty = "{{ model.key_county }}";
var keyNameFull = "{{ model.key_name_full }}";
var keyPhoneNumber = "{{ model.key_phone_number }}";
var keyPostcode = "{{ model.key_postcode }}";
var keyRegion = "{{ model.key_region }}";
$(document).ready(function() {
console.log('Hooking up store checkout success page...');
hookupStorePageCheckoutSuccess();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,37 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
{% set block_id = 'styles' %}
{% include '_shared_store.html' %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/store_home.css') }}">
<!-- HTML content -->
<div class="row">
<div class="leftcolumn">
{% for cat in model.category_list.categories %}
{% include '_block_store_product_category.html' %}
{% endfor %}
</div>
<div id="{{ model.id_basket_container }}" class="rightcolumn">
{% include '_block_store_basket.html' %}
</div>
</div>
{% set block_id = 'scripts' %}
{% include '_shared_store.html' %}
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/store_home.js') }}"></script>
<script>
var hashPageCurrent = "{{ model.hash_page_store_home }}";
$(document).ready(function() {
console.log('Hooking up home page...');
hookupStorePageHome();
// hookupStore(); // in _shared_store.html
});
</script>
{% endblock %}

View File

@@ -0,0 +1,53 @@
{% extends 'layout.html' %}
{% block title %}{{ model.title }}{% endblock %}
{% block page_body %}
{% set product = model.product %}
{% set permutation = product.get_permutation_selected() %}
{% set block_id = 'styles' %}
{% include '_shared_store.html' %}
<script>console.log("test 1");</script>
<link rel="stylesheet" href="{{ url_for('static', filename='css/store_product.css') }}">
<!-- HTML content -->
<div class="row">
<div class="leftcolumn">
<div class="card">
<div class="container">
<div class="card subcard">
<div class="container column">
<h2>{{ product.get_name() }}</h2>
<div class="container-img-gallery">
<img class="img-product" src="{{ product.get_image_from_index(0).url }}" alt="Template product image"> <!-- model.get_many_product_image_src(product.id, '', True, 'FULL') -->
</div>
</div>
{% include '_block_store_product_price.html' %}
</div>
<div class="card subcard">
<div>{{ permutation.description }}</div>
</div>
</div>
</div>
</div>
<div id="{{ model.id_basket_container }}" class="rightcolumn">
{% include '_block_store_basket.html' %}
</div>
</div>
{% set block_id = 'scripts' %}
{% include '_shared_store.html' %}
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/store_product.js') }}"></script>
<script>
// pass arguments from model to JS
var hashPageCurrent = "{{ model.hash_page_store_product }}";
// hookup elements
$(document).ready(function() {
console.log('Hooking up store product page...');
hookupStorePageProduct();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,51 @@
{% if block_id == 'block1' %}
<div class="common-block" id="block1">
<h1>Feckin common block boi</h1>
</div>
{% elif block_id == 'styles' %}
<!-- Include Stylesheet -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/store_shared.css') }}">
{% elif block_id == 'scripts' %}
<!-- Include JavaScript -->
<script src="{{ url_for('static', filename='js/store_shared.js') }}"></script>
<!-- Variables from Model_View_Store + model-->
<script>
var attrFormType = "{{ model.attr_form_type }}";
var attrIdPermutation = "{{ model.attr_id_permutation }}";
var attrIdProduct = "{{ model.attr_id_product }}";
var attrIdProductCategory = "{{ model.attr_id_product_category }}";
var flagBasketItemDelete = "{{ model.flag_basket_item_delete }}";
var flagBtnBasketAdd = "{{ model.flag_btn_basket_add }}";
var flagBtnBuyNow = "{{ model.flag_btn_buy_now }}";
var hashStoreBasketAdd = "{{ model.hash_store_basket_add }}";
var hashStoreBasketDelete = "{{ model.hash_store_basket_delete }}";
var hashStoreBasketEdit = "{{ model.hash_store_basket_edit }}";
var hashStoreBasketLoad = "{{ model.hash_store_basket_load }}";
var hashStoreSelectCurrency = "{{ model.hash_store_select_currency }}";
var hashStoreSelectDeliveryRegion = "{{ model.hash_store_select_delivery_region }}";
var hashStoreSetIsIncludedVAT = "{{ model.hash_store_set_is_included_VAT }}";
var hashPageStoreBasket = "{{ model.hash_page_store_basket }}";
var idBasket = "#{{ model.id_basket }}";
var idBasketContainer = "#{{ model.id_basket_container }}";
var idBasketTotal = "#{{ model.id_basket_total }}";
var idBtnCheckout = "#{{ model.id_btn_checkout }}";
var idLabelBasketEmpty = "#{{ model.id_label_basket_empty }}";
var keyIdCurrency = "{{ model.KEY_ID_CURRENCY }}";
var keyIdPermutation = "{{ model.key_id_permutation }}";
var keyIdProduct = "{{ model.key_id_product }}";
var keyIdRegionDelivery = "{{ model.KEY_ID_REGION_DELIVERY }}";
var keyIsIncludedVAT = "{{ model.KEY_IS_INCLUDED_VAT }}";
var typeFormBasketAdd = "{{ model.type_form_basket_add }}";
var typeFormBasketEdit = "{{ model.type_form_basket_edit }}";
if (!isEmpty({{ model.basket.items }})) {
localStorage.setItem(keyBasket, JSON.parse(JSON.stringify({'items': "{{ model.basket.items }}"})));
}
$(document).ready(function() {
hookupStore();
});
</script>
{% endif %}

View File

@@ -0,0 +1,23 @@
<!-- Overlay -->
<!-- Requires
string overlay_id
string overlay_title
-->
<div id="{{ overlay_id }}" class="overlay">
<div class="{{ model.flag_card }}">
<div class="{{ model.flag_container }} {{ model.flag_row }}">
<div class="{{ model.flag_container }} {{ model.flag_column }}">
<h2>{{ overlay_title }}</h2>
</div>
<div class="{{ model.flag_container }} {{ model.flag_column }}">
<button class="{{ model.flag_btn_overlay_close }}">Close</button>
</div>
</div>
<div class="{{ model.flag_container }} {{ model.flag_row }}">
{% block overlay_body %}{% endblock %}
</div>
</div>
</div>

View File

@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8"/>
<title>{% block title %}{% endblock %} - PARTS</title>
<!-- Scripts -->
<script src="{{ url_for('static', filename='js/shared.js') }}"></script>
<script src="https://code.jquery.com/jquery-3.7.1.js"></script> <!-- Include jQuery from a CDN -->
<!-- Stylesheets -->
<link href="{{ url_for('static', filename='css/shared.css') }}" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="header card">
<div class="content">
<img class="header-logo" src="{{ url_for('static', filename='images/Logo.png') }}" alt="PARTS logo">
</div>
<div class="content">
<h1>Precision And Research Technology Systems Limited</h1>
</div>
</div>
<div class="topnav">
<a href="{{ url_for('home') }}">Home</a> <!-- -->
<a href="{{ url_for('store_home') }}">Store</a>
<!--
<a href="{{ url_for('get_publishable_key') }}">Get Key</a>
<a href="{{ url_for('get_checkout_session') }}">Get Session</a>
<!-- POST request form --
<form id="formCreateCheckoutSession" action="{{ url_for('create_checkout_session') }}" method="POST" style="display: none; visibility: hidden;">
<!-- your form fields go here --
<input type="submit" value="Submit">
</form>
<a href="#" onclick="document.getElementById('formCreateCheckoutSession').submit();">About - Post Session</a>
-->
<a href="{{ url_for('contact') }}" style="float:right">Contact</a>
</div>
<div class="content">
{% block content %}{% endblock %}
</div>
<div class="footer">
<h4>Copyright (C) Precision And Research Technology Systems Limited. All rights reserved.</h4>
<h5>Company number 13587499</h5>
</div>
</body>
</html>
<!-- Scripts --
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
-->
<!-- Include jQuery from a CDN --
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-->
<script>
$(document).ready(function() {
// alert("naughty boy");
});
</script>

206
templates/layout.html Normal file
View File

@@ -0,0 +1,206 @@
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8"/>
<title>{% block title %}{% endblock %} - PARTS</title>
<!-- Scripts -->
<script src="{{ url_for('static', filename='js/shared.js') }}"></script>
<script src="https://code.jquery.com/jquery-3.7.1.js"></script> <!-- Include jQuery from a CDN -->
<script>
var flagBtnOverlayClose = "{{ model.FLAG_BTN_OVERLAY_CLOSE }}";
var flagBtnSubmit = "{{ model.FLAG_BTN_SUBMIT }}";
var flagCard = "{{ model.FLAG_CARD }}";
var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}";
var flagColumn = "{{ model.FLAG_COLUMN }}";
var flagContainer = "{{ model.FLAG_CONTAINER }}";
var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}";
var flagRow = "{{ model.FLAG_ROW }}";
var flagScrollable = "{{ model.FLAG_SCROLLABLE }}";
var flagBtnOverlayClose = "{{ model.FLAG_BTN_OVERLAY_CLOSE }}";
var flagInitialised = "{{ model.FLAG_INITIALISED }}";
var flagSubmitted = "{{ model.FLAG_SUBMITTED }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageErrorNoPermission = "{{ model.HASH_PAGE_ERROR_NO_PERMISSION }}";
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageStoreHome = "{{ model.HASH_PAGE_STORE_HOME }}";
var hashPageStoreProduct = "{{ model.HASH_PAGE_STORE_PRODUCT }}";
var idFormCurrency = "#{{ model.ID_FORM_CURRENCY }}";
var idFormDeliveryRegion = "#{{ model.ID_FORM_DELIVERY_REGION }}";
var idFormIsIncludedVAT = "#{{ model.ID_FORM_IS_INCLUDED_VAT }}";
var idNavContact = "#{{ model.ID_NAV_CONTACT }}";
var idNavHome = "#{{ model.ID_NAV_HOME }}";
var idNavStoreHome = "#{{ model.ID_NAV_STORE_HOME }}";
var idNavStoreProduct = "#{{ model.ID_NAV_STORE_PRODUCT }}";
var idPageBody = "#{{ model.ID_PAGE_BODY }}";
var isUserLoggedIn = "{{ model.output_bool(model.IS_USER_LOGGED_IN) }}";
var keyBasket = "{{ model.KEY_BASKET }}";
var keyForm = "{{ model.KEY_FORM }}";
var keyPrice = "{{ model.KEY_PRICE }}";
var keyQuantity = "{{ model.KEY_QUANTITY }}";
var keyShared = "shared";
var _pathHost = "{{ model.URL_HOST }}";
</script>
<!-- Stylesheets -->
<link href="{{ url_for('static', filename='css/shared.css') }}" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="header card">
<div class="container">
<img class="header-logo" src="{{ url_for('static', filename='images/Logo.png') }}" alt="PARTS logo">
</div>
<div class="container">
<h1>Precision And Research Technology Systems Limited</h1>
</div>
</div>
<div class="topnav container row">
<div class="container column">
<a id="{{ model.ID_NAV_HOME }}">Home</a> <!-- href="{{ url_for('home') }}" -->
</div>
<div class="container column">
<a id="{{ model.ID_NAV_SERVICES }}">Services</a>
</div>
<div class="container column">
<a id="{{ model.ID_NAV_TECHNOLOGIES }}">Technologies</a>
</div>
<div class="container column">
<a id="{{ model.ID_NAV_STORE_HOME }}">Store</a>
</div>
<div class="container column">
<a id="{{ model.ID_NAV_CONTACT }}">Contact</a> <!-- href="{{ url_for('contact') }}" -->
</div>
{% if model.is_page_store %}
<div class="container column">
<!-- <a href="{ url_ for('create_price_dummy') }">Create template price</a> -->
<form id="{{ model.ID_FORM_IS_INCLUDED_VAT }}" class="container" action="{{ url_for('set_is_included_VAT') }}" method="POST">
{{ model.form_is_included_VAT.hidden_tag() }}
<div class="container-input">
{{ 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 %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<form id="{{ model.ID_FORM_DELIVERY_REGION }}" class="container" action="{{ url_for('set_delivery_region') }}" method="POST">
{{ model.form_delivery_region.hidden_tag() }}
<div class="container-input">
{{ 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 %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<form id="{{ model.ID_FORM_CURRENCY }}" class="container" action="{{ url_for('set_currency') }}" method="POST">
{{ model.form_currency.hidden_tag() }}
<div class="container-input">
{{ model.form_currency.id_currency.label }}
{{ model.form_currency.id_currency() }}
{% for error in model.form_currency.id_currency.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</form>
</div>
<div class="container column">
<a href="{{ url_for('logout') if model.is_user_logged_in else url_for('login') }}" style="float:right">{{ 'Logout' if model.is_user_logged_in else 'Login' }}</a>
</div>
{% endif %}
</div>
<!--
<div id="{{ model.id_modal_services }}" class="topnav-modal container column">
<div class="container row">
<h2>Web App & Database Design</h2>
</div>
<div class="container row">
<h2>Programming services (C++, Python, etc.)</h2>
</div>
<div class="container row">
<h2>MS Office Data Analysis & Automation</h2>
</div>
<div class="container row">
<h2>Mechatronics Design</h2>
</div>
<div class="container row">
<h2>CAD, DFM, DFAM</h2>
</div>
<div class="container row">
<h2>Photopolymerisation, Materials Science, AM Advice</h2>
</div>
</div>
<div id="{{ model.id_modal_technologies }}" class="topnav-modal container column">
<div class="container row">
<div class="container row">
<h2>Web development</h2>
</div>
<div class="container row">
<div class="container row">
<h3>JavaScript Frameworks</h3>
</div>
<div class="container column">
<h4>Angular</h4>
<h4>React</h4>
<h4>Vue</h4>
</div>
</div>
<div class="container row">
<div class="container row">
<h3>Markup languages</h3>
</div>
<div class="container column">
<h4>HTML</h4>
<h4>CSS</h4>
</div>
</div>
</div>
<div class="container row">
<div class="container row">
<h2>Desktop development</h2>
</div>
</div>
</div>
-->
<!-- Page body -->
<div id="{{ model.ID_PAGE_BODY }}" class="container" style="display: block;">
{% block page_body %}{% endblock %}
</div>
<div class="footer">
<h4>Copyright (C) Precision And Research Technology Systems Limited. All rights reserved.</h4>
<h5>Company number 13587499</h5>
</div>
</body>
</html>
<!-- Scripts --
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
-->
<!-- Include jQuery from a CDN --
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-->
<script>
$(document).ready(function() {
// alert("naughty boy");
hookupShared();
});
</script>