Initial commit of Asset custom ui app

This commit is contained in:
Duradundi 2026-08-04 13:48:22 +05:30
commit 7d2c0d35a9
25 changed files with 1006 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.DS_Store
*.pyc
*.egg-info
*.swp
tags
node_modules
__pycache__

7
README.md Normal file
View File

@ -0,0 +1,7 @@
## Asset Lite Custom Ui
custom app for modifying UI
#### License
mit

View File

@ -0,0 +1 @@
__version__ = "0.0.1"

View File

@ -0,0 +1,64 @@
frappe.pages['modern-menu'].on_page_load = function(wrapper) {
var page = frappe.ui.make_app_page({
parent: wrapper,
title: 'Menu',
single_column: true
});
frappe.modern_menu.make(page);
}
frappe.modern_menu ={
make(page){
// Get all items from side menu
let all_pages = frappe.workspaces;
// Create the HTML
let body = ``;
body +=`<div id="modern-menu" class="widget-group">
<div class="widget-group-head">
<div class="widget-group-title"></div>
</div>
<div class="widget-group-body grid-col-3">
`;
Object.values(all_pages)
.filter((page) => (page.parent_page == ""))
.forEach((item) => {
body += `
<div
class="widget widget-shadow desk-sidebar-item standard-sidebar-item menu-widget no-click"
data-widget-name="${item.title}">
<div class="widget-head">
<a class="widget-title" href="/app/${
item.public
? frappe.router.slug(item.title)
: "private/" + frappe.router.slug(item.title)
}" >
<span class="widget-title-text">${__(item.title)}</span>
</a>
</div>
</div>
`;
})
body +=`</div></div>`
// Append it to the page
$(frappe.render_template(body,this)).appendTo(page.main);
}
}
/* <span class="widget-title-icon" item-icon=${item.icon || "folder-normal"}>
${
item.public
? frappe.utils.icon(item.icon || "folder-normal", "md")
: `<span class="indicator ${item.indicator_color}"></span>`
}
</span> */

View File

@ -0,0 +1,19 @@
{
"content": null,
"creation": "2024-09-19 14:15:13.638500",
"docstatus": 0,
"doctype": "Page",
"idx": 0,
"modified": "2024-09-20 15:37:55.472839",
"modified_by": "Administrator",
"module": "Asset Lite Custom Ui",
"name": "modern-menu",
"owner": "Administrator",
"page_name": "modern-menu",
"roles": [],
"script": null,
"standard": "Yes",
"style": null,
"system_page": 0,
"title": "Menu"
}

View File

View File

