Was rendering ~200px (matching Frappe's inline max-width), which felt
too large on smaller screens. Override with !important since the
template uses inline styling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds three new cards (E-Taxes Setup, Reference, Documents) under a
"E-Taxes & ƏMAS" header so Asan Login, E-Taxes Settings, and the rest
of the standalone invoice_az doctypes are reachable from the Taxes Az
workspace and sidebar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the auxiliary Workspace 'Employees' page and let the sidebar's
single DocType link drive get_route_for_icon — clicking the icon now
jumps straight to /app/employee instead of through a workspace card.
_cleanup_obsolete_workspace removes the page from older deployments
on next migrate.
Workspace Sidebar.app stays 'hrms' so the sidebar header subtitle
resolves to the HRMS app_title via choose_app_name in sidebar.js,
not 'Jey Theme'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
HRMS v16 dropped the old Employee Lifecycle workspace (see
hrms/patches/v16_0/delete_old_workspaces.py), which removed its
desktop icon from the Frappe HR folder. This adds it back as a
jey_theme-owned record so HRMS upgrades stay untouched.
The icon is link_type='Workspace Sidebar' pointing to a minimal
Workspace Sidebar 'Employees' that has a single DocType link to
Employee — Frappe's DesktopIcon.is_permitted requires a sidebar
named after the icon's label or it filters the icon out of bootinfo,
so an External link alone is not enough. No Workspace page is
created. Click routes to /app/employee via get_route_for_icon.
Idempotent setup runs on after_migrate, mirroring taxes_workspace.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CSS swaps the <img> inside templates/includes/splash_screen.html via
content: url(...) so the desk loading screen shows our PNG instead of
the default blue "E" framework logo. Image lives at
public/images/preloader.png — served via the existing assets symlink,
no bench build needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drops the MutationObserver-driven rebrand IIFE and the desktop label
overrides (Frappe HR → HR, ERPNext Settings → Settings). Original
labels are now shown as-is.
CSS:
- Force min-width:0 on .body-sidebar-bottom so it can shrink to the 50px
collapsed width instead of refusing to clip past its widest label.
- Animate label max-width and margin-left with the same 0.3s
cubic-bezier as the sidebar width — labels now slide smoothly
under their icons on collapse instead of leaving an ellipsized
letter at the edge.
- Hide v16.17's native .sidebar-bottom-actions row (about + collapse
icon-buttons) since our labeled .jey-collapse-link replaces it.
- Animate .nav-item padding so it stays in sync with the sidebar
width transition (Frappe v16 toggles padding 0→8px instantly).
JS:
- Update collapse-link DOM in place (svg href + span text) instead of
rebuilding innerHTML, so the span keeps its identity and the
max-width transition plays smoothly across collapse/expand toggles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Frappe v16.17 reintroduced .collapse-sidebar-link as a tiny icon-button
inside a horizontal flex row (.sidebar-bottom-actions). Our v15
fallback was finding it and inserting our three labeled links into
that flex row, pushing them off the right edge of the sidebar.
Anchor only on .body-sidebar-bottom now.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Frappe's has_controller_permissions treats any falsy return as denial, so
returning None was blocking every non-admin user on every doctype.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sticky .level-right on list rows gets a translucent metallic gradient
so horizontally-overflowing columns don't leak through under it, with
a visible left border as a separator. Hover state slightly brighter.
.comment-count svg forced to fill:none + stroke:currentColor so the
swapped-in lucide comment sprite renders as an outline, not a blob.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Captions wrap to 2 lines with ellipsis inside grid track instead of
overflowing into neighbouring icons. Modal header loses its gradient
bar (title only). Body stops forcing an inner scrollbar when icons
fit. Chrome modal border switches from border-image (sharp rect) to
a plain 1px border that follows border-radius.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The global toggle-switch styling for input[type=checkbox] doesn't fit
the 32px select column or 37px index column in frappe-datatable, so
content was clipped and checkboxes sat flush to the cell baseline.
- Compact 14x14 themed square checkbox (same paint as grid .row-check)
inside .datatable, with ::after pseudo disabled.
- Flex-center the cell when the only child is a checkbox.
- Let the filter input shrink instead of crushing its help-icon sibling.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors the grid module's UX in Frappe's desk list view — drag the right
edge of a header to resize, drag the header itself to reorder. Widths
and order persist per doctype in localStorage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v16 removed the .collapse-sidebar-link anchor the Full Width / Switch
Theme buttons inserted before, so they silently stopped rendering.
Add a jeySidebarAnchor() helper that falls back to .body-sidebar-bottom,
and re-add a Collapse/Expand button (calls frappe.app.sidebar.toggle_width)
to replace the default v15 link Frappe dropped.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Chrome theme: active grid row now visually matches the static row —
flattened inputs, forced bottom border, padding match, pressed-in
button-style effect on focused cells with smooth 0.45s transition.
- Read-only grid cells get a distinct lighter-grey bg only while their
row is the active one (uses Frappe's display:none on .field-area).
- Button press animations: expanded shadow set + explicit transitions
so press/release is symmetric and eased.
- Shared: fixed section-in keyframe leaving a stacking context that
clipped Link autocomplete dropdowns; dropdown fade-out without
Popper position reset; smooth sidebar expand to match collapse.
- JS: clip section overflow during collapse transition, restore after
transitionend; freeze dropdown position during Bootstrap hide.
- CLAUDE.md: rewritten as Claude Code guidance doc.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>