Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6b8e129
Issues Identified and Fixed:
Altrix-One Oct 3, 2025
01f9091
Fixed Landing Page IndexError ✅
Altrix-One Oct 3, 2025
121a3ee
Demo Data and Fixes
Altrix-One Oct 3, 2025
2d199ff
Dynamic Item Groups
Altrix-One Oct 3, 2025
ce81403
Branding
Altrix-One Oct 3, 2025
5f254b0
update script
Altrix-One Oct 3, 2025
01c004f
Logos
Altrix-One Oct 4, 2025
20559ce
Update Settings
Altrix-One Oct 4, 2025
c0df0a5
Update Settings with colors
Altrix-One Oct 5, 2025
585b00c
Cleanup
Altrix-One Oct 5, 2025
e56566a
Update Footer Sections
Altrix-One Oct 5, 2025
23ed923
Fix Footer Linking
Altrix-One Oct 5, 2025
c62c7e6
Remove Hard Coded Elements
Altrix-One Oct 7, 2025
044299f
Colors now fully dynamic
Altrix-One Oct 7, 2025
49401a1
Update Final Colors
Altrix-One Oct 7, 2025
b9be480
Additional Colors added to be dynamic
Altrix-One Oct 7, 2025
ccbcc39
Update hardcoded logo in search bar modal to use dynamic logo from Li…
Altrix-One Oct 7, 2025
8e6d06c
Merge branch 'develop' into develop_cohenix
Rl0007 Oct 9, 2025
49fa60c
feat(theme): Colors now fully dynamic
Altrix-One Oct 7, 2025
8bbd2c0
feat(theme): Update Final Colors
Altrix-One Oct 7, 2025
db403e4
feat(theme): Additional Colors added to be dynamic
Altrix-One Oct 7, 2025
d21ca8c
fix(list): handle brands with no value to prevent errors
Altrix-One Oct 7, 2025
7d4ca64
Merge branch 'BuildWithHussain:develop_cohenix' into develop_cohenix
Altrix-One Oct 9, 2025
07448df
fix(demo): add manual commit comments for demo data installation and …
Altrix-One Oct 9, 2025
146bb7b
Refactor: Fixed Pre-commit issues.
Altrix-One Oct 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
607 changes: 607 additions & 0 deletions SETUP_GUIDE.md

Large diffs are not rendered by default.

960 changes: 960 additions & 0 deletions ls_shop/install_demo_data.py

Large diffs are not rendered by default.

Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
{
"actions": [],
"allow_rename": 1,
"autoname": "field:category_name",
"creation": "2025-10-03 14:20:00.000000",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"category_name",
"display_name",
"column_break_1",
"enabled",
"display_order",
"section_break_2",
"route_slug",
"item_group",
"section_break_3",
"icon",
"image"
],
"fields": [
{
"fieldname": "category_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Category Name",
"reqd": 1,
"unique": 1
},
{
"fieldname": "display_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Display Name",
"reqd": 1
},
{
"fieldname": "column_break_1",
"fieldtype": "Column Break"
},
{
"default": "1",
"fieldname": "enabled",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Enabled"
},
{
"default": "0",
"fieldname": "display_order",
"fieldtype": "Int",
"in_list_view": 1,
"label": "Display Order"
},
{
"fieldname": "section_break_2",
"fieldtype": "Section Break",
"label": "Linking"
},
{
"description": "URL slug for this category (e.g., 'engine-parts')",
"fieldname": "route_slug",
"fieldtype": "Data",
"label": "Route Slug"
},
{
"description": "Optional link to existing Item Group for filtering",
"fieldname": "item_group",
"fieldtype": "Link",
"label": "Item Group",
"options": "Item Group"
},
{
"fieldname": "section_break_3",
"fieldtype": "Section Break",
"label": "Display"
},
{
"description": "Icon name or CSS class",
"fieldname": "icon",
"fieldtype": "Data",
"label": "Icon"
},
{
"fieldname": "image",
"fieldtype": "Attach Image",
"label": "Image"
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-10-03 14:20:00.000000",
"modified_by": "Administrator",
"module": "Lifestyle Shop Ecommerce",
"name": "Ecommerce Category",
"naming_rule": "By fieldname",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
},
{
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Sales User",
"share": 1
}
],
"sort_field": "display_order",
"sort_order": "ASC",
"states": [],
"track_changes": 1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Copyright (c) 2025, Frappe Technologies and contributors
# For license information, please see license.txt