@ -0,0 +1,258 @@
app_name = "asset_lite_custom_ui"
app_title = "Asset Lite Custom Ui"
app_publisher = "SSPL"
app_description = "custom app for modifying UI"
app_email = "sonika123@gmail.com"
app_license = "mit"
app_include_css = ["/assets/asset_lite_custom_ui/css/theme.css",
"/assets/asset_lite_custom_ui/css/menu.css",]
app_include_js = ["/assets/asset_lite_custom_ui/js/theme.js",
"/assets/asset_lite_custom_ui/js/menu/router.js",
"/assets/asset_lite_custom_ui/js/menu/page.js",
"/assets/asset_lite_custom_ui/js/menu/workspace.js"]
override_whitelisted_methods = {
"frappe.core.doctype.user.user.switch_theme": "asset_lite_custom_ui.overrides.switch_theme.switch_theme"
}
# Apps
# ------------------
# required_apps = []
# Each item in the list will be shown as an app in the apps page
# add_to_apps_screen = [
# {
# "name": "asset_lite_custom_ui",
# "logo": "/assets/asset_lite_custom_ui/logo.png",
# "title": "Asset Lite Custom Ui",
# "route": "/asset_lite_custom_ui",
# "has_permission": "asset_lite_custom_ui.api.permission.has_app_permission"
# }
# ]
# Includes in <head>
# ------------------
# include js, css files in header of desk.html
# app_include_css = "/assets/asset_lite_custom_ui/css/asset_lite_custom_ui.css"
# app_include_js = "/assets/asset_lite_custom_ui/js/asset_lite_custom_ui.js"
# include js, css files in header of web template
# web_include_css = "/assets/asset_lite_custom_ui/css/asset_lite_custom_ui.css"
# web_include_js = "/assets/asset_lite_custom_ui/js/asset_lite_custom_ui.js"
# include custom scss in every website theme (without file extension ".scss")
# website_theme_scss = "asset_lite_custom_ui/public/scss/website"
# include js, css files in header of web form
# webform_include_js = {"doctype": "public/js/doctype.js"}
# webform_include_css = {"doctype": "public/css/doctype.css"}
# include js in page
# page_js = {"page" : "public/js/file.js"}
# include js in doctype views
# doctype_js = {"doctype" : "public/js/doctype.js"}
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"}
# doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"}
# Svg Icons
# ------------------
# include app icons in desk
# app_include_icons = "asset_lite_custom_ui/public/icons.svg"
# Home Pages
# ----------
# application home page (will override Website Settings)
# home_page = "login"
# website user home page (by Role)
# role_home_page = {
# "Role": "home_page"
# }
# Generators
# ----------
# automatically create page for each record of this doctype
# website_generators = ["Web Page"]
# Jinja
# ----------
# add methods and filters to jinja environment
# jinja = {
# "methods": "asset_lite_custom_ui.utils.jinja_methods",
# "filters": "asset_lite_custom_ui.utils.jinja_filters"
# }
# Installation
# ------------
# before_install = "asset_lite_custom_ui.install.before_install"
# after_install = "asset_lite_custom_ui.install.after_install"
# Uninstallation
# ------------
# before_uninstall = "asset_lite_custom_ui.uninstall.before_uninstall"
# after_uninstall = "asset_lite_custom_ui.uninstall.after_uninstall"
# Integration Setup
# ------------------
# To set up dependencies/integrations with other apps
# Name of the app being installed is passed as an argument
# before_app_install = "asset_lite_custom_ui.utils.before_app_install"
# after_app_install = "asset_lite_custom_ui.utils.after_app_install"
# Integration Cleanup
# -------------------
# To clean up dependencies/integrations with other apps
# Name of the app being uninstalled is passed as an argument
# before_app_uninstall = "asset_lite_custom_ui.utils.before_app_uninstall"
# after_app_uninstall = "asset_lite_custom_ui.utils.after_app_uninstall"
# Desk Notifications
# ------------------
# See frappe.core.notifications.get_notification_config
# notification_config = "asset_lite_custom_ui.notifications.get_notification_config"
# Permissions
# -----------
# Permissions evaluated in scripted ways
# permission_query_conditions = {
# "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions",
# }
#
# has_permission = {
# "Event": "frappe.desk.doctype.event.event.has_permission",
# }
# DocType Class
# ---------------
# Override standard doctype classes
# override_doctype_class = {
# "ToDo": "custom_app.overrides.CustomToDo"
# }
# Document Events
# ---------------
# Hook on document methods and events
# doc_events = {
# "*": {
# "on_update": "method",
# "on_cancel": "method",
# "on_trash": "method"
# }
# }
# Scheduled Tasks
# ---------------
# scheduler_events = {
# "all": [
# "asset_lite_custom_ui.tasks.all"
# ],
# "daily": [
# "asset_lite_custom_ui.tasks.daily"
# ],
# "hourly": [
# "asset_lite_custom_ui.tasks.hourly"
# ],
# "weekly": [
# "asset_lite_custom_ui.tasks.weekly"
# ],
# "monthly": [
# "asset_lite_custom_ui.tasks.monthly"
# ],
# }
# Testing
# -------
# before_tests = "asset_lite_custom_ui.install.before_tests"
# Overriding Methods
# ------------------------------
#
# override_whitelisted_methods = {
# "frappe.desk.doctype.event.event.get_events": "asset_lite_custom_ui.event.get_events"
# }
#
# each overriding function accepts a `data` argument;
# generated from the base implementation of the doctype dashboard,
# along with any modifications made in other Frappe apps
# override_doctype_dashboards = {
# "Task": "asset_lite_custom_ui.task.get_dashboard_data"
# }
# exempt linked doctypes from being automatically cancelled
#
# auto_cancel_exempted_doctypes = ["Auto Repeat"]
# Ignore links to specified DocTypes when deleting documents
# -----------------------------------------------------------
# ignore_links_on_delete = ["Communication", "ToDo"]
# Request Events
# ----------------
# before_request = ["asset_lite_custom_ui.utils.before_request"]
# after_request = ["asset_lite_custom_ui.utils.after_request"]
# Job Events
# ----------
# before_job = ["asset_lite_custom_ui.utils.before_job"]
# after_job = ["asset_lite_custom_ui.utils.after_job"]
# User Data Protection
# --------------------
# user_data_fields = [
# {
# "doctype": "{doctype_1}",
# "filter_by": "{filter_by}",
# "redact_fields": ["{field_1}", "{field_2}"],
# "partial": 1,
# },
# {
# "doctype": "{doctype_2}",
# "filter_by": "{filter_by}",
# "partial": 1,
# },
# {
# "doctype": "{doctype_3}",
# "strict": False,
# },
# {
# "doctype": "{doctype_4}"
# }
# ]
# Authentication and authorization
# --------------------------------
# auth_hooks = [
# "asset_lite_custom_ui.auth.validate"
# ]
# Automatically update python controller files with type annotations for this app.
# export_python_type_annotations = True
# default_log_clearing_doctypes = {
# "Logging DocType Name": 30 # days to retain logs
# }

