├── .gitignore ├── MANIFEST.in ├── README.md ├── business_theme_v14 ├── __init__.py ├── business_theme_v14 │ └── __init__.py ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── hooks.py ├── modules.txt ├── patches.txt ├── public │ ├── .gitkeep │ └── css │ │ └── business_theme_v14.css └── templates │ ├── __init__.py │ └── pages │ └── __init__.py ├── license.txt ├── requirements.txt └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | business_theme_v14/docs/current -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include business_theme_v14 *.css 8 | recursive-include business_theme_v14 *.csv 9 | recursive-include business_theme_v14 *.html 10 | recursive-include business_theme_v14 *.ico 11 | recursive-include business_theme_v14 *.js 12 | recursive-include business_theme_v14 *.json 13 | recursive-include business_theme_v14 *.md 14 | recursive-include business_theme_v14 *.png 15 | recursive-include business_theme_v14 *.py 16 | recursive-include business_theme_v14 *.svg 17 | recursive-include business_theme_v14 *.txt 18 | recursive-exclude business_theme_v14 *.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Business Theme V14 2 | 3 | Business Theme for ERPNext / Frappe 4 | 5 | ### FrappeCloud Link 6 | https://frappecloud.com/marketplace/apps/business_theme_v14 7 | 8 | ### To install this theme on dedicated servers 9 | 10 | bench get-app https://github.com/Midocean-Technologies/business_theme_v14.git 11 | 12 | bench --site (sitename) install-app business_theme_v14 13 | 14 | bench clear-cache 15 | 16 | 17 | ### To uninstall this theme 18 | 19 | bench --site (sitename) uninstall-app business_theme_v14 20 | 21 | Screenshot 2022-06-26 at 2 02 45 PM 22 | Screenshot 2022-06-26 at 2 02 28 PM 23 | Screenshot 2022-06-26 at 2 01 56 PM 24 | 25 | #### License 26 | 27 | MIT 28 | 29 | 30 | #### Contact now! for end to end Frappe/ERPNext, Odoo & Flutter Development 31 | [sagar@midocean.tech] 32 | -------------------------------------------------------------------------------- /business_theme_v14/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | __version__ = '0.0.1' 3 | 4 | -------------------------------------------------------------------------------- /business_theme_v14/business_theme_v14/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/business_theme_v14/__init__.py -------------------------------------------------------------------------------- /business_theme_v14/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/config/__init__.py -------------------------------------------------------------------------------- /business_theme_v14/config/desktop.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | def get_data(): 4 | return [ 5 | { 6 | "module_name": "Business Theme V14", 7 | "color": "grey", 8 | "icon": "octicon octicon-file-directory", 9 | "type": "module", 10 | "label": _("Business Theme V14") 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /business_theme_v14/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/business_theme_v14" 6 | # headline = "App that does everything" 7 | # sub_heading = "Yes, you got that right the first time, everything" 8 | 9 | def get_context(context): 10 | context.brand_html = "Business Theme V14" 11 | -------------------------------------------------------------------------------- /business_theme_v14/hooks.py: -------------------------------------------------------------------------------- 1 | from . import __version__ as app_version 2 | 3 | app_name = "business_theme_v14" 4 | app_title = "Business Theme V14" 5 | app_publisher = "Midocean Technologies Pvt Ltd" 6 | app_description = "Business Theme for ERPNext / Frappe" 7 | app_icon = "octicon octicon-file-directory" 8 | app_color = "grey" 9 | app_email = "sagar@midocean.tech" 10 | app_license = "MIT" 11 | 12 | # Includes in 13 | # ------------------ 14 | 15 | # include js, css files in header of desk.html 16 | app_include_css = "/assets/business_theme_v14/css/business_theme_v14.css" 17 | # app_include_js = "/assets/business_theme_v14/js/business_theme_v14.js" 18 | 19 | # include js, css files in header of web template 20 | # web_include_css = "/assets/business_theme_v14/css/business_theme_v14.css" 21 | # web_include_js = "/assets/business_theme_v14/js/business_theme_v14.js" 22 | 23 | # include custom scss in every website theme (without file extension ".scss") 24 | # website_theme_scss = "business_theme_v14/public/scss/website" 25 | 26 | # include js, css files in header of web form 27 | # webform_include_js = {"doctype": "public/js/doctype.js"} 28 | # webform_include_css = {"doctype": "public/css/doctype.css"} 29 | 30 | # include js in page 31 | # page_js = {"page" : "public/js/file.js"} 32 | 33 | # include js in doctype views 34 | # doctype_js = {"doctype" : "public/js/doctype.js"} 35 | # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} 36 | # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} 37 | # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} 38 | 39 | # Home Pages 40 | # ---------- 41 | 42 | # application home page (will override Website Settings) 43 | # home_page = "login" 44 | 45 | # website user home page (by Role) 46 | # role_home_page = { 47 | # "Role": "home_page" 48 | # } 49 | 50 | # Generators 51 | # ---------- 52 | 53 | # automatically create page for each record of this doctype 54 | # website_generators = ["Web Page"] 55 | 56 | # Jinja 57 | # ---------- 58 | 59 | # add methods and filters to jinja environment 60 | # jinja = { 61 | # "methods": "business_theme_v14.utils.jinja_methods", 62 | # "filters": "business_theme_v14.utils.jinja_filters" 63 | # } 64 | 65 | # Installation 66 | # ------------ 67 | 68 | # before_install = "business_theme_v14.install.before_install" 69 | # after_install = "business_theme_v14.install.after_install" 70 | 71 | # Uninstallation 72 | # ------------ 73 | 74 | # before_uninstall = "business_theme_v14.uninstall.before_uninstall" 75 | # after_uninstall = "business_theme_v14.uninstall.after_uninstall" 76 | 77 | # Desk Notifications 78 | # ------------------ 79 | # See frappe.core.notifications.get_notification_config 80 | 81 | # notification_config = "business_theme_v14.notifications.get_notification_config" 82 | 83 | # Permissions 84 | # ----------- 85 | # Permissions evaluated in scripted ways 86 | 87 | # permission_query_conditions = { 88 | # "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", 89 | # } 90 | # 91 | # has_permission = { 92 | # "Event": "frappe.desk.doctype.event.event.has_permission", 93 | # } 94 | 95 | # DocType Class 96 | # --------------- 97 | # Override standard doctype classes 98 | 99 | # override_doctype_class = { 100 | # "ToDo": "custom_app.overrides.CustomToDo" 101 | # } 102 | 103 | # Document Events 104 | # --------------- 105 | # Hook on document methods and events 106 | 107 | # doc_events = { 108 | # "*": { 109 | # "on_update": "method", 110 | # "on_cancel": "method", 111 | # "on_trash": "method" 112 | # } 113 | # } 114 | 115 | # Scheduled Tasks 116 | # --------------- 117 | 118 | # scheduler_events = { 119 | # "all": [ 120 | # "business_theme_v14.tasks.all" 121 | # ], 122 | # "daily": [ 123 | # "business_theme_v14.tasks.daily" 124 | # ], 125 | # "hourly": [ 126 | # "business_theme_v14.tasks.hourly" 127 | # ], 128 | # "weekly": [ 129 | # "business_theme_v14.tasks.weekly" 130 | # ], 131 | # "monthly": [ 132 | # "business_theme_v14.tasks.monthly" 133 | # ], 134 | # } 135 | 136 | # Testing 137 | # ------- 138 | 139 | # before_tests = "business_theme_v14.install.before_tests" 140 | 141 | # Overriding Methods 142 | # ------------------------------ 143 | # 144 | # override_whitelisted_methods = { 145 | # "frappe.desk.doctype.event.event.get_events": "business_theme_v14.event.get_events" 146 | # } 147 | # 148 | # each overriding function accepts a `data` argument; 149 | # generated from the base implementation of the doctype dashboard, 150 | # along with any modifications made in other Frappe apps 151 | # override_doctype_dashboards = { 152 | # "Task": "business_theme_v14.task.get_dashboard_data" 153 | # } 154 | 155 | # exempt linked doctypes from being automatically cancelled 156 | # 157 | # auto_cancel_exempted_doctypes = ["Auto Repeat"] 158 | 159 | 160 | # User Data Protection 161 | # -------------------- 162 | 163 | # user_data_fields = [ 164 | # { 165 | # "doctype": "{doctype_1}", 166 | # "filter_by": "{filter_by}", 167 | # "redact_fields": ["{field_1}", "{field_2}"], 168 | # "partial": 1, 169 | # }, 170 | # { 171 | # "doctype": "{doctype_2}", 172 | # "filter_by": "{filter_by}", 173 | # "partial": 1, 174 | # }, 175 | # { 176 | # "doctype": "{doctype_3}", 177 | # "strict": False, 178 | # }, 179 | # { 180 | # "doctype": "{doctype_4}" 181 | # } 182 | # ] 183 | 184 | # Authentication and authorization 185 | # -------------------------------- 186 | 187 | # auth_hooks = [ 188 | # "business_theme_v14.auth.validate" 189 | # ] 190 | 191 | # Translation 192 | # -------------------------------- 193 | 194 | # Make link fields search translated document names for these DocTypes 195 | # Recommended only for DocTypes which have limited documents with untranslated names 196 | # For example: Role, Gender, etc. 197 | # translated_search_doctypes = [] 198 | -------------------------------------------------------------------------------- /business_theme_v14/modules.txt: -------------------------------------------------------------------------------- 1 | Business Theme V14 -------------------------------------------------------------------------------- /business_theme_v14/patches.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/patches.txt -------------------------------------------------------------------------------- /business_theme_v14/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/public/.gitkeep -------------------------------------------------------------------------------- /business_theme_v14/public/css/business_theme_v14.css: -------------------------------------------------------------------------------- 1 | /* Works on Chrome, Edge, and Safari */ 2 | *::-webkit-scrollbar { 3 | width: 6px; 4 | } 5 | *::-webkit-scrollbar-track { 6 | background: var(--scroll-bg); 7 | } 8 | *::-webkit-scrollbar-thumb { 9 | background-color: var(--scroll-color); 10 | border-radius: 20px; 11 | } 12 | * { 13 | scrollbar-width: thin; 14 | scrollbar-color: var(--scroll-color) var(--scroll-bg); 15 | } 16 | .awesomplete .input-with-feedback { 17 | border: 1px solid var(--border-color); 18 | } 19 | .form-control { 20 | border: 1px solid var(--border-color); 21 | } 22 | .search-bar .awesomplete input { 23 | background-color: var(--bg-color) 24 | } 25 | .modal-backdrop{ 26 | background-color: #2c436b !important; 27 | } 28 | .widget .widget-head .widget-title { 29 | font-size: var(--text-base); 30 | } 31 | .comment-box .comment-input-header, .form-dashboard-section .section-head, .form-section .section-head, .head-title { 32 | font-size: var(--text-base); 33 | font-weight: 600; 34 | } 35 | .comment-box .comment-input-container .ql-editor { 36 | border: 1px solid var(--border-color); 37 | } 38 | .duration-picker .duration-input { 39 | background-color: var(--bg-color); 40 | border: 1px solid var(--border-color); 41 | } 42 | .control-label { 43 | font-weight: 500; 44 | } 45 | [data-theme="dark"] { 46 | --bg-color: var(--gray-900); 47 | --disabled-control-bg: var(--gray-900); 48 | --border-color: #1c2126; 49 | --margin-lg : 15px; 50 | --text-bold: 600; 51 | --scroll-bg: #161a1f; 52 | --scroll-color: #1c2126; 53 | } 54 | 55 | [data-theme="light"] { 56 | --bg-color: #f2f5fa; 57 | --text-bold: 600; 58 | --control-bg : #fff; 59 | --control-bg-on-gray: #d4dcea; 60 | --disabled-control-bg: #f2f5fa; 61 | --heading-color: #333; 62 | --border-color:#e3e8f1; 63 | --avatar-frame-bg: #dde2ea; 64 | --margin-lg: 15px; 65 | --sidebar-select-color: #d4dcea; 66 | --awesomplete-hover-bg: #d4dcea; 67 | --scroll-bg: #eef1f5; 68 | --scroll-color: #d9dfe6; 69 | } 70 | 71 | 72 | /***** OVERRIDDEN CSS *****/ 73 | 74 | /* Heading Text Color */ 75 | /* 76 | .page-head{ 77 | background: #7C7BAD !important; 78 | background: #7C7BAD !important; 79 | } 80 | .page-container{ 81 | background: url(/web_responsive/static/src/css/../img/home-menu-bg-overlay.svg), linear-gradient(to bottom, #7C7BAD, #c3c2cc); !important; 82 | background-color: url(/web_responsive/static/src/css/../img/home-menu-bg-overlay.svg), linear-gradient(to bottom, #7C7BAD, #c3c2cc); !important; 83 | } 84 | h3.ellipsis.title-text, 85 | .widget-group .widget-group-head .widget-group-title, 86 | .layout-side-section .sidebar-label{ 87 | color: white !important; 88 | } 89 | 90 | */ 91 | /* Form Input Focus *//* 92 | 93 | input:focus{ 94 | border: 1px solid #7C7BAD !important; 95 | } 96 | .form-control:focus{ 97 | box-shadow: 0 0 0 2px rgba(94, 108, 162, 0.25) !important; 98 | } 99 | 100 | */ 101 | /* Div Padding *//* 102 | 103 | .widget.widget-shadow.shortcut-widget-box{ 104 | padding: 5px 10px; 105 | } 106 | 107 | */ 108 | /* List Design *//* 109 | 110 | .indicator-pill, .indicator-pill-right{ 111 | padding: 7px 8px; 112 | height: unset; 113 | } 114 | 115 | */ 116 | /* Collapse Div Padding *//* 117 | 118 | .section-head.collapsed{ 119 | padding: 2px 4px; 120 | } 121 | 122 | */ 123 | /* Dropdown List Hover *//* 124 | 125 | .awesomplete > ul > li:hover, .awesomplete > ul > li[aria-selected="true"]{ 126 | background-color: #a492bf; 127 | }*/ 128 | 129 | 130 | 131 | 132 | 133 | 134 | /* Global CSS */ 135 | 136 | /* Colours */ 137 | :root { 138 | --background-color: #36414c; 139 | --primary-color: #ffa00a; 140 | --secondary-color: #7574ff; 141 | --white-color: #ffffff; 142 | --black-color: #000000; 143 | --gray-color: #888; 144 | 145 | --page-head-height: 50px; 146 | --navbar-height: 50px; 147 | } 148 | .btn-primary:active, 149 | .btn-secondary:focus, 150 | .btn-secondary:active, 151 | .btn-secondary:focus{ 152 | box-shadow: none !important; 153 | } 154 | .btn-primary{ 155 | color: #fff !important; 156 | background-color: var(--primary-color) !important; 157 | border-radius: 0 !important; 158 | } 159 | .btn-primary:hover{ 160 | background-color: rgba(255, 120, 10, 0.93) !important; 161 | } 162 | /* .btn-secondary{ 163 | background-color: #606060 !important; 164 | color: var(--white-color) !important; 165 | border-radius: 0 !important; 166 | transition: background-color ease-in-out .15s; 167 | } 168 | .btn-secondary:hover{ 169 | background-color: rgba(255, 120, 10, 0.93) !important; 170 | } */ 171 | .page-head, 172 | .page-head .page-head-content{ 173 | height: var(--page-head-height); 174 | } 175 | .page-head, 176 | .page-head .page-head-content{ 177 | top: var(--page-head-height); 178 | } 179 | 180 | 181 | 182 | /* Top Header */ 183 | .navbar{ 184 | background: var(--background-color) !important; 185 | height: var(--navbar-height); 186 | } 187 | .navbar-expand{ 188 | background-color: var(--background-color); 189 | } 190 | #navbar-breadcrumbs > li > a::before{ 191 | font-family: FontAwesome; 192 | font-weight: normal; 193 | font-style: normal; 194 | text-decoration: inherit; 195 | -webkit-font-smoothing: antialiased; 196 | margin-right: .3em; 197 | display: inline-block; 198 | 199 | font-size: 24px; 200 | transition: 0.2s; 201 | position: relative; 202 | top: 3px; 203 | content: "\f105"; 204 | margin-right: 10px; 205 | color: var(--white-color); 206 | } 207 | #navbar-breadcrumbs a{ 208 | color: var(--white-color); 209 | text-decoration: none; 210 | } 211 | header .form-control{ 212 | color: var(--white-color); 213 | } 214 | header .form-control:focus{ 215 | border: 0; 216 | } 217 | .search-bar .awesomplete input{ 218 | height: 32px; 219 | } 220 | /*#navbar-search{ 221 | width: 300px; 222 | background-color: rgb(65, 78, 90); 223 | border-radius: 0px; 224 | color: #f9f9f9; 225 | border: none; 226 | }*/ 227 | header ul#navbar-breadcrumbs{ 228 | margin-top: -8px; 229 | } 230 | header .form-control:focus{ 231 | background-color: var(--white-color) !important; 232 | } 233 | 234 | 235 | 236 | /* Sidebar */ 237 | .layout-side-section .sidebar-label{ 238 | color: var(--primary-color); 239 | } 240 | .sidebar-label svg, 241 | .layout-side-section .sidebar-label .icon{ 242 | stroke: var(--primary-color); 243 | } 244 | .list-sidebar-button{ 245 | background-color: #c8c4c4 !important; 246 | box-shadow: none !important; 247 | } 248 | .list-sidebar-button:active, 249 | .list-sidebar-button:focus{ 250 | text-decoration: none !important; 251 | box-shadow: none !important; 252 | } 253 | 254 | 255 | /* Input Fields */ 256 | input{ 257 | border-radius: 0 !important; 258 | } 259 | .form-control{ 260 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 261 | background-color: #f2f2f2 !important; 262 | } 263 | .form-control:focus{ 264 | outline: 0; 265 | border: 1px solid var(--primary-color); 266 | box-shadow: none; 267 | background: rgba(255, 160, 10, 0.14) !important; 268 | } 269 | .navbar .navbar-nav a.nav-link{ 270 | color: var(--white-color); 271 | } 272 | span.notifications-seen use, 273 | symbol#icon-small-down{ 274 | fill: var(--white-color); 275 | } 276 | 277 | 278 | /* Table */ 279 | .form-grid{ 280 | border-radius: 0; 281 | border: 1px solid #bbbbbb; 282 | } 283 | .form-grid .grid-heading-row{ 284 | background-color: #f4f4f4; 285 | } 286 | .grid-heading-row{ 287 | border-bottom: 1px solid var(--primary-color); 288 | } 289 | .grid-row > .row .col{ 290 | border-right: 1px solid #d1d8dd; 291 | } 292 | .form-grid .grid-row:hover{ 293 | background: rgba(255, 152, 0, 0.15); 294 | } 295 | 296 | /* Heading Color */ 297 | .head-title, .form-section .section-head, .form-dashboard-section .section-head, .comment-box .comment-input-header{ 298 | color: var(--primary-color); 299 | } 300 | 301 | /* Lists */ 302 | .list-subject a{ 303 | text-decoration: none; 304 | transition: 0.3s; 305 | } 306 | .list-subject a:hover{ 307 | color: var(--secondary-color); 308 | } 309 | 310 | 311 | /* Report Table */ 312 | .datatable .dt-header .dt-cell--header .dt-cell__content{ 313 | background-color: #f4f4f4; 314 | } 315 | 316 | 317 | /* Buttons CSS 318 | .filter-button, 319 | .sort-selector-button, 320 | .btn-order{ 321 | background-color: #ea7272 !important; 322 | color: var(--white-color) !important; 323 | transition: 0.3s; 324 | border-radius: 0 !important; 325 | } 326 | .filter-button:hover, 327 | .sort-selector-button:hover, 328 | .btn-order:hover{ 329 | background-color: #c83b3b !important; 330 | } 331 | .filter-button span.filter-icon{ 332 | color: var(--white-color); 333 | } 334 | .filter-button span.filter-icon svg.icon{ 335 | stroke: var(--white-color); 336 | } */ 337 | 338 | -------------------------------------------------------------------------------- /business_theme_v14/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/templates/__init__.py -------------------------------------------------------------------------------- /business_theme_v14/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Midocean-Technologies/business_theme_v14/263cd962341a632ee0efe186f41138d5242e9fd6/business_theme_v14/templates/pages/__init__.py -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | License: MIT -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # frappe -- https://github.com/frappe/frappe is installed via 'bench init' -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("requirements.txt") as f: 4 | install_requires = f.read().strip().split("\n") 5 | 6 | # get version from __version__ variable in business_theme_v14/__init__.py 7 | from business_theme_v14 import __version__ as version 8 | 9 | setup( 10 | name="business_theme_v14", 11 | version=version, 12 | description="Business Theme for ERPNext / Frappe", 13 | author="Midocean Technologies Pvt Ltd", 14 | author_email="sagar@midocean.tech", 15 | packages=find_packages(), 16 | zip_safe=False, 17 | include_package_data=True, 18 | install_requires=install_requires 19 | ) 20 | --------------------------------------------------------------------------------