import frappe
from frappe.model.document import Document
from frappe.utils import cstr


class EcommerceCategory(Document):
def validate(self):
"""Validate before saving"""
self.validate_route_slug()
self.set_defaults()

def validate_route_slug(self):
"""Ensure route slug is unique and properly formatted"""
if not self.route_slug:
# Auto-generate from category_name
self.route_slug = frappe.scrub(self.category_name)
else:
# Clean up the slug
self.route_slug = frappe.scrub(self.route_slug)

# Check for duplicates
if self.route_slug:
duplicate = frappe.db.get_value(
"Ecommerce Category", {"route_slug": self.route_slug, "name": ["!=", self.name]}, "name"
)
if duplicate:
frappe.throw(f"Route slug '{self.route_slug}' is already used by {duplicate}")

def set_defaults(self):
"""Set default values"""
if not self.display_name:
self.display_name = self.category_name


@frappe.whitelist()
def get_active_categories():
"""Get all active categories ordered by display_order"""
return frappe.get_all(
"Ecommerce Category",
filters={"enabled": 1},
fields=[
"name",
"category_name",
"display_name",
"route_slug",
"item_group",
"icon",
"image",
"display_order",
],
order_by="display_order asc, category_name asc",
)


@frappe.whitelist()
def get_category_by_slug(slug):
"""Get category details by route slug"""
return frappe.get_all(
"Ecommerce Category",
filters={"route_slug": slug, "enabled": 1},
fields=["name", "category_name", "display_name", "route_slug", "item_group", "icon", "image"],
limit=1,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright (c) 2025, Frappe Technologies and Contributors
# See license.txt

# import frappe
from frappe.tests.utils import FrappeTestCase

# On IntegrationTestCase, the doctype test records and all
# link-field test record dependencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]


class TestEcommerceCategory(FrappeTestCase):
pass
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"actions": [],
"allow_rename": 1,
"creation": "2025-10-04 19:16:34.572019",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": ["link_label", "link_url", "link_order", "enabled"],
"fields": [
{
"fieldname": "link_label",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Link Label",
"reqd": 1
},
{
"fieldname": "link_url",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Link URL",
"reqd": 1
},
{
"default": "0",
"fieldname": "link_order",
"fieldtype": "Int",
"in_list_view": 1,
"label": "Display Order"
},
{
"default": "1",
"fieldname": "enabled",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Enabled"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2025-10-04 19:16:50.538264",
"modified_by": "Administrator",
"module": "Lifestyle Shop Ecommerce",
"name": "Footer Link",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Website Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Administrator",
"share": 1,
"write": 1
},
{
"read": 1,
"role": "All"
}
],
"row_format": "Dynamic",
"rows_threshold_for_grid_search": 20,
"sort_field": "link_order",
"sort_order": "ASC",
"states": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright (c) 2025, hussain@buildwithhussain.com and contributors
# For license information, please see license.txt

# import frappe
from frappe.model.document import Document


class FooterLink(Document):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from frappe.types import DF

enabled: DF.Check
link_label: DF.Data
link_order: DF.Int
link_url: DF.Data
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data
# end: auto-generated types

pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) 2025, hussain@buildwithhussain.com and contributors
// For license information, please see license.txt

// frappe.ui.form.on("Footer Section Config", {
// refresh(frm) {

// },
// });
Loading
Loading