View File

@ -0,0 +1 @@
Asset Lite Custom Ui

View File

@ -0,0 +1,6 @@
import frappe
@frappe.whitelist()
def switch_theme(theme):
if theme in ["Dark", "Light", "Automatic", "Modern_ui_theme"]:
frappe.db.set_value("User", frappe.session.user, "desk_theme", theme)

View File

@ -0,0 +1,6 @@
[pre_model_sync]
# Patches added in this section will be executed before doctypes are migrated
# Read docs to understand patches: https://frappeframework.com/docs/v14/user/en/database-migrations
[post_model_sync]
# Patches added in this section will be executed after doctypes are migrated

View File

View File

@ -0,0 +1,52 @@
.no-click{
cursor:default !important;
}
.hide-side-section{
display: none !important;
}
.widget.menu-widget{
background-color: #d4daf9;
margin: 20px;
}
.widget-title .widget-title-text{
font-weight: 800;
color:white !important;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7);
}
.menu-widget:hover .widget-title .widget-title-text {
color: var(--gray-100);
text-decoration: none;
}
.menu-open-btn{
margin-right: var(--margin-sm);
}
.widget.menu-widget {
background-size: cover;
background-position: center;
background-repeat: no-repeat;
padding: 20px;
color: white; /* Adjust text color if needed */
}
/* Specific background image for each module */
[data-widget-name="Asset Management"] {
background-image: url('https://i.im.ge/2024/09/19/fG0a6X.businesspeople-working-finance-accounting-analyze-financi.md.jpeg');
}
[data-widget-name="CRM"] {
background-image: url('https://i.im.ge/2024/09/19/fGi7UW.customer-relationship-management-concept.md.jpeg');
}
[data-widget-name="Buying"] {
background-image: url('https://i.im.ge/2024/09/19/fGhqI6.sumup-dkKsb9eCQS8-unsplash.md.jpeg');
}
[data-widget-name="Stock"] {
background-image: url('https://i.im.ge/2024/09/19/fGik1P.Untitled-design.md.png');
}

View File

