Rewrites <use href="#icon-NAME"> inside .frappe-menu dropdown items
(the user/settings menu at top-left) to semantically similar but
visually distinct lucide ids — home→house, sliders-horizontal→
settings-2, rotate-ccw→refresh-ccw, maximize→chevrons-left-right,
moon→moon-star, info→life-buoy, logout→log-out. Idempotent via
.jey-menu-remap-done marker. Wired into processAll + rebuildAllIcons
so it runs on boot, theme switch and DOM mutations.
Also switches the custom .jey-fullwidth-link button to the same
chevrons-left-right icon so its appearance matches the menu entry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Creates a custom /desk subsystem "Taxes Az" listing user-facing doctypes
from the taxes_az module in three cards (Declarations & Returns, Setup &
Reference, Period Closing & Tools). The doctype list is a STATIC snapshot
baked into taxes_workspace.py — adding a new DocType to taxes_az will not
automatically put it into the workspace; edit the tuples and re-run setup.
- Uses "Taxes Az" name (not "Taxes") to avoid collision with erpnext's
built-in Workspace Sidebar "Taxes", which otherwise hijacks routing to
/app/sales-taxes-and-charges-template.
- Creates a matching Workspace Sidebar whose first Link is link_type=
"Workspace" so Frappe's desktop.js get_route() generates a clean
/app/taxes-az route and the click stays in-tab (standard behaviour).
- Desktop Icon with idx=999 pins it to the end of the /desk grid.
- Cleanup of the obsolete "Taxes" doc we created earlier is idempotent
and scoped to jey_theme-owned records (never touches erpnext's).
Registered via after_migrate hook so every `bench migrate` re-asserts
the configuration. setup() is idempotent.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Menu titles in the app switcher dropdown and sidebar header are
translated (e.g. Azerbaijani), so looking up THEME_ICONS by textContent
missed everything. resolveEnglishKey() now extracts the untranslated
icon name from the <img src> URL, falls back to scanning
frappe.boot.desktop_icons for a matching __(label), then the text.
Also adds a "taxes az" alias to THEME_ICONS.chrome so our new
Taxes Az desktop icon renders the tax document SVG instead of the
alphabet fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds jey_theme.access_control with a single source of truth (BLOCKED_MODULES,
BLOCKED_DOCTYPES_EXTRA) and three Frappe hooks:
- before_request: HTTP-level block on /api/resource/<Doctype>, /app/<slug>
and any whitelisted method passing `doctype` in form_dict. Runs before the
Administrator bypass in frappe.permissions, so it blocks every user.
- extend_bootinfo: strips blocked modules/doctypes/workspaces from bootinfo
(workspaces.pages, module_wise_workspaces, app_data, desktop_icons,
user.can_read/...) so the client router never registers routes for them
and the sidebar/switcher hide them.
- has_permission wildcard: per-doc safety net for non-Administrator users.
shared.css gets desktop-icon[data-id] fallbacks for Quality/Subcontracting.
Reversal: clear BLOCKED_MODULES in access_control.py and run
`bench --site <site> clear-cache && bench restart`. No DB writes are made.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extended chrome theme from desktop icons only to the full ERPNext UI:
navbar, sidebar, buttons, inputs, forms, lists, tables, modals,
dropdowns, tabs, timeline, scrollbars. Uses 45° multi-stop reflective
gradients, beveled shadows, conic-gradient accents, and polished
metal body background.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>