Feat(SQL, UI): Redesign database with much more detailed command response quality analysis and created successfully loading Dog Command Links page
This commit is contained in:
@@ -1 +0,0 @@
|
||||
|
||||
15
templates/components/dog/_preview_DDL_command.html
Normal file
15
templates/components/dog/_preview_DDL_command.html
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
{% if not is_blank_row %}
|
||||
<div
|
||||
class="{{ model.FLAG_COMMAND }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }}="{{ command.id_command }}"
|
||||
{{ model.ATTR_VALUE_PREVIOUS }}="{{ command.id_command }}"
|
||||
>{{ command.name }}</div>
|
||||
{% else %}
|
||||
<select class="{{ model.FLAG_COMMAND }}" {{ model.ATTR_VALUE_CURRENT }}="0" {{ model.ATTR_VALUE_PREVIOUS }}="0">
|
||||
{% include 'components/common/inputs/_option_blank.html' %}
|
||||
{% for command in model.filter_commands %}
|
||||
<option value="{{ command.id_command }}">{{ command.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% endif %}
|
||||
15
templates/components/dog/_preview_DDL_dog.html
Normal file
15
templates/components/dog/_preview_DDL_dog.html
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
{% if not is_blank_row %}
|
||||
<div
|
||||
class="{{ model.FLAG_DOG }}"
|
||||
{{ model.ATTR_VALUE_CURRENT }}="{{ dog.id_dog }}"
|
||||
{{ model.ATTR_VALUE_PREVIOUS }}="{{ dog.id_dog }}"
|
||||
>{{ dog.name }}</div>
|
||||
{% else %}
|
||||
<select class="{{ model.FLAG_DOG }}" {{ model.ATTR_VALUE_CURRENT }}="0" {{ model.ATTR_VALUE_PREVIOUS }}="0">
|
||||
{% include 'components/common/inputs/_option_blank.html' %}
|
||||
{% for dog in model.filter_dogs %}
|
||||
<option value="{{ dog.id_dog }}">{{ dog.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% endif %}
|
||||
38
templates/components/dog/_row_dog_command_link.html
Normal file
38
templates/components/dog/_row_dog_command_link.html
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
{% if is_blank_row %}
|
||||
<tr class="{{ model.FLAG_ROW_NEW }} {{ model.FLAG_DOG_COMMAND_LINK }}" {{ model.ATTR_ID_DOG_COMMAND_LINK }}>
|
||||
<td class="{{ model.FLAG_DOG }}" {{ model.ATTR_VALUE_CURRENT }}="0" {{ model.ATTR_VALUE_PREVIOUS }}="0">
|
||||
{% include 'components/dog/_preview_DDL_dog.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_COMMAND }}" {{ model.ATTR_VALUE_CURRENT }}="0" {{ model.ATTR_VALUE_PREVIOUS }}="0">
|
||||
{% include 'components/dog/_preview_DDL_command.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION}}">
|
||||
<textarea class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}" {{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }}></textarea>
|
||||
</td>
|
||||
<td class="{{ model.FLAG_NOTES}}">
|
||||
<textarea class="{{ model.FLAG_NOTES }}" {{ model.ATTR_VALUE_CURRENT }} {{ model.ATTR_VALUE_PREVIOUS }}></textarea>
|
||||
</td>
|
||||
{% set active = true %}
|
||||
{% include 'components/dog/_td_active.html' %}
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr class="{{ model.FLAG_DOG_COMMAND_LINK }}" {{ model.ATTR_ID_DOG_COMMAND_LINK }}="{{ link.id_link }}">
|
||||
{% set dog = link.dog %}
|
||||
<td class="{{ model.FLAG_DOG }}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.id_dog }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.id_dog }}">
|
||||
{% include 'components/dog/_preview_DDL_dog.html' %}
|
||||
</td>
|
||||
{% set command = link.command %}
|
||||
<td class="{{ model.FLAG_COMMAND }}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.id_command }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.id_command }}">
|
||||
{% include 'components/dog/_preview_DDL_command.html' %}
|
||||
</td>
|
||||
<td class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION}}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.hand_signal_description }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.hand_signal_description }}">
|
||||
<textarea class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.hand_signal_description }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.hand_signal_description }}">{{ link.hand_signal_description }}</textarea>
|
||||
</td>
|
||||
<td class="{{ model.FLAG_NOTES}}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.notes }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.notes }}">
|
||||
<textarea class="{{ model.FLAG_NOTES }}" {{ model.ATTR_VALUE_CURRENT }}="{{ link.notes }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ link.notes }}">{{ link.notes }}</textarea>
|
||||
</td>
|
||||
{% set active = link.active %}
|
||||
{% include 'components/dog/_td_active.html' %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
13
templates/components/dog/_td_active.html
Normal file
13
templates/components/dog/_td_active.html
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
{% with _active = (active is not defined or active or active is none) %}
|
||||
<td class="{{ model.FLAG_ACTIVE }}">
|
||||
{#
|
||||
<input class="{{ model.FLAG_ACTIVE }}" type="checkbox" {% if active %}checked{% endif %} {{ model.ATTR_VALUE_CURRENT }}="{{ active | lower }}" {{ model.ATTR_VALUE_PREVIOUS }}="{{ active | lower }}">
|
||||
#}
|
||||
<button type="button" class="{{ model.FLAG_ACTIVE }} {% if active %}{{ model.FLAG_DELETE }}{% endif %}"
|
||||
{{ model.ATTR_VALUE_CURRENT }}="{{ active | lower }}"
|
||||
{{ model.ATTR_VALUE_PREVIOUS }}="{{ active | lower }}"
|
||||
>{% if active %}x{% else %}+{% endif %}</button>
|
||||
</td>
|
||||
{% endwith %}
|
||||
31
templates/layouts/_dog_shared.html
Normal file
31
templates/layouts/_dog_shared.html
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if block_id == 'block1' %}
|
||||
<div class="common-block" id="block1">
|
||||
<h1>Feckin common block boi</h1>
|
||||
</div>
|
||||
{% elif block_id == 'checkout' %}
|
||||
<!-- Variables from Model_View_Store + model-->
|
||||
<script>
|
||||
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 }}";
|
||||
</script>
|
||||
{% endif %}
|
||||
@@ -112,7 +112,9 @@
|
||||
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
|
||||
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
|
||||
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
|
||||
var flagNavServices = "{{ model.FLAG_NAV_SERVICES }}";
|
||||
var flagNavDogCommand = "{{ model.FLAG_NAV_DOG_COMMAND }}";
|
||||
var flagNavDogDog = "{{ model.FLAG_NAV_DOG_DOG }}";
|
||||
var flagNavDogDogCommandLink = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINK }}";
|
||||
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
|
||||
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
|
||||
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
|
||||
@@ -140,6 +142,7 @@
|
||||
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
|
||||
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
|
||||
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
|
||||
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
|
||||
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
|
||||
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
|
||||
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
||||
@@ -147,6 +150,10 @@
|
||||
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
|
||||
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
|
||||
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
|
||||
var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
|
||||
var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
|
||||
var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
|
||||
var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
|
||||
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
|
||||
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
|
||||
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
|
||||
@@ -184,6 +191,99 @@
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Hamburger navigation menu -->
|
||||
<div id="{{ model.ID_OVERLAY_HAMBURGER }}" class="{{ model.FLAG_OVERLAY}} {{ model.FLAG_HAMBURGER }} {{ model.FLAG_COLLAPSED }}"> <!-- style="height: {{ 27 * 3 }}px" {- { 4.5 * 3 }}vh -->
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_HOME }}">Home</a>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_SERVICES }}">Services</a>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_CONTACT }}">Contact</a>
|
||||
</div>
|
||||
|
||||
{#
|
||||
{% if model.is_page_store and model.user.can_admin_store %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_STORE_PRODUCT_PERMUTATIONS }}">Product Permutations</a>
|
||||
</div>
|
||||
{% if model.user.can_admin_store %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_STORE_STOCK_ITEMS }}">Stock Items</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<!--
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<!-- <a href="{ url_ for('create_price_dummy') }">Create template price</a> --
|
||||
<form id="{{ model.ID_FORM_IS_INCLUDED_VAT }}" class="{{ model.FLAG_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( checked = model.is_included_VAT ) }}
|
||||
{ % for error in model.form_is_included_VAT.is_included.errors %}
|
||||
<p class="error">{{ error }}</p>
|
||||
{ % endfor %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<form id="{{ model.ID_FORM_DELIVERY_REGION }}" class="{{ model.FLAG_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="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<form id="{{ model.ID_FORM_CURRENCY }}" class="{{ model.FLAG_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="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a href="{ { url_for('routes_user.logout') if model.is_user_logged_in else url_for('routes_user.login') }}" style="float:right">{{ 'Logout' if model.is_user_logged_in else 'Login' }}</a>
|
||||
</div>
|
||||
-->
|
||||
{% else %}
|
||||
{% if model.user.can_admin_store %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_STORE_HOME }}">Shop</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
#}
|
||||
{% if model.user.can_admin_store %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_ADMIN_HOME }}">Admin</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if model.user.is_logged_in %}
|
||||
{#
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_USER_ACCOUNT }}">Account</a>
|
||||
</div>
|
||||
#}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_USER_LOGOUT }}">Logout</a>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<a class="{{ model.FLAG_NAV_USER_LOGIN }}">Login</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Body -->
|
||||
<div id="{{ model.ID_PAGE_BODY }}">
|
||||
{% block page_body %}{% endblock %}
|
||||
|
||||
37
templates/pages/core/_admin_home.html
Normal file
37
templates/pages/core/_admin_home.html
Normal file
@@ -0,0 +1,37 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block title %}{{ model.title }}{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_admin_home.bundle.css') }}">
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_ROW }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
|
||||
<h2>Store</h2>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_CATEGORIES }}">Product Categories</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCTS }}">Products</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_PERMUTATIONS }}">Product Permutations</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_STOCK_ITEMS }}">Product Stock</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_VARIATIONS }}">Product Variations</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_MANUFACTURING_PURCHASE_ORDERS }}">Manufacturing Purchase Orders</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_SUPPLIERS }}">Suppliers</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_SUPPLIER_PURCHASE_ORDERS }}">Supplier Purchase Orders</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,77 +0,0 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_contact.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{#
|
||||
<a href="#command">Command</a>
|
||||
<a href="#contact-details">Contact Details</a>
|
||||
#}
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
|
||||
{% set form = model.form_contact %}
|
||||
<section class="contact-section">
|
||||
<div class="command">
|
||||
<h1>Contact Us</h1>
|
||||
<p>Please fill in the form below and we'll get back to you as soon as possible.</p>
|
||||
|
||||
<form id="{{ model.ID_COMMAND }}" method="POST" action="{{ model.HASH_POST_COMMAND }}">
|
||||
{{ form.csrf_token }}
|
||||
|
||||
<div class="form-grid">
|
||||
<label class="form-label" for="{{ form.email.id }}">{{ form.email.label.text }} *</label>
|
||||
<div>
|
||||
{{ form.email(class="form-input", required=True) }}
|
||||
</div>
|
||||
|
||||
<label class="form-label" for="{{ form.contact_name.id }}">{{ form.contact_name.label.text }} *</label>
|
||||
<div>
|
||||
{{ form.contact_name(class="form-input", required=True) }}
|
||||
</div>
|
||||
|
||||
<label class="form-label" for="{{ form.company_name.id }}">{{ form.company_name.label.text }} *</label>
|
||||
<div>
|
||||
{{ form.company_name(class="form-input", required=True) }}
|
||||
</div>
|
||||
|
||||
<label class="form-label" for="{{ form.message.id }}">{{ form.message.label.text }} *</label>
|
||||
<div>
|
||||
{{ form.message(class="form-input", required=True) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="{{ model.FLAG_CONTAINER_CHECKBOX }} {{ model.FLAG_RECEIVE_MARKETING }} marketing-consent">
|
||||
{{ model.form_contact.receive_marketing() }}
|
||||
{{ model.form_contact.receive_marketing.label }}
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_CAPTCHA }}">
|
||||
<div>
|
||||
{{ form.altcha.label }}
|
||||
<altcha-widget
|
||||
class="altcha-widget"
|
||||
challengeurl="{{ model.HASH_GET_ALTCHA_CHALLENGE }}"
|
||||
auto="onload"
|
||||
id="{{ form.altcha.id }}"
|
||||
name="{{ form.altcha.name }}"
|
||||
></altcha-widget>
|
||||
</div>
|
||||
<p>This CAPTCHA mechanism is fully GDPR-compliant with no cookies, no fingerprinting, no tracking, and runs in the background so you don't need to do anything!</p>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER_INPUT }}">
|
||||
{{ model.form_contact.submit() }}
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="data-notice">
|
||||
<h3>How we use your information</h3>
|
||||
<p>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.</p>
|
||||
<p>We retain command 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 <a href="{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}">data retention schedule</a>.</p>
|
||||
<p>For full details about how we handle your personal data, please read our <a href="{{ model.HASH_PAGE_PRIVACY_POLICY }}">Privacy Policy</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
@@ -1,22 +0,0 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_contact.bundle.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
|
||||
{% set form = model.form_contact %}
|
||||
<section class="contact-section">
|
||||
<div class="command">
|
||||
<h1>Message Received</h1>
|
||||
<p>Thanks for contacting us! We've received your message and will respond within 48 hours.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
{% endblock %}
|
||||
@@ -2,118 +2,12 @@
|
||||
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_home.bundle.css') }}">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.css">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
<a href="#services">Services</a>
|
||||
<a href="#testimonial">Testimonial</a>
|
||||
<a href="#pricing">Pricing</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<div class="hero-content" data-aos="fade-up">
|
||||
<h1>Transform Your Business with Modern ERP Solutions</h1>
|
||||
<p>UK-based ERPNext specialist providing integrated ERP and e-commerce solutions. 5+ years experience implementing systems for builders merchants and automotive companies.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Book Consultation</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_home.bundle.css') }}">
|
||||
|
||||
<section id="services" class="services">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Our Services</h2>
|
||||
<p class="section-subtitle text-center">Comprehensive ERP solutions tailored to your business needs</p>
|
||||
|
||||
<div class="services-grid">
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="100">
|
||||
<h3>Implementation Services</h3>
|
||||
<p>Full ERPNext implementation including setup, configuration, and training. We ensure a smooth transition to your new ERP system.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="200">
|
||||
<h3>Integration & Migration</h3>
|
||||
<p>Seamlessly migrate your existing data and integrate ERPNext with your current business applications and workflows.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="300">
|
||||
<h3>Hosting Services</h3>
|
||||
<p>Secure, reliable cloud hosting with regular backups and maintenance to keep your ERP system running smoothly.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="400">
|
||||
<h3>Custom Extensions</h3>
|
||||
<p>Tailored app development and customizations to extend ERPNext functionality according to your specific requirements.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{#
|
||||
<section id="testimonial" class="testimonial">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Client Success Story</h2>
|
||||
<p class="section-subtitle text-center">See how we've helped other businesses succeed</p>
|
||||
|
||||
<div class="testimonial-card" data-aos="fade-up">
|
||||
<p>"The ERPNext implementation has revolutionized our operations. The integrated e-commerce system has streamlined our entire sales process, and the team's support has been exceptional throughout our journey."</p>
|
||||
<p><strong>- 4 Shires Builders Merchants</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
#}
|
||||
|
||||
<section id="pricing" class="pricing">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Simple, Transparent Pricing</h2>
|
||||
<p class="section-subtitle text-center">Enterprise-grade solutions at SMB-friendly prices</p>
|
||||
|
||||
<div class="pricing-card" data-aos="fade-up">
|
||||
<h3>Implementation</h3>
|
||||
<div class="price">From £10,000</div>
|
||||
<p>One-time setup fee based on business size</p>
|
||||
<ul style="list-style: none; margin: 2rem 0;">
|
||||
<li>✓ Full ERP & e-commerce setup</li>
|
||||
<li>✓ Product catalogue configuration</li>
|
||||
<li>✓ Staff training</li>
|
||||
<li>✓ Data migration</li>
|
||||
</ul>
|
||||
|
||||
<h3>Monthly Support & Hosting</h3>
|
||||
<div class="price">£200</div>
|
||||
<p>12-month minimum term, billed annually at £2,400</p>
|
||||
<ul style="list-style: none; margin: 2rem 0;">
|
||||
<li>✓ Unlimited support tickets</li>
|
||||
<li>✓ Cloud hosting (99.9% uptime)</li>
|
||||
<li>✓ Regular maintenance and system updates</li>
|
||||
</ul>
|
||||
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Get Custom Quote</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="cta">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Ready to Transform Your Business?</h2>
|
||||
<p class="section-subtitle">Contact us today to discuss your ERP needs</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Book Consultation</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CDN -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
AOS.init({
|
||||
duration: 1000,
|
||||
once: true
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<div class="home-hero">
|
||||
<h2 class="home-hero-title">We make websites, web apps, and desktop software</h2>
|
||||
{% set block_id = 'button_get_in_touch' %}
|
||||
{% include 'components/common/buttons/_buttons_save_cancel.html' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
119
templates/pages/core/_home_portfolio.html
Normal file
119
templates/pages/core/_home_portfolio.html
Normal file
@@ -0,0 +1,119 @@
|
||||
<!-- v2a -->
|
||||
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_head %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_home.bundle.css') }}">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.css">
|
||||
{% endblock %}
|
||||
|
||||
{% block page_nav_links %}
|
||||
<a href="#services">Services</a>
|
||||
<a href="#testimonial">Testimonial</a>
|
||||
<a href="#pricing">Pricing</a>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Contact Us</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<section class="hero">
|
||||
<div class="container">
|
||||
<div class="hero-content" data-aos="fade-up">
|
||||
<h1>Transform Your Business with Modern ERP Solutions</h1>
|
||||
<p>UK-based ERPNext specialist providing integrated ERP and e-commerce solutions. 5+ years experience implementing systems for builders merchants and automotive companies.</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Book Consultation</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="services" class="services">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Our Services</h2>
|
||||
<p class="section-subtitle text-center">Comprehensive ERP solutions tailored to your business needs</p>
|
||||
|
||||
<div class="services-grid">
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="100">
|
||||
<h3>Implementation Services</h3>
|
||||
<p>Full ERPNext implementation including setup, configuration, and training. We ensure a smooth transition to your new ERP system.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="200">
|
||||
<h3>Integration & Migration</h3>
|
||||
<p>Seamlessly migrate your existing data and integrate ERPNext with your current business applications and workflows.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="300">
|
||||
<h3>Hosting Services</h3>
|
||||
<p>Secure, reliable cloud hosting with regular backups and maintenance to keep your ERP system running smoothly.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-card" data-aos="fade-up" data-aos-delay="400">
|
||||
<h3>Custom Extensions</h3>
|
||||
<p>Tailored app development and customizations to extend ERPNext functionality according to your specific requirements.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{#
|
||||
<section id="testimonial" class="testimonial">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Client Success Story</h2>
|
||||
<p class="section-subtitle text-center">See how we've helped other businesses succeed</p>
|
||||
|
||||
<div class="testimonial-card" data-aos="fade-up">
|
||||
<p>"The ERPNext implementation has revolutionized our operations. The integrated e-commerce system has streamlined our entire sales process, and the team's support has been exceptional throughout our journey."</p>
|
||||
<p><strong>- 4 Shires Builders Merchants</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
#}
|
||||
|
||||
<section id="pricing" class="pricing">
|
||||
<div class="container">
|
||||
<h2 class="section-title text-center">Simple, Transparent Pricing</h2>
|
||||
<p class="section-subtitle text-center">Enterprise-grade solutions at SMB-friendly prices</p>
|
||||
|
||||
<div class="pricing-card" data-aos="fade-up">
|
||||
<h3>Implementation</h3>
|
||||
<div class="price">From £10,000</div>
|
||||
<p>One-time setup fee based on business size</p>
|
||||
<ul style="list-style: none; margin: 2rem 0;">
|
||||
<li>✓ Full ERP & e-commerce setup</li>
|
||||
<li>✓ Product catalogue configuration</li>
|
||||
<li>✓ Staff training</li>
|
||||
<li>✓ Data migration</li>
|
||||
</ul>
|
||||
|
||||
<h3>Monthly Support & Hosting</h3>
|
||||
<div class="price">£200</div>
|
||||
<p>12-month minimum term, billed annually at £2,400</p>
|
||||
<ul style="list-style: none; margin: 2rem 0;">
|
||||
<li>✓ Unlimited support tickets</li>
|
||||
<li>✓ Cloud hosting (99.9% uptime)</li>
|
||||
<li>✓ Regular maintenance and system updates</li>
|
||||
</ul>
|
||||
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_PRIMARY }}">Get Custom Quote</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="cta">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Ready to Transform Your Business?</h2>
|
||||
<p class="section-subtitle">Contact us today to discuss your ERP needs</p>
|
||||
<a href="{{ model.HASH_PAGE_CONTACT }}" class="{{ model.FLAG_BUTTON }} {{ model.FLAG_BUTTON_LIGHT }}">Book Consultation</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- CDN -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
AOS.init({
|
||||
duration: 1000,
|
||||
once: true
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
56
templates/pages/dog/_dog_command_links.html
Normal file
56
templates/pages/dog/_dog_command_links.html
Normal file
@@ -0,0 +1,56 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block page_body %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/dog_dog_command_link.bundle.css') }}">
|
||||
|
||||
<form id="{{ model.ID_FORM_FILTERS }}" class="{{ model.FLAG_FILTER }} {{ model.FLAG_ROW }} {{ model.FLAG_CARD }}">
|
||||
{{ model.form_filters.hidden_tag() }}
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
|
||||
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_ROW }} {{ model.FLAG_FILTER }} {{ model.FLAG_ACTIVE }}">
|
||||
{{ model.form_filters.active_only.label }}
|
||||
{{ model.form_filters.active_only() }}
|
||||
{% for error in model.form_filters.active_only.errors %}
|
||||
<p class="error">{{ error }}</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% set block_id = 'buttons_table_default' %}
|
||||
{% include 'components/common/buttons/_buttons_save_cancel.html' %}
|
||||
</form>
|
||||
|
||||
<table id="{{ model.ID_TABLE_MAIN }}" class="{{ model.FLAG_ROW }} {{ model.FLAG_CARD }} {{ model.FLAG_DOG_COMMAND_LINK }}">
|
||||
<thead>
|
||||
<tr class="{{ model.FLAG_DOG_COMMAND_LINK }}">
|
||||
<th class="{{ model.FLAG_DOG }}">Dog</th>
|
||||
<th class="{{ model.FLAG_COMMAND }}">Command</th>
|
||||
<th class="{{ model.FLAG_HAND_SIGNAL_DESCRIPTION }}">Hand Signal</th>
|
||||
<th class="{{ model.FLAG_NOTES }}">Notes</th>
|
||||
<th class="{{ model.FLAG_ACTIVE }}">
|
||||
{% set block_id = 'button_add' %}
|
||||
{% include 'components/common/buttons/_buttons_save_cancel.html' %}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set is_blank_row = False %}
|
||||
{% for link in model.dog_command_links %}
|
||||
{% include 'components/dog/_row_dog_command_link.html' %}
|
||||
{% endfor %}
|
||||
|
||||
{% set is_blank_row = True %}
|
||||
{% include 'components/dog/_row_dog_command_link.html' %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% include 'components/common/temporary/_overlay_confirm.html' %}
|
||||
{% include 'components/common/temporary/_overlay_error.html' %}
|
||||
|
||||
<script src="{{ url_for('routes_dog.scripts_section_dog') }}"></script>
|
||||
|
||||
<script>
|
||||
var flagIsNotEmpty = "{{ model.FLAG_IS_NOT_EMPTY }}";
|
||||
{#
|
||||
var accessLevels = {{ model.convert_list_objects_to_dict_json_by_attribute_key_default(model.access_levels) | tojson | safe }};
|
||||
#}
|
||||
</script>
|
||||
{% endblock %}
|
||||
37
templates/pages/dog/_home.html
Normal file
37
templates/pages/dog/_home.html
Normal file
@@ -0,0 +1,37 @@
|
||||
{% extends 'layouts/layout.html' %}
|
||||
|
||||
{% block title %}{{ model.title }}{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='dist/css/core_admin_home.bundle.css') }}">
|
||||
|
||||
<div class="{{ model.FLAG_CARD }} {{ model.FLAG_ROW }}">
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
|
||||
<h2>Store</h2>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_CATEGORIES }}">Product Categories</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCTS }}">Products</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_PERMUTATIONS }}">Product Permutations</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_STOCK_ITEMS }}">Product Stock</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_PRODUCT_VARIATIONS }}">Product Variations</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_MANUFACTURING_PURCHASE_ORDERS }}">Manufacturing Purchase Orders</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_SUPPLIERS }}">Suppliers</button>
|
||||
</div>
|
||||
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_ROW }}">
|
||||
<button class="{{ model.FLAG_NAV_STORE_SUPPLIER_PURCHASE_ORDERS }}">Supplier Purchase Orders</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user