@ -0,0 +1,340 @@
/* Works on Chrome, Edge, and Safari */
/* Taken from https://github.com/tahir-zaqout/sundae_theme/tree/master/sundae_theme/public/css */
:root{
--main-color: #271869;
--second-color: #271869;
--third-color: #271869;
--widget-bg: rgb(255, 255, 255) ;
}
[data-theme=modern_ui_theme]{
--primary: var(--main-color);
--dt-primary-color: var(--main-color);
--blue-avatar-bg: var(--main-color);
--blue-avatar-color: var(--main-color);
--blue: var(--main-color)
}
[data-theme=modern_ui_theme] .page-container,
[data-theme=modern_ui_theme] .layout-main-section {
background-color: white;
}
[data-theme=modern_ui_theme] ul li a:hover {
background-color: var(--second-color);
color: #fff;
}
/* Main */
[data-theme=modern_ui_theme] body {
font-size: 14px;
background-color: #f3f6f9;
}
[data-theme=modern_ui_theme]a {
color: #666;
font-weight: 500;
}
[data-theme=modern_ui_theme] .small, small {
font-size: 95%;
}
[data-theme=modern_ui_theme] .h6.uppercase, h6.uppercase {
font-weight: 600;
font-size: 11.5px;
}
/* Navigation Bar */
[data-theme=modern_ui_theme] .standard-sidebar-item.selected{
background: var(--main-color);
}
[data-theme=modern_ui_theme] .standard-sidebar-item.selected a{
color: #fff;
}
[data-theme=modern_ui_theme] .standard-sidebar-item.selected a svg{
fill: #fff;
}
[data-theme=modern_ui_theme] .standard-sidebar-item:hover{
background-color: var(--second-color);
}
[data-theme=modern_ui_theme] .standard-sidebar-item:hover a,
[data-theme=modern_ui_theme] .standard-sidebar-item:hover svg{
color: #fff;
fill: #fff;
}
[data-theme=modern_ui_theme] .navbar {
background: var(--main-color);
border: none !important;
}
[data-theme=modern_ui_theme] .navbar-nav>li>a{
color:#fff !important;
}
[data-theme=modern_ui_theme] .navbar-nav>li>a:hover{
color:#ddd !important;
}
[data-theme=modern_ui_theme] .navbar-brand:hover {
color:#ddd !important;
}
/* Widgets */
[data-theme=modern_ui_theme] .widget {
background-color: var(--widget-bg);
border: none;
box-shadow: 0px 3px 12px 0px var(--widget-bg), 0 3px 3px -2px #461a7714;
}
[data-theme=modern_ui_theme] .widget.shortcut-widget-box .widget-head .widget-title i {
color: var(--third-color);
}
[data-theme=modern_ui_theme] .widget.shortcut-widget-box .widget-head .widget-title:hover span{
color: var(--main-color);
}
[data-theme=modern_ui_theme] .widget-body .link-item:hover{
color: #fff;
background: var(--third-color);
}
/* Sidebar */
[data-theme=modern_ui_theme] .desk-sidebar .desk-sidebar-item {
font-size: 13px;
font-weight: 600;
color: var(--widget-bg);
}
[data-theme=modern_ui_theme] .layout-side-section {
font-size: 14px;
}
[data-theme=modern_ui_theme] .uppercase {
color:var(--third-color);
}
/* Dropdowns */
[data-theme=modern_ui_theme] .dropdown-menu>li>a {
font-size: 13px;
color:#666;
font-weight: 500;
}
[data-theme=modern_ui_theme] .awesomplete > ul > li[aria-selected=true]{
background-color: transparent;
}
[data-theme=modern_ui_theme] .awesomplete > ul > li:hover{
background: linear-gradient(to right, var(--main-color), var(--second-color));
}
[data-theme=modern_ui_theme] .awesomplete > ul > li:hover a{
color: #fff;
}
/* Page Heading */
[data-theme=modern_ui_theme] .page-head {
border-bottom: none !important;
box-shadow: 0 1px 10px 1px rgba(115, 108, 203, 0.1);
}
[data-theme=modern_ui_theme] .page-title .title-text {
color: var(--third-color);
font-size: 22px;
}
[data-theme=modern_ui_theme] .widget .widget-head .widget-title,
[data-theme=modern_ui_theme] .section-head,
[data-theme=modern_ui_theme] .comment-input-header {
font-size: 14px;
color: var(--third-color);
}
/*Main Section */
[data-theme=modern_ui_theme] .list-row-head {
background-color: #f3f6f9;
border-bottom: 1px solid #e4e4e4 !important;
}
/* Buttons */
[data-theme=modern_ui_theme] .btn-primary {
background-color: var(--main-color);
border-color: var(--main-color);
}
[data-theme=modern_ui_theme] .control-label, .grid-heading-row {
font-size:13px;
}
[data-theme=modern_ui_theme] .btn-default:hover,
[data-theme=modern_ui_theme] .btn-default:focus, .btn-default.focus,
[data-theme=modern_ui_theme] .btn-default:active, .btn-default.active,
[data-theme=modern_ui_theme] .open > .dropdown-toggle.btn-default {
background-color: var(--third-color) !important;
color: #fff !important;
}
[data-theme=modern_ui_theme] .btn-default:hover svg{
stroke: #fff !important;
fill: #fff !important;
color: #fff !important;
}
[data-theme=modern_ui_theme] .btn-primary:hover,
[data-theme=modern_ui_theme] .btn-primary:focus, .btn-primary.focus,
[data-theme=modern_ui_theme] .btn-primary:active, .btn-primary.active,
[data-theme=modern_ui_theme] .open > .dropdown-toggle.btn-primary {
background-color: var(--main-color) !important;
border-color: var(--main-color) !important;
}
[data-theme=modern_ui_theme] .btn-secondary,
[data-theme=modern_ui_theme] .btn-secondary:focus, .btn-secondary.focus,
[data-theme=modern_ui_theme] .btn-secondary:active, .btn-secondary.active,
[data-theme=modern_ui_theme] .open > .dropdown-toggle.btn-secondary {
background-color: var(--third-color);
color: #fff;
}
[data-theme=modern_ui_theme] .btn-secondary:hover{
background-color: var(--main-color);
color: #fff;
}
[data-theme=modern_ui_theme] .indicator-right.blue:after, .indicator.blue:before {
background: var(--third-color);
}
/*Other Components*/
[data-theme=modern_ui_theme] input[type=checkbox]:checked:before {
color: var(--third-color);
}
[data-theme=modern_ui_theme] input[type=checkbox]:checked{
background: var(--main-color);
}
[data-theme=modern_ui_theme] .frappe-control .ql-editor:not(.read-mode){
background: var(--widget-bg);
}
[data-theme=modern_ui_theme] .input-with-feedback,
[data-theme=modern_ui_theme] .like-disabled-input{
background-color: #e8eafcad;
}
[data-theme=modern_ui_theme] .document-link-badge span{
background-color: var(--main-color) !important;
color: #fff;
}
[data-theme=modern_ui_theme] .document-link-badge{
background-color: var(--widget-bg)!important;
}
[data-theme=modern_ui_theme] .document-link button{
background: var(--third-color) !important;
color: #fff !important;
}
[data-theme=modern_ui_theme] .document-link button svg{
fill: white;
stroke: white;
}
[data-theme=modern_ui_theme] .indicator-pill.gray,
[data-theme=modern_ui_theme] .indicator-pill-right.gray,
[data-theme=modern_ui_theme] .indicator-pill-round.gray {
background: var(--third-color);
color: #fff;
}
[data-theme=modern_ui_theme] .indicator-pill.green,
[data-theme=modern_ui_theme] .indicator-pill-right.green,
[data-theme=modern_ui_theme] .indicator-pill-round.green {
color: var(--main-color);
}
[data-theme=modern_ui_theme] .notifications-icon svg{
stroke: #fff;
fill: #fff;
}
[data-theme=modern_ui_theme] #page-Workspaces .page-head{
background: var(--widget-bg);
}
[data-theme=modern_ui_theme] .notifications-unseen use[href="#es-line-notifications-unseen"] {
display: none;
}
[data-theme=modern_ui_theme] .notifications-seen use[href="#es-line-notifications"] {
display: none;
}
[data-theme=modern_ui_theme] .notifications-unseen {
width: 24px;
height: 24px;
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2264px%22%20height%3D%2264px%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20id%3D%22SVGRepo_bgCarrier%22%20stroke-width%3D%220%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_tracerCarrier%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_iconCarrier%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M9.29664%204.72727V5.25342C6.60683%206.35644%204.7276%209.97935%204.79579%2013.1192L4.79577%2014.8631C3.4188%2016.6333%203.49982%2019.2727%206.93518%2019.2727H9.29664C9.29664%2019.996%209.57852%2020.6897%2010.0803%2021.2012C10.582%2021.7127%2011.2625%2022%2011.9721%2022C12.6817%2022%2013.3622%2021.7127%2013.8639%2021.2012C14.3656%2020.6897%2014.6475%2019.996%2014.6475%2019.2727H17.0155C20.4443%2019.2727%2020.494%2016.6278%2019.1172%2014.8576L19.1555%2013.1216C19.2248%209.97811%2017.3419%206.35194%2014.6475%205.25049V4.72727C14.6475%204.00395%2014.3656%203.31026%2013.8639%202.7988C13.3622%202.28734%2012.6817%202%2011.9721%202C11.2625%202%2010.582%202.28734%2010.0803%202.7988C9.57852%203.31026%209.29664%204.00395%209.29664%204.72727ZM12.8639%204.72727C12.8639%204.72727%2012.8633%204.76414%2012.8622%204.78246C12.5718%204.74603%2012.2759%204.72727%2011.9757%204.72727C11.673%204.72727%2011.3747%204.74634%2011.082%204.78335C11.0808%204.76474%2011.0803%204.74603%2011.0803%204.72727C11.0803%204.48617%2011.1742%204.25494%2011.3415%204.08445C11.5087%203.91396%2011.7356%203.81818%2011.9721%203.81818C12.2086%203.81818%2012.4354%203.91396%2012.6027%204.08445C12.7699%204.25494%2012.8639%204.48617%2012.8639%204.72727ZM11.0803%2019.2727C11.0803%2019.5138%2011.1742%2019.7451%2011.3415%2019.9156C11.5087%2020.086%2011.7356%2020.1818%2011.9721%2020.1818C12.2086%2020.1818%2012.4354%2020.086%2012.6027%2019.9156C12.7699%2019.7451%2012.8639%2019.5138%2012.8639%2019.2727H11.0803ZM17.0155%2017.4545C17.7774%2017.4545%2018.1884%2016.5435%2017.6926%2015.9538C17.4516%2015.6673%2017.3233%2015.3028%2017.3316%2014.9286L17.3723%2013.0808C17.4404%209.99416%2015.0044%206.54545%2011.9757%206.54545C8.94765%206.54545%206.51196%209.99301%206.57898%2013.0789L6.61916%2014.9289C6.62729%2015.303%206.49893%2015.6674%206.25806%2015.9538C5.76221%2016.5435%206.17325%2017.4545%206.93518%2017.4545H17.0155ZM16.9799%203.20202C17.2945%202.74813%2017.9176%202.63524%2018.3715%202.94988C19.5192%203.74546%2020.8956%205.65348%2021.6471%207.9126C21.8214%208.43664%2021.5379%209.00279%2021.0139%209.17712C20.4898%209.35145%2019.9237%209.06795%2019.7493%208.5439C19.0892%206.55949%2017.9221%205.07189%2017.2321%204.59358C16.7782%204.27894%2016.6653%203.65592%2016.9799%203.20202ZM5.4303%202.94988C5.8842%202.63524%206.50722%202.74813%206.82185%203.20202C7.13649%203.65592%207.0236%204.27894%206.56971%204.59358C5.87969%205.07189%204.71256%206.55949%204.05242%208.5439C3.87809%209.06795%203.31194%209.35145%202.78789%209.17712C2.26384%209.00279%201.98034%208.43664%202.15467%207.9126C2.90619%205.65348%204.2826%203.74546%205.4303%202.94988Z%22%20fill%3D%22%23ffffff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");
background-size: 22px 20px;
background-repeat: no-repeat;
background-position: center;
}
[data-theme=modern_ui_theme] .notifications-seen {
width: 24px;
height: 24px;
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2264px%22%20height%3D%2264px%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20id%3D%22SVGRepo_bgCarrier%22%20stroke-width%3D%220%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_tracerCarrier%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_iconCarrier%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M9.33497%204.72727V5.25342C6.64516%206.35644%204.76592%209.97935%204.83412%2013.1192L4.83409%2014.8631C3.45713%2016.6333%203.53815%2019.2727%206.9735%2019.2727H9.33497C9.33497%2019.996%209.61684%2020.6897%2010.1186%2021.2012C10.6203%2021.7127%2011.3008%2022%2012.0104%2022C12.72%2022%2013.4005%2021.7127%2013.9022%2021.2012C14.404%2020.6897%2014.6858%2019.996%2014.6858%2019.2727H17.0538C20.4826%2019.2727%2020.5323%2016.6278%2019.1555%2014.8576L19.1938%2013.1216C19.2631%209.97811%2017.3803%206.35194%2014.6858%205.25049V4.72727C14.6858%204.00396%2014.404%203.31026%2013.9022%202.7988C13.4005%202.28734%2012.72%202%2012.0104%202C11.3008%202%2010.6203%202.28734%2010.1186%202.7988C9.61684%203.31026%209.33497%204.00395%209.33497%204.72727ZM12.9022%204.72727C12.9022%204.74573%2012.9017%204.76414%2012.9006%204.78246C12.6101%204.74603%2012.3142%204.72727%2012.014%204.72727C11.7113%204.72727%2011.413%204.74634%2011.1203%204.78335C11.1192%204.76474%2011.1186%204.74603%2011.1186%204.72727C11.1186%204.48617%2011.2126%204.25494%2011.3798%204.08445C11.547%203.91396%2011.7739%203.81818%2012.0104%203.81818C12.2469%203.81818%2012.4738%203.91396%2012.641%204.08445C12.8083%204.25494%2012.9022%204.48617%2012.9022%204.72727ZM11.1186%2019.2727C11.1186%2019.5138%2011.2126%2019.7451%2011.3798%2019.9156C11.547%2020.086%2011.7739%2020.1818%2012.0104%2020.1818C12.2469%2020.1818%2012.4738%2020.086%2012.641%2019.9156C12.8083%2019.7451%2012.9022%2019.5138%2012.9022%2019.2727H11.1186ZM17.0538%2017.4545C17.8157%2017.4545%2018.2267%2016.5435%2017.7309%2015.9538C17.49%2015.6673%2017.3616%2015.3028%2017.3699%2014.9286L17.4106%2013.0808C17.4787%209.99416%2015.0427%206.54545%2012.014%206.54545C8.98598%206.54545%206.55028%209.99301%206.61731%2013.0789L6.65748%2014.9289C6.66561%2015.303%206.53726%2015.6674%206.29639%2015.9538C5.80054%2016.5435%206.21158%2017.4545%206.9735%2017.4545H17.0538Z%22%20fill%3D%22%23ffffff%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");
background-size: 22px 20px;
background-repeat: no-repeat;
background-position: center;
}
/* [data-theme=modern_ui_theme] .icon use[href="#icon-add"] {
display: none;
} */
[data-theme=modern_ui_theme] .btn-new .icon, .chart-menu {
/* width: 16px;
height: 16px;
background-image: url("data:image/svg+xml,%3Csvg%20width%3D%2240px%22%20height%3D%2240px%22%20viewBox%3D%220%200%2024%2024%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22%23000000%22%3E%3Cg%20id%3D%22SVGRepo_bgCarrier%22%20stroke-width%3D%220%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_tracerCarrier%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3C%2Fg%3E%3Cg%20id%3D%22SVGRepo_iconCarrier%22%3E%3Ctitle%3E%3C%2Ftitle%3E%3Cg%20id%3D%22Complete%22%3E%3Cg%20data-name%3D%22add%22%20id%3D%22add-2%22%3E%3Cg%3E%3Cline%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20x1%3D%2212%22%20x2%3D%2212%22%20y1%3D%2219%22%20y2%3D%225%22%2F%3E%3Cline%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20x1%3D%225%22%20x2%3D%2219%22%20y1%3D%2212%22%20y2%3D%2212%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");
background-size: 22px 22px;
background-repeat: no-repeat;
background-position: center; */
--icon-fill: white;
--icon-stroke: white;
}
[data-theme=modern_ui_theme] .btn-default:hover {
--icon-fill: white;
--icon-stroke: white;
}
[data-theme=modern_ui_theme] .widget.links-widget-box .link-item .link-content:hover{
color:white;
}
[data-theme=modern_ui_theme] .nav-item .nav-link:hover{
color:white !important
}
[data-theme=modern_ui_theme] .btn-reset.nav-link span {
color: white; /* Change text color to white on hover */
transition: color 0.3s ease; /* Optional: Smooth transition */
}
[data-theme=modern_ui_theme] .dashboard-graph .widget-group .grid-col-2 {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
column-gap: 8px;
row-gap: 15px;
align-items: center;
}
[data-theme=modern_ui_theme] .dashboard-graph .widget-group .grid-col-2 .full-width {
grid-column-start: 1;
grid-column-end: 5;
}
[data-theme=modern_ui_theme] .dashboard-graph .widget-group {
font-size: 8px;
letter-spacing: 0.01em;
}
[data-theme=modern_ui_theme] .dashboard-graph .legend-dataset-label {
font-size: 12px;
}
[data-theme=modern_ui_theme] .dashboard-graph .legend-dataset-value {
font-size: 12px;
}
/* Target frappe charts but exclude those in full-width widgets */
[data-theme=modern_ui_theme] .dashboard-graph .dashboard-widget-box:not(.full-width) .frappe-chart.chart {
height: 350px;
}
/*Profile Icon Colour */
[data-theme=modern_ui_theme] .avatar-frame.standard-image {
background-color: var(--dark-green-avatar-bg) !important;
color: var(--dark-green-avatar-color) !important;
}

View File

@ -0,0 +1,112 @@
frappe.templates["page"] = `
<div class="page-head flex">
<div class="container">
<div class="row flex align-center page-head-content justify-between">
<div class="col-md-4 col-sm-6 col-xs-7 page-title">
<!-- <div class="title-image hide hidden-md hidden-lg"></div> -->
<!-- title -->
<button class="btn-reset sidebar-toggle-btn">
<svg class="es-icon icon-md sidebar-toggle-placeholder">
<use href="#es-line-align-justify"></use>
</svg>
<span class="sidebar-toggle-icon">
<svg class="es-icon icon-md">
<use href="#es-line-sidebar-collapse">
</use>
</svg>
</span>
</button>
<button class="btn-reset menu-open-btn hide-side-section">
<svg class="es-icon icon-md sidebar-toggle-placeholder">
<use href="#es-line-align-justify"></use>
</svg>
</button>
<div class="flex fill-width title-area">
<div>
<div class="flex">
<h3 class="ellipsis title-text"></h3>
<span class="indicator-pill whitespace-nowrap"></span>
</div>
<div class="ellipsis sub-heading hide text-muted"></div>
</div>
<button class="btn btn-default more-button hide">
<svg class="icon icon-sm">
<use href="#icon-dot-horizontal">
</use>
</svg>
</button>
</div>
</div>
<div class="flex col page-actions justify-content-end">
<!-- buttons -->
<div class="custom-actions hide hidden-xs hidden-md"></div>
<div class="standard-actions flex">
<span class="page-icon-group hide hidden-xs hidden-sm"></span>
<div class="menu-btn-group hide">
<button type="button" class="btn btn-default icon-btn" data-toggle="dropdown" aria-expanded="false" aria-label="{{ __("Menu") }}">
<span>
<span class="menu-btn-group-label">
<svg class="icon icon-sm">
<use href="#icon-dot-horizontal">
</use>
</svg>
</span>
</span>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="menu"></ul>
</div>
<button class="btn btn-secondary btn-default btn-sm hide"></button>
<div class="actions-btn-group hide">
<button type="button" class="btn btn-primary btn-sm" data-toggle="dropdown" aria-expanded="false">
<span>
<span class="hidden-xs actions-btn-group-label">{%= __("Actions") %}</span>
<svg class="icon icon-xs">
<use href="#icon-select">
</use>
</svg>
</span>
</button>
<ul class="dropdown-menu dropdown-menu-right" role="menu">
</ul>
</div>
<button class="btn btn-primary btn-sm hide primary-action"></button>
</div>
</div>
</div>
</div>
</div>
<div class="container page-body">
<div class="page-toolbar hide">
<div class="container">
</div>
</div>
<div class="page-wrapper">
<div class="page-content">
<div class="workflow-button-area btn-group pull-right hide"></div>
<div class="clearfix"></div>
</div>
</div>
</div>
`;
frappe.ui.Page = class CustomPage extends frappe.ui.Page {
constructor(opts) {
super(opts);
}
make() {
// Call parent's make and setup whatever it must
super.make();
// As an extra add our menu button action
this.setup_menupage_view();
}
setup_menupage_view() {
let menupage_view = $(".page-head").find(".menu-open-btn");
menupage_view.click(() => {
frappe.set_route(['app', 'modern-menu']);
window.location.reload();
});
}
}

View File

@ -0,0 +1,8 @@
frappe.router.render = function () {
if (this.current_route[0]) {
this.render_page();
} else {
// Show our menu page
frappe.set_route(['app', 'modern-menu']);
}
}

View File

@ -0,0 +1,50 @@
frappe.views.Workspace = class CustomWorkspace extends frappe.views.Workspace {
constructor(wrapper) {
super(wrapper);
}
show() {
// hide side bar for particular view
if (frappe.router?.current_route &&
frappe.router.current_route.length > 1 &&
frappe.router.current_route[0].toLowerCase() === "workspaces") {
// side bar
let elements = document.querySelectorAll('.layout-side-section');
elements.forEach(element => {
if (element) element.classList.add('hide-side-section');
});
// Toggle button
let elements2 = document.querySelectorAll('div[data-page-route]:not([data-page-route="menu"]) .sidebar-toggle-btn');
elements2.forEach(element2 => {
if (element2) element2.classList.add('hide-side-section');
});
// button to navigate to menu
let elements3 = document.querySelectorAll('div[data-page-route]:not([data-page-route="menu"]) .menu-open-btn');
elements3.forEach(element3 => {
if (element3) element3.classList.remove('hide-side-section');
});
} else {
// side bar
let elements = document.querySelectorAll('.layout-side-section');
elements.forEach(element => {
if (element) element.classList.remove('hide-side-section');
});
// Toggle button
let elements2 = document.querySelectorAll('div[data-page-route]:not([data-page-route="menu"]) .sidebar-toggle-btn');
elements2.forEach(element2 => {
if (element2) element2.classList.remove('hide-side-section');
});
// button to navigate to menu
let elements3 = document.querySelectorAll('div[data-page-route]:not([data-page-route="menu"]) .menu-open-btn');
elements3.forEach(element3 => {
if (element3) element3.classList.add('hide-side-section');
});
}
// call the parent's show
super.show();
}
}

View File

@ -0,0 +1,34 @@
frappe.ui.ThemeSwitcher = class CustomThemeSwitcher extends frappe.ui.ThemeSwitcher {
constructor() {
super()
}
fetch_themes() {
return new Promise((resolve) => {
this.themes = [
{
name: "light",
label: ("Frappe Light"),
info: ("Light Theme"),
},
{
name: "dark",
label: "Timeless Night",
info: "Dark Theme",
},
{
name: "modern_ui_theme",
label: "Modern Desk UI",
info: "The theme I copied from github"
},
{
name: "automatic",
label: "Automatic",
info: "Uses system's theme to switch between light and dark mode",
}
];
resolve(this.themes);
});
}
}

21
license.txt Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

20
pyproject.toml Normal file
View File

@ -0,0 +1,20 @@
[project]
name = "asset_lite_custom_ui"
authors = [
{ name = "SSPL", email = "sonika123@gmail.com"}
]
description = "custom app for modifying UI"
requires-python = ">=3.10"
readme = "README.md"
dynamic = ["version"]
dependencies = [
# "frappe~=15.0.0" # Installed and managed by bench.
]
[build-system]
requires = ["flit_core >=3.4,<4"]
build-backend = "flit_core.buildapi"
# These dependencies are only installed when developer mode is enabled
[tool.bench.dev-dependencies]
# package_name = "~=1.1.0"