├── .flake8 ├── .github ├── assets │ ├── audio_search-awesomebar.png │ ├── different-time_zone.png │ ├── same-time_zone.png │ ├── try-on-fc.png │ └── wider-awesomebar.png └── workflows │ └── ci.yml ├── .gitignore ├── .pre-commit-config.yaml ├── MANIFEST.in ├── README.md ├── desk_navbar_extended ├── __init__.py ├── config │ └── __init__.py ├── desk_navbar_extended │ └── __init__.py ├── hooks.py ├── modules.txt ├── patches.txt ├── public │ ├── .gitkeep │ └── js │ │ └── desk_navbar_extended.js ├── setup.py ├── templates │ ├── __init__.py │ └── pages │ │ └── __init__.py └── www │ └── __init__.py ├── license.txt └── pyproject.toml /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | ignore = 3 | B007, 4 | B009, 5 | B010, 6 | B950, 7 | E101, 8 | E111, 9 | E114, 10 | E116, 11 | E117, 12 | E121, 13 | E122, 14 | E123, 15 | E124, 16 | E125, 17 | E126, 18 | E127, 19 | E128, 20 | E131, 21 | E201, 22 | E202, 23 | E203, 24 | E211, 25 | E221, 26 | E222, 27 | E223, 28 | E224, 29 | E225, 30 | E226, 31 | E228, 32 | E231, 33 | E241, 34 | E242, 35 | E251, 36 | E261, 37 | E262, 38 | E265, 39 | E266, 40 | E271, 41 | E272, 42 | E273, 43 | E274, 44 | E301, 45 | E302, 46 | E303, 47 | E305, 48 | E306, 49 | E402, 50 | E501, 51 | E502, 52 | E701, 53 | E702, 54 | E703, 55 | E741, 56 | F403, 57 | W191, 58 | W291, 59 | W292, 60 | W293, 61 | W391, 62 | W503, 63 | W504, 64 | E711, 65 | E129, 66 | F841, 67 | E713, 68 | E712, 69 | B023 70 | 71 | 72 | max-line-length = 200 73 | exclude=.github/**/*.py,toolbox/doctypes.py -------------------------------------------------------------------------------- /.github/assets/audio_search-awesomebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/.github/assets/audio_search-awesomebar.png -------------------------------------------------------------------------------- /.github/assets/different-time_zone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/.github/assets/different-time_zone.png -------------------------------------------------------------------------------- /.github/assets/same-time_zone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/.github/assets/same-time_zone.png -------------------------------------------------------------------------------- /.github/assets/try-on-fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/.github/assets/try-on-fc.png -------------------------------------------------------------------------------- /.github/assets/wider-awesomebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/.github/assets/wider-awesomebar.png -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | 2 | name: CI 3 | 4 | on: 5 | push: 6 | branches: 7 | - develop 8 | pull_request: 9 | 10 | concurrency: 11 | group: develop-desk_navbar_extended-${{ github.event.number }} 12 | cancel-in-progress: true 13 | 14 | jobs: 15 | tests: 16 | runs-on: ubuntu-latest 17 | strategy: 18 | fail-fast: false 19 | name: Server 20 | 21 | services: 22 | redis-cache: 23 | image: redis:alpine 24 | ports: 25 | - 13000:6379 26 | redis-queue: 27 | image: redis:alpine 28 | ports: 29 | - 11000:6379 30 | redis-socketio: 31 | image: redis:alpine 32 | ports: 33 | - 12000:6379 34 | mariadb: 35 | image: mariadb:10.6 36 | env: 37 | MYSQL_ROOT_PASSWORD: root 38 | ports: 39 | - 3306:3306 40 | options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 41 | 42 | steps: 43 | - name: Clone 44 | uses: actions/checkout@v3 45 | 46 | - name: Setup Python 47 | uses: actions/setup-python@v4 48 | with: 49 | python-version: '3.10' 50 | 51 | - name: Setup Node 52 | uses: actions/setup-node@v3 53 | with: 54 | node-version: 16 55 | check-latest: true 56 | 57 | - name: Cache pip 58 | uses: actions/cache@v2 59 | with: 60 | path: ~/.cache/pip 61 | key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py', '**/setup.cfg') }} 62 | restore-keys: | 63 | ${{ runner.os }}-pip- 64 | ${{ runner.os }}- 65 | 66 | - name: Get yarn cache directory path 67 | id: yarn-cache-dir-path 68 | run: 'echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT' 69 | 70 | - uses: actions/cache@v3 71 | id: yarn-cache 72 | with: 73 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 74 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} 75 | restore-keys: | 76 | ${{ runner.os }}-yarn- 77 | 78 | - name: Setup 79 | run: | 80 | pip install frappe-bench 81 | bench init --skip-redis-config-generation --skip-assets --python "$(which python)" ~/frappe-bench 82 | mysql --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL character_set_server = 'utf8mb4'" 83 | mysql --host 127.0.0.1 --port 3306 -u root -proot -e "SET GLOBAL collation_server = 'utf8mb4_unicode_ci'" 84 | 85 | - name: Install 86 | working-directory: /home/runner/frappe-bench 87 | run: | 88 | bench get-app desk_navbar_extended $GITHUB_WORKSPACE 89 | bench setup requirements --dev 90 | bench new-site --db-root-password root --admin-password admin test_site 91 | bench --site test_site install-app desk_navbar_extended 92 | bench build 93 | env: 94 | CI: 'Yes' 95 | 96 | - name: Run Tests 97 | working-directory: /home/runner/frappe-bench 98 | run: | 99 | bench --site test_site set-config allow_tests true 100 | bench --site test_site run-tests --app desk_navbar_extended 101 | env: 102 | TYPE: server 103 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | node_modules -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | exclude: 'node_modules|.git' 2 | default_stages: [commit] 3 | fail_fast: false 4 | 5 | repos: 6 | - repo: https://github.com/pre-commit/pre-commit-hooks 7 | rev: v4.4.0 8 | hooks: 9 | - id: trailing-whitespace 10 | files: "remote_actions.*" 11 | exclude: ".*json$|.*txt$|.*csv|.*md" 12 | - id: check-yaml 13 | - id: check-merge-conflict 14 | - id: check-ast 15 | 16 | - repo: https://github.com/PyCQA/flake8 17 | rev: 6.0.0 18 | hooks: 19 | - id: flake8 20 | additional_dependencies: [ 21 | 'flake8-bugbear', 22 | ] 23 | args: ['--config', '.flake8'] 24 | 25 | - repo: https://github.com/timothycrosley/isort 26 | rev: 5.12.0 27 | hooks: 28 | - id: isort 29 | exclude: ".*setup.py$" 30 | 31 | - repo: https://github.com/psf/black 32 | rev: 23.1.0 33 | hooks: 34 | - id: black 35 | additional_dependencies: ['click'] 36 | 37 | - repo: https://github.com/pre-commit/mirrors-prettier 38 | rev: v3.0.0-alpha.6 39 | hooks: 40 | - id: prettier 41 | types_or: [javascript] 42 | # Ignore any files that might contain jinja / bundles 43 | exclude: | 44 | (?x)^( 45 | desk_navbar_extended/public/dist/.*| 46 | .*node_modules.*| 47 | .*boilerplate.*| 48 | desk_navbar_extended/www/website_script.js| 49 | desk_navbar_extended/templates/includes/.*| 50 | desk_navbar_extended/public/js/lib/.* 51 | )$ 52 | -------------------------------------------------------------------------------- /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 desk_navbar_extended *.css 8 | recursive-include desk_navbar_extended *.csv 9 | recursive-include desk_navbar_extended *.html 10 | recursive-include desk_navbar_extended *.ico 11 | recursive-include desk_navbar_extended *.js 12 | recursive-include desk_navbar_extended *.json 13 | recursive-include desk_navbar_extended *.md 14 | recursive-include desk_navbar_extended *.png 15 | recursive-include desk_navbar_extended *.py 16 | recursive-include desk_navbar_extended *.svg 17 | recursive-include desk_navbar_extended *.txt 18 | recursive-exclude desk_navbar_extended *.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Desk Navbar Extended 2 | 3 | Tweaks in Desk's Navbar to boost Productivity 4 | 5 | [![Try on Frappe Cloud](./.github/assets/try-on-fc.png)](https://frappecloud.com/marketplace/apps/desk_navbar_extended?referrer=a6d8da54) 6 | 7 | ### Features 8 | 9 | 1. Show User & Site current time in Desk's Navbar Menu 10 | 11 | ![](./.github/assets/same-time_zone.png) 12 | *When User & Site TimeZones Match* 13 | 14 | ![](./.github/assets/different-time_zone.png) 15 | *When User & Site TimeZones are Different* 16 | 17 | 2. Wider Awesomebar 18 | 19 | ![](./.github/assets/wider-awesomebar.png) 20 | 21 | 3. Voice Search in Awesomebar _[WIP]_ 22 | 23 | ![](./.github/assets/audio_search-awesomebar.png) 24 | *Multi-language support powered by OpenAI* 25 | 26 | #### License 27 | 28 | MIT -------------------------------------------------------------------------------- /desk_navbar_extended/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.0.1" 2 | -------------------------------------------------------------------------------- /desk_navbar_extended/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/config/__init__.py -------------------------------------------------------------------------------- /desk_navbar_extended/desk_navbar_extended/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/desk_navbar_extended/__init__.py -------------------------------------------------------------------------------- /desk_navbar_extended/hooks.py: -------------------------------------------------------------------------------- 1 | from . import __version__ as app_version # noqa 2 | 3 | app_name = "desk_navbar_extended" 4 | app_title = "Desk Navbar Extended" 5 | app_publisher = "Gavin D'souza" 6 | app_description = "Tweaks in Desk's Navbar to boost Productivity" 7 | app_email = "gavin18d@gmail.com" 8 | app_license = "MIT" 9 | 10 | # Includes in 11 | # ------------------ 12 | 13 | # include js, css files in header of desk.html 14 | # app_include_css = "/assets/desk_navbar_extended/css/desk_navbar_extended.css" 15 | app_include_js = "/assets/desk_navbar_extended/js/desk_navbar_extended.js" 16 | 17 | # include js, css files in header of web template 18 | # web_include_css = "/assets/desk_navbar_extended/css/desk_navbar_extended.css" 19 | # web_include_js = "/assets/desk_navbar_extended/js/desk_navbar_extended.js" 20 | 21 | # include custom scss in every website theme (without file extension ".scss") 22 | # website_theme_scss = "desk_navbar_extended/public/scss/website" 23 | 24 | # include js, css files in header of web form 25 | # webform_include_js = {"doctype": "public/js/doctype.js"} 26 | # webform_include_css = {"doctype": "public/css/doctype.css"} 27 | 28 | # include js in page 29 | # page_js = {"page" : "public/js/file.js"} 30 | 31 | # include js in doctype views 32 | # doctype_js = {"doctype" : "public/js/doctype.js"} 33 | # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} 34 | # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} 35 | # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} 36 | 37 | # Home Pages 38 | # ---------- 39 | 40 | # application home page (will override Website Settings) 41 | # home_page = "login" 42 | 43 | # website user home page (by Role) 44 | # role_home_page = { 45 | # "Role": "home_page" 46 | # } 47 | 48 | # Generators 49 | # ---------- 50 | 51 | # automatically create page for each record of this doctype 52 | # website_generators = ["Web Page"] 53 | 54 | # Jinja 55 | # ---------- 56 | 57 | # add methods and filters to jinja environment 58 | # jinja = { 59 | # "methods": "desk_navbar_extended.utils.jinja_methods", 60 | # "filters": "desk_navbar_extended.utils.jinja_filters" 61 | # } 62 | 63 | # Installation 64 | # ------------ 65 | 66 | # before_install = "desk_navbar_extended.install.before_install" 67 | after_install = "desk_navbar_extended.setup.after_install" 68 | 69 | # Uninstallation 70 | # ------------ 71 | 72 | # before_uninstall = "desk_navbar_extended.uninstall.before_uninstall" 73 | after_uninstall = "desk_navbar_extended.setup.after_uninstall" 74 | 75 | # Desk Notifications 76 | # ------------------ 77 | # See frappe.core.notifications.get_notification_config 78 | 79 | # notification_config = "desk_navbar_extended.notifications.get_notification_config" 80 | 81 | # Permissions 82 | # ----------- 83 | # Permissions evaluated in scripted ways 84 | 85 | # permission_query_conditions = { 86 | # "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", 87 | # } 88 | # 89 | # has_permission = { 90 | # "Event": "frappe.desk.doctype.event.event.has_permission", 91 | # } 92 | 93 | # DocType Class 94 | # --------------- 95 | # Override standard doctype classes 96 | 97 | # override_doctype_class = { 98 | # "ToDo": "custom_app.overrides.CustomToDo" 99 | # } 100 | 101 | # Document Events 102 | # --------------- 103 | # Hook on document methods and events 104 | 105 | # doc_events = { 106 | # "*": { 107 | # "on_update": "method", 108 | # "on_cancel": "method", 109 | # "on_trash": "method" 110 | # } 111 | # } 112 | 113 | # Scheduled Tasks 114 | # --------------- 115 | 116 | # scheduler_events = { 117 | # "all": [ 118 | # "desk_navbar_extended.tasks.all" 119 | # ], 120 | # "daily": [ 121 | # "desk_navbar_extended.tasks.daily" 122 | # ], 123 | # "hourly": [ 124 | # "desk_navbar_extended.tasks.hourly" 125 | # ], 126 | # "weekly": [ 127 | # "desk_navbar_extended.tasks.weekly" 128 | # ], 129 | # "monthly": [ 130 | # "desk_navbar_extended.tasks.monthly" 131 | # ], 132 | # } 133 | 134 | # Testing 135 | # ------- 136 | 137 | # before_tests = "desk_navbar_extended.install.before_tests" 138 | 139 | # Overriding Methods 140 | # ------------------------------ 141 | # 142 | # override_whitelisted_methods = { 143 | # "frappe.desk.doctype.event.event.get_events": "desk_navbar_extended.event.get_events" 144 | # } 145 | # 146 | # each overriding function accepts a `data` argument; 147 | # generated from the base implementation of the doctype dashboard, 148 | # along with any modifications made in other Frappe apps 149 | # override_doctype_dashboards = { 150 | # "Task": "desk_navbar_extended.task.get_dashboard_data" 151 | # } 152 | 153 | # exempt linked doctypes from being automatically cancelled 154 | # 155 | # auto_cancel_exempted_doctypes = ["Auto Repeat"] 156 | 157 | # Ignore links to specified DocTypes when deleting documents 158 | # ----------------------------------------------------------- 159 | 160 | # ignore_links_on_delete = ["Communication", "ToDo"] 161 | 162 | # Request Events 163 | # ---------------- 164 | # before_request = ["desk_navbar_extended.utils.before_request"] 165 | # after_request = ["desk_navbar_extended.utils.after_request"] 166 | 167 | # Job Events 168 | # ---------- 169 | # before_job = ["desk_navbar_extended.utils.before_job"] 170 | # after_job = ["desk_navbar_extended.utils.after_job"] 171 | 172 | # User Data Protection 173 | # -------------------- 174 | 175 | # user_data_fields = [ 176 | # { 177 | # "doctype": "{doctype_1}", 178 | # "filter_by": "{filter_by}", 179 | # "redact_fields": ["{field_1}", "{field_2}"], 180 | # "partial": 1, 181 | # }, 182 | # { 183 | # "doctype": "{doctype_2}", 184 | # "filter_by": "{filter_by}", 185 | # "partial": 1, 186 | # }, 187 | # { 188 | # "doctype": "{doctype_3}", 189 | # "strict": False, 190 | # }, 191 | # { 192 | # "doctype": "{doctype_4}" 193 | # } 194 | # ] 195 | 196 | # Authentication and authorization 197 | # -------------------------------- 198 | 199 | # auth_hooks = [ 200 | # "desk_navbar_extended.auth.validate" 201 | # ] 202 | -------------------------------------------------------------------------------- /desk_navbar_extended/modules.txt: -------------------------------------------------------------------------------- 1 | Desk Navbar Extended -------------------------------------------------------------------------------- /desk_navbar_extended/patches.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/patches.txt -------------------------------------------------------------------------------- /desk_navbar_extended/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/public/.gitkeep -------------------------------------------------------------------------------- /desk_navbar_extended/public/js/desk_navbar_extended.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | clockUpdate(); 3 | setInterval(clockUpdate, 1000); 4 | }); 5 | 6 | function padZero(x) { 7 | return x < 10 ? `0${x}` : x; 8 | } 9 | 10 | function base12(x) { 11 | if (x > 12) { 12 | x = x - 12; 13 | } else if (x == 0) { 14 | x = 12; 15 | } 16 | return x; 17 | } 18 | 19 | function formatTime(dt, seconds) { 20 | const h = padZero(base12(dt.getHours())); 21 | const m = padZero(dt.getMinutes()); 22 | const s = padZero(dt.getSeconds()); 23 | const suffix = dt.getHours() > 12 ? "PM" : "AM"; 24 | 25 | return `${h}:${m}:${s} ${suffix}`; 26 | } 27 | 28 | function clockUpdate() { 29 | let clock_html; 30 | const container_style = 31 | 'style="display: grid;grid-template-columns: auto auto;justify-items: stretch;justify-content: space-between;"'; 32 | const container_item_style = 'style="font-weight:bold;font-size:large;"'; 33 | const is_multi_clock = 34 | frappe.boot.time_zone.user && 35 | frappe.boot.time_zone.user != frappe.boot.time_zone.system; 36 | 37 | if (is_multi_clock) { 38 | const now_user = new Date(frappe.datetime.convert_to_user_tz()); 39 | const now_sys = new Date(frappe.datetime.convert_to_system_tz()); 40 | clock_html = ` 41 |
42 |
User:
${formatTime( 43 | now_user, 44 | )}
45 |
Site:
${formatTime(now_sys)}
46 |
`; 47 | } else { 48 | const now_user = new Date(frappe.datetime.convert_to_user_tz()); 49 | clock_html = `
50 |
Time:
${formatTime(now_user)}
51 |
`; 52 | } 53 | 54 | $("#desk-navbar-extended-clock").html(`
${clock_html}
`); 55 | } 56 | 57 | setTimeout(() => { 58 | $(".dropdown-navbar-user a:contains('Show Time')").attr( 59 | "id", 60 | "desk-navbar-extended-clock", 61 | ); 62 | $(".dropdown-navbar-user button:contains('Show Time')").attr( 63 | "id", 64 | "desk-navbar-extended-clock", 65 | ); 66 | }, 1000); 67 | -------------------------------------------------------------------------------- /desk_navbar_extended/setup.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | NAVBAR_ITEM_LABEL = "Show Time" 4 | NAVBAR_EXTND_ITEMS = [ 5 | { 6 | "item_label": NAVBAR_ITEM_LABEL, 7 | "item_type": "Action", 8 | "action": "() => {}", 9 | "idx": 1, 10 | }, 11 | { 12 | "item_type": "Separator", 13 | "idx": 2, 14 | }, 15 | ] 16 | 17 | 18 | def after_install(): 19 | if frappe.db.exists("Navbar Item", {"item_label": NAVBAR_ITEM_LABEL}): 20 | return 21 | 22 | navbar_settings = frappe.get_single("Navbar Settings") 23 | for ni in navbar_settings.settings_dropdown: 24 | ni.idx = ni.idx + len(NAVBAR_EXTND_ITEMS) 25 | navbar_settings.extend("settings_dropdown", NAVBAR_EXTND_ITEMS) 26 | navbar_settings.save() 27 | frappe.db.commit() 28 | 29 | 30 | def after_uninstall(): 31 | if not frappe.db.exists("Navbar Item", {"item_label": NAVBAR_ITEM_LABEL}): 32 | return 33 | 34 | patch_flag = frappe.flags.in_patch 35 | frappe.flags.in_patch = True 36 | navbar_settings = frappe.get_single("Navbar Settings") 37 | 38 | for i, ni in enumerate(navbar_settings.settings_dropdown): 39 | if ni.item_label == NAVBAR_ITEM_LABEL: 40 | navbar_settings.settings_dropdown.pop(i) 41 | if navbar_settings.settings_dropdown[i + 1].item_stype == "Separator": 42 | navbar_settings.settings_dropdown.pop(i + 1) 43 | break 44 | navbar_settings.save() 45 | frappe.db.commit() 46 | frappe.flags.in_patch = patch_flag 47 | -------------------------------------------------------------------------------- /desk_navbar_extended/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/templates/__init__.py -------------------------------------------------------------------------------- /desk_navbar_extended/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/templates/pages/__init__.py -------------------------------------------------------------------------------- /desk_navbar_extended/www/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gavindsouza/desk-navbar-extended/aca1f630066eff355b45f0ad6c861e76a3545eb2/desk_navbar_extended/www/__init__.py -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | License: MIT -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "desk_navbar_extended" 3 | authors = [ 4 | { name = "Gavin D'souza", email = "gavin18d@gmail.com"} 5 | ] 6 | description = "Tweaks in Desk's Navbar to boost Productivity" 7 | requires-python = ">=3.8" 8 | readme = "README.md" 9 | dynamic = ["version"] 10 | dependencies = [ 11 | # frappe -- https://github.com/frappe/frappe is installed via 'bench init' 12 | ] 13 | 14 | [build-system] 15 | requires = ["flit_core >=3.4,<4"] 16 | build-backend = "flit_core.buildapi" 17 | 18 | [tool.bench.dev-dependencies] 19 | 20 | [tool.black] 21 | line-length = 99 22 | 23 | [tool.isort] 24 | line_length = 99 25 | multi_line_output = 3 26 | include_trailing_comma = true 27 | force_grid_wrap = 0 28 | use_parentheses = true 29 | ensure_newline_before_comments = true 30 | --------------------------------------------------------------------------------