Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
388 commits
Select commit Hold shift + click to select a range
a6b41ac
fix(sidebar): hide promotional banner title when sidebar is collapsed
KerollesFathy May 24, 2026
6f3d80b
fix(workspace): add check for public ws. too
AarDG10 May 26, 2026
531a9d5
fix: append existing link filters instead of overwriting (#39231)
mihir-kandoi May 19, 2026
a742ac0
Merge pull request #39462 from frappe/mergify/bp/version-16-hotfix/pr…
gajjug004 May 26, 2026
148ffd9
perf(form): speed up mandatory check, dedupe row errors
kaulith Apr 29, 2026
f7a17b9
refactor(form): rewrite missing-fields dialog as sentences with row r…
kaulith May 10, 2026
0191146
style: prettier
kaulith May 10, 2026
d669a60
fix(grid): update dynamic docfield options after configure columns
nareshkannasln May 8, 2026
3a757d1
Merge pull request #39533 from frappe/mergify/bp/version-16-hotfix/pr…
kaulith May 26, 2026
4ccc64d
Merge pull request #39535 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz May 26, 2026
0a053cd
fix(list-view): retain selection when cancelling Clear Assignment
kaulith May 26, 2026
59e544a
Merge pull request #39538 from frappe/mergify/bp/version-16-hotfix/pr…
kaulith May 26, 2026
6eba29d
Merge pull request #39526 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 May 26, 2026
4af1b9e
fix(child_table): hide multiple rows button on selecting rows
diptanilsaha May 25, 2026
1498afd
fix(child_table): update selection banner after duplicate and delete …
diptanilsaha May 25, 2026
6262f9b
test(child_table): add cypress tests for grid row selection behaviour
diptanilsaha May 25, 2026
ca60893
chore: merge conflicts
sokumon May 26, 2026
57291c5
fix: transform filter correctly to match route options
sokumon Feb 5, 2026
dae6e0a
fix: respect search bar display setting in desktop page (#36789)
GursheenK Feb 9, 2026
49049b1
Merge pull request #39541 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy May 26, 2026
001f549
fix: use subtle blue for indicator pills in dark mode
KerollesFathy May 25, 2026
3c18bd1
Merge pull request #39540 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
a05771c
Merge pull request #39543 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
75a58f7
fix: use subtle surface/ink for indicator pills in dark mode
KerollesFathy May 26, 2026
b30264a
Merge pull request #39522 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
b3c6efc
Merge pull request #39545 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
a741c6b
Merge pull request #39519 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
fa461ae
Merge pull request #39530 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
792e2fa
Merge pull request #39523 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
002a36a
fix: escape column headers too
AarDG10 May 26, 2026
14494f7
Merge pull request #39547 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 May 27, 2026
f57a9dc
fix(filter): restrict the hidden fields in filter
nareshkannasln May 5, 2026
2085b6f
Merge pull request #39488 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz May 27, 2026
050999f
Merge pull request #39549 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz May 27, 2026
a689ac6
Merge pull request #39524 from frappe/version-16-hotfix
iamejaaz May 27, 2026
ba18090
chore(release): Bumped to Version 16.19.0
frappe-bot May 27, 2026
8e8ef9d
fix(file_manager): adding perms. to add_attachments
AarDG10 May 20, 2026
39614f4
feat: add whitelist for guest allowed uploads
AarDG10 May 21, 2026
bc5a4e7
test: add test for guest uploads
AarDG10 May 21, 2026
b1c8604
Merge pull request #39550 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 May 27, 2026
56598ae
chore: resolve conflicts
AarDG10 May 27, 2026
03d8877
Merge pull request #39452 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 May 27, 2026
146fefe
fix: only re-export standard sidebars
sokumon May 27, 2026
3754665
Merge pull request #39558 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
da15c39
fix(menu): namespace icon to frappe-menu
sokumon May 27, 2026
ba084af
fix: center align icon in menu
sokumon May 27, 2026
5ea0313
Merge pull request #39561 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
de3a29d
fix(ux): prevent browser search bar from opening on Ctrl+K in form view
KerollesFathy May 27, 2026
d1ff3f8
Merge pull request #39569 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 27, 2026
517f5f5
fix(rounding): improve Banker's rounding implementation for negative …
ljain112 May 27, 2026
dc61a5f
fix: aggregate_function_based_on mandatory_depends_on missing type check
ASHOKBABU03 May 28, 2026
37a57c8
chore: merge conflicts
sokumon May 28, 2026
87fec1f
Merge pull request #39587 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 28, 2026
1d3a249
fix: stop stale dynamic_link populating address when navigating via L…
nabinhait May 19, 2026
6919c62
fix(ci): combine condition into one check
sokumon May 28, 2026
35268f3
Merge pull request #39389 from frappe/mergify/bp/version-16-hotfix/pr…
mergify[bot] May 28, 2026
3a50c2c
fix: aggregate_function_based_on_condition
sokumon May 28, 2026
b05e433
Merge pull request #39589 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 29, 2026
be629be
Merge pull request #39577 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 29, 2026
47f0c1f
fix(MultiSelectDialog): persist the result while searching
sokumon May 29, 2026
c983724
Merge pull request #39592 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon May 29, 2026
d9ea5d9
fix: Skip update prompt if not setup (#39593) (#39594)
mergify[bot] May 29, 2026
37f0a0e
fix: fix grid selection toast text invisible in dark mode and extra t…
KerollesFathy May 28, 2026
4caf823
fix(file_uploader): use optional chaining for frm.attachments.max_rea…
KerollesFathy May 14, 2026
7cfdb94
fix: update mandatory dependency for aggregate function field in Numb…
KerollesFathy May 29, 2026
bc237d7
Merge pull request #39610 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy May 29, 2026
20c4e3a
Merge pull request #39606 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy May 29, 2026
756a4cb
Merge pull request #39605 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy May 30, 2026
5127ab5
fix(contact): key_error while popping link_doctype and link_name in c…
mergify[bot] May 30, 2026
b3a1af5
chore: mark as out of beta (backport #39619) (#39620)
mergify[bot] May 30, 2026
c31121d
chore: update POT file (#39627)
frappe-pr-bot May 31, 2026
18ac4b9
refactor(workflow): replace sql by qb in `set_active` and `update_def…
KerollesFathy Jun 1, 2026
e6723ed
fix: misc bug fixes (backport #39397) (#39635)
mergify[bot] Jun 1, 2026
20a17fa
fix: patch QB by default everywhere (#39636) (#39640)
mergify[bot] Jun 1, 2026
4f86081
Merge pull request #39638 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy Jun 1, 2026
b5168d2
feat(sidebar): add hover-reveal toggle button
iamejaaz May 26, 2026
c46a29a
feat: allow Bulk Edit in Child Table (backport #38567) (#39651)
mergify[bot] Jun 1, 2026
ce87e2b
Merge pull request #39654 from frappe/mergify/bp/version-16-hotfix/pr…
KerollesFathy Jun 1, 2026
7150abb
feat: configure global search fields directly in global search settin…
mergify[bot] Jun 1, 2026
01886af
Revert "fix(filter): restrict the hidden fields in filter"
iamejaaz Jun 1, 2026
58eb478
fix(optimized): KanbanView field fetching by limiting to required fie…
mergify[bot] Jun 1, 2026
4ffe148
Merge pull request #39658 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 1, 2026
b20319a
fix: apply filters on bulk edit child table link fields (#39004) (#39…
mergify[bot] Jun 1, 2026
fcdc612
feat: improved global search (backport #39181) (#39660)
mergify[bot] Jun 1, 2026
64b50f8
refactor: streamline permission check for search results in global_se…
mergify[bot] Jun 1, 2026
5bee2d0
feat: use Autocomplete for searching DocType fields (#39184) (#39661)
mergify[bot] Jun 1, 2026
ce7befe
fix: handle IndexError when dynamic footer
KerollesFathy Jun 1, 2026
9cda5fc
feat: build and upload assets to GitHub Releases
rmehta Jun 2, 2026
9fe198b
Merge pull request #39677 from rmehta/feat/build-and-upload-assets
rmehta Jun 2, 2026
5704c4c
fix: disable tab selection in awesomplete settings
Abdeali099 Jun 1, 2026
eeb5d61
Merge pull request #39680 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 2, 2026
a485608
Merge pull request #39666 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 2, 2026
27ed8c5
refactor: add focus event to dropdown toggle in multi-select list
Abdeali099 May 30, 2026
eed2979
refactor: prevent default behavior on mousedown for selectable items …
Abdeali099 May 30, 2026
78ae987
refactor: prevent dropdown from reopening on focus triggered by mouse…
Abdeali099 Jun 1, 2026
2630942
chore: minor comments
Abdeali099 Jun 1, 2026
a36b921
chore: bump up datatable to 1.20.4
AarDG10 Jun 1, 2026
9b2c57a
fix: remove table multiselect pills on first click
mihir-kandoi Jun 1, 2026
4f6d3f4
Merge pull request #39682 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 2, 2026
64590e3
Merge pull request #39689 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 2, 2026
1460e70
chore: resolve conflicts
AarDG10 Jun 2, 2026
6be3286
Merge pull request #39686 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 Jun 2, 2026
9493770
Merge pull request #39696 from frappe/version-16-hotfix
iamejaaz Jun 2, 2026
5c16f12
chore(release): Bumped to Version 16.20.0
frappe-bot Jun 2, 2026
4af1941
fix: assignment permission bypass
ShrihariMahabal Jun 2, 2026
97a406e
fix: resolve backport conflict for assignment permission bypass
ShrihariMahabal Jun 2, 2026
6a908b0
Merge pull request #39708 from frappe/mergify/bp/version-16-hotfix/pr…
ShrihariMahabal Jun 2, 2026
ef49d64
fix: Avoid duplicate setup wizard request (#39710) (#39715)
mergify[bot] Jun 3, 2026
304fbdc
fix: Filter current user while marking as read (#39717) (#39719)
mergify[bot] Jun 3, 2026
f70aee0
fix: remove selected row banner
nishkagosalia Jun 3, 2026
14ad377
Merge pull request #39728 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 3, 2026
e470151
feat: new about dialog (#39724) (#39732)
mergify[bot] Jun 3, 2026
0f3fc9d
fix(auto_email_report): attach doc to filter dialog to stop set_value…
Jatin3128 Jun 2, 2026
7b70f2f
Merge pull request #39736 from frappe/mergify/bp/version-16-hotfix/pr…
Jatin3128 Jun 3, 2026
bcc9e5d
feat: add keyboard shortcuts to the sidebar menu items (#39476)
Vibhuti410 May 24, 2026
c1846f0
feat: add option to disable prepared report automation (backport #397…
mergify[bot] Jun 3, 2026
769e059
chore: bump PyJWT to 2.13.0 (backport #39745) (#39747)
mergify[bot] Jun 4, 2026
dd331b3
fix: move patch to post_model_sync (backport #39748) (#39749)
mergify[bot] Jun 4, 2026
cb60a4f
fix(grid): guard grid_sortable in row-index search handler
gajjug004 Jun 4, 2026
ae5c3f4
Merge pull request #39741 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 4, 2026
d2b84f5
Merge pull request #39752 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 4, 2026
84b9f0a
fix(desk): add permission checks to toggle_like and mark_as_seen
iamejaaz Jun 4, 2026
743af0f
Merge pull request #39763 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 4, 2026
43ccd0c
fix: onboarding tour boot defaults never applied due to comparison typo
kaulith Jun 4, 2026
7d6274a
Merge pull request #39766 from frappe/mergify/bp/version-16-hotfix/pr…
kaulith Jun 4, 2026
0680998
fix(mobile): show sidebar toggle button
KerollesFathy Jun 4, 2026
5304562
Merge pull request #39774 from frappe/mergify/bp/version-16-hotfix/pr…
iamejaaz Jun 5, 2026
d785a10
feat: add util for dehydrating copy_doc obj.
AarDG10 Mar 11, 2026
066efdd
feat: add util for dehydrating get_doc obj.
AarDG10 Mar 11, 2026
4d0f044
feat: add util for dehydrating get_last_doc obj.
AarDG10 Mar 11, 2026
3f2e71f
feat: add util for dehydrating get_cached_doc obj.
AarDG10 Mar 11, 2026
b0470a5
feat: dehydrate objs. returned by get_list and get_all
AarDG10 Mar 11, 2026
d3b8bcd
feat: dehydrate objs. returned by get_meta
AarDG10 Mar 11, 2026
210533b
fix: strictly assert parsed params
AarDG10 Mar 11, 2026
b3e3d5e
feat: dehydrate obj. returned by get_mapped_doc
AarDG10 Mar 12, 2026
987e728
feat: dehydrate obj. returned by new_doc
AarDG10 Mar 12, 2026
109ff07
feat: return name when using sendmail
AarDG10 Mar 12, 2026
431bd5a
feat: add safer_enqueue
AarDG10 Mar 12, 2026
5dcb8f0
feat: add safer_log_error
AarDG10 Mar 12, 2026
5cb49ef
feat: add safer_get_visible_columns
AarDG10 Mar 12, 2026
3ea6aad
feat: add safer print utils
AarDG10 Mar 12, 2026
f94444a
feat: add get_safer_globals
AarDG10 Mar 12, 2026
2752955
feat: add safer_exec
AarDG10 Mar 14, 2026
28b3358
fix: minor fixes in assertions
AarDG10 Mar 14, 2026
2641866
feat: integrate safer_exec
AarDG10 Mar 14, 2026
a7501de
fix: exclude db method's access from safer_globals
AarDG10 Mar 17, 2026
dd74a27
refactor: remove patched_qb from safer_exec
AarDG10 Jun 1, 2026
1d81079
feat: add render_safe_globals
AarDG10 Jun 2, 2026
04ae1e8
feat: add exec_safe_globals
AarDG10 Jun 2, 2026
6c834fd
fix: add make_safe_get_request to render_safe_globals instead
AarDG10 Jun 2, 2026
7c4acc7
refactor: reorder globals from render to exec
AarDG10 Jun 2, 2026
f7f070a
fix: harden make_safe_get_request
AarDG10 Jun 3, 2026
99b8a83
refactor: remove unwanted code
AarDG10 Jun 3, 2026
48c5e3d
fix: read flag or parsed arg to decide whether to override globals
AarDG10 Jun 3, 2026
fccecc9
refactor: remove unused utils
AarDG10 Jun 4, 2026
804dbaf
refactor: Make render safe opt-out on develop
ankush Jun 4, 2026
6658228
refactor: Split get_safe_globals to render/exec safe stuff
ankush Jun 4, 2026
415f82d
fix: Restrict render template usage
ankush Jun 4, 2026
eafff4c
refactor: return empty dict. after logging error
AarDG10 Jun 4, 2026
5780a90
fix: decide globals in get_jenv
AarDG10 Jun 4, 2026
535e09f
ci: allow exec_safe state in CI workflows
AarDG10 Jun 4, 2026
6651d63
test: add test for globals override
AarDG10 Jun 4, 2026
2f8f1b9
fix: adapt to new keys in frappe.init() and print_language
AarDG10 Jun 4, 2026
b961f8e
test: extend test_globals_override to chk. globals cache
AarDG10 Jun 4, 2026
4f1cd7d
ci: test w/o exec. globals
AarDG10 Jun 5, 2026
5acf357
fix: return `_dict` as serialized meta
ankush Jun 5, 2026
b008aec
fix: avoid serializing docfields if already dict
ankush Jun 5, 2026
a0b792f
fix: remove enqueue
ankush Jun 5, 2026
5c1e1ee
fix: block QB writes in render
ankush Jun 5, 2026
a776bb7
fix: Make restrict_globals kw only
ankush Jun 5, 2026
a71c980
fix: show calendar events for users in a different timezone than the …
gajjug004 Jun 7, 2026
fc4c0fb
chore: update POT file
frappe-pr-bot Jun 7, 2026
f85357b
fix: attach_print respects doc.letter_head before falling back to def…
Dr-Blank Apr 30, 2026
dd2e832
feat: sync installed_apps list to site_config.json on install/uninstall
rmehta Jun 7, 2026
efae323
Merge pull request #39802 from rmehta/feat/installed-apps-in-site-con…
rmehta Jun 7, 2026
8d38b87
fix: change to lucide icon
sokumon Jun 8, 2026
4a9ffbf
chore: merge conflicts
sokumon Jun 8, 2026
7d2fc4e
Merge pull request #39806 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 8, 2026
a77040a
Update: Workspaces 2026-06-07
AmalSharqIT Jun 8, 2026
bcfdde5
Update: Permissions 2026-06-03
AmalSharqIT Jun 8, 2026
437f560
Update: Customization 2026-06-01
AmalSharqIT Jun 8, 2026
bbe39d1
fix: resolve backport conflict in get_events
gajjug004 Jun 9, 2026
7eb0800
Merge pull request #39794 from frappe/mergify/bp/version-16-hotfix/pr…
gajjug004 Jun 9, 2026
26dd1f6
fix: pass readonly to read_xlsx_file_from_attached_file
ShrihariMahabal Jun 9, 2026
76ae222
Merge pull request #39800 from Zeal-Engineers/mergify/bp/version-16-h…
KerollesFathy Jun 9, 2026
42963eb
fix(DX): allow event handler to be defined without `method` param (#3…
Priyal208 Jun 9, 2026
bd603d3
Merge pull request #39829 from frappe/mergify/bp/version-16-hotfix/pr…
sagarvora Jun 9, 2026
3608fce
fix: custom child table filters dont work in `MultiSelectDialog` (#39…
Priyal208 Jun 9, 2026
3ca5822
Merge pull request #39828 from frappe/mergify/bp/version-16-hotfix/pr…
ShrihariMahabal Jun 9, 2026
e9cec78
Merge pull request #39830 from frappe/mergify/bp/version-16-hotfix/pr…
sagarvora Jun 9, 2026
6601985
refactor: introduce desk entity class
sokumon Jun 5, 2026
3de17b9
feat: get allowed dashboards
sokumon Jun 5, 2026
3a62a5f
chore: rename to desk views
sokumon Jun 7, 2026
b87ceda
refactor: use Desk Views class
sokumon Jun 7, 2026
350a407
fix: remove module check for workspace sidebars
sokumon Jun 7, 2026
71bfa31
fix: don't throw error for permitted charts
sokumon Jun 7, 2026
3fc3db9
refactor: simplify permissions for desktop icon
sokumon Jun 7, 2026
3073444
fix: hide framework icon
sokumon Jun 7, 2026
c352efa
fix: always auto generate the sidebar for module
sokumon Jun 7, 2026
712dba8
fix: rework sidebar setting algorithm
sokumon Jun 8, 2026
f1a8471
fix: remove the need for sidebar module map
sokumon Jun 8, 2026
ca7f487
fix(Table MultiSelect): handle numeric docnames from autoincrement na…
ShrihariMahabal Jun 9, 2026
e0775b0
fix(Link): handle numeric docnames in awesomplete selectcomplete handler
ShrihariMahabal Jun 9, 2026
40334e1
Merge pull request #39845 from frappe/mergify/bp/version-16-hotfix/pr…
ShrihariMahabal Jun 9, 2026
2233e54
update
AmalSharqIT Jun 9, 2026
6894460
fix: reject malformed address headers (#39842) (#39850)
mergify[bot] Jun 10, 2026
e5241a1
fix: pass user to allowed report/doctype permission helpers (#39388)
barredterra May 19, 2026
ff7a404
chore: merge conflicts
sokumon Jun 10, 2026
a4032f9
chore: merge conflicts
sokumon Jun 10, 2026
ef698f4
fix: block cte's
AarDG10 Jun 10, 2026
85dcd9a
Merge pull request #39854 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
34ad81b
fix: recreate missing autoincrement sequences on migrate
ShrihariMahabal Jun 10, 2026
9838717
Merge branch 'version-16-hotfix' into mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
69699cf
Merge pull request #39855 from frappe/mergify/bp/version-16-hotfix/pr…
ShrihariMahabal Jun 10, 2026
5c2314e
chore: merge conflicts
sokumon Jun 10, 2026
4a19091
fix: indention caused during merge conflicts
sokumon Jun 10, 2026
7f6ab23
Merge pull request #39783 from frappe/mergify/bp/version-16-hotfix/pr…
AarDG10 Jun 10, 2026
7c77772
chore: precommit and type hints
sokumon Jun 10, 2026
68d6982
fix: allow users to save their own private workspace without Workspac…
ShrihariMahabal Jun 10, 2026
30557ab
Merge pull request #39859 from frappe/mergify/bp/version-16-hotfix/pr…
ShrihariMahabal Jun 10, 2026
61e148d
Merge pull request #39838 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
d644260
Merge branch 'version-16-hotfix' into mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
07dbe41
chore: merge conflicts
sokumon Jun 10, 2026
04c33f3
chore: merge conflicts
sokumon Jun 10, 2026
c595c46
chore: run precommit
sokumon Jun 10, 2026
bb96b76
perf: Remove pymysql import when using MariaDBClient (#39860) (#39861)
mergify[bot] Jun 10, 2026
a014dd9
fix: remove missing property
sokumon Jun 10, 2026
e4acb6f
feat: support jump to field inside child table row editor
kaulith Jun 4, 2026
a2a746c
refactor: rename dialog grid-form option to keep_grid_form_open
kaulith Jun 9, 2026
2907c96
test: jump to field in grid row
kaulith Jun 9, 2026
cb851ce
Merge pull request #39795 from frappe/pot_version-16-hotfix_2026-06-07
sokumon Jun 10, 2026
dfecad9
Merge pull request #39839 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
57e7de7
Merge pull request #39862 from frappe/mergify/bp/version-16-hotfix/pr…
NagariaHussain Jun 10, 2026
42a2458
chore: merge conflicts
sokumon Jun 10, 2026
377634b
Merge pull request #39840 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
f302066
fix: remove ref doctype check for computing allowed reports
sokumon Jun 10, 2026
a346eaa
chore: merge conflicts
sokumon Jun 10, 2026
118dacb
Merge pull request #39865 from frappe/mergify/bp/version-16-hotfix/pr…
sokumon Jun 10, 2026
b750c67
Merge pull request #39835 from frappe/version-16-hotfix
sokumon Jun 10, 2026
b759439
chore(release): Bumped to Version 16.21.0
frappe-bot Jun 10, 2026
6fe8b3c
fix: disable render safe globals by default
AarDG10 Jun 11, 2026
4960b6e
Merge pull request #39874 from frappe/mergify/bp/version-16/pr-39872
AarDG10 Jun 11, 2026
1f7e72a
chore(release): Bumped to Version 16.21.1
frappe-bot Jun 11, 2026
e1b11a8
feat: add set_column_disp_in_list_view to hide grid columns per-grid
mihir-kandoi Jun 3, 2026
df2f18f
Merge pull request #39880 from frappe/mergify/bp/version-16/pr-39878
mihir-kandoi Jun 11, 2026
567c05b
chore(release): Bumped to Version 16.22.0
frappe-bot Jun 11, 2026
974d558
Merge branch 'version-16' into version-16-frappe
AmalSharqIT Jun 12, 2026
e6ff075
Merge branch 'frappe:version-16' into version-16
AmalSharqIT Jun 12, 2026
da16834
feat: add helper function to FUNCTION_MAPPING (#57)
AmalSharqIT Jun 13, 2026
02c4a73
fix: get_user_match_filters in Report for V16 (#58)
AmalSharqIT Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions .github/workflows/build-and-commit-assets.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Build and Upload Assets

on:
push:
branches:
- develop
- 'version-*'

concurrency:
group: build-assets-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: write

jobs:
build-assets:
name: Build JS/CSS and upload to release
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
path: apps/frappe

- name: Create bench structure
run: |
mkdir -p sites
echo "frappe" > sites/apps.txt

- uses: actions/setup-node@v4
with:
node-version: 24
cache: yarn
cache-dependency-path: apps/frappe/yarn.lock

- name: Install JS dependencies
working-directory: apps/frappe
run: yarn install --frozen-lockfile

- name: Link node_modules into public/
working-directory: apps/frappe
run: ln -s "$PWD/node_modules" frappe/public/node_modules

- name: Build assets (production)
working-directory: apps/frappe
run: yarn run production

- name: Package assets
working-directory: apps/frappe
run: tar czf frappe-assets.tar.gz -C ../../sites/assets/frappe dist

- name: Upload to rolling release
working-directory: apps/frappe
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG="assets-${GITHUB_REF_NAME//\//-}"
gh release create "$TAG" --prerelease --title "Assets: $GITHUB_REF_NAME" --notes "" 2>/dev/null || true
gh release upload "$TAG" frappe-assets.tar.gz --clobber
45 changes: 0 additions & 45 deletions .github/workflows/publish-assets-develop.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/server-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ jobs:
coverage:
name: Coverage Wrap Up
needs: [test, checkrun]
if: ${{ needs.checkrun.outputs.build == 'strawberry' && github.event_name != 'pull_request' }}
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' }}
steps:
- name: Clone
uses: actions/checkout@v6
Expand Down
129 changes: 129 additions & 0 deletions cypress/integration/global_search_settings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
context("Global Search Settings — configure search fields", () => {
const GS_GRID = '.frappe-control[data-fieldname="allowed_in_global_search"]';

/** Editable-grid Link fields only mount after the row is active (toggle_editable_row → make_control). */
function ensure_first_priority_row() {
cy.get(`${GS_GRID} .grid-body`).then(($body) => {
if ($body.find(".grid-row").length === 0) {
cy.get(`${GS_GRID} .grid-add-row`).click();
}
});
cy.get(`${GS_GRID} .grid-body .grid-row[data-idx="1"]`).should("exist");
}

function activate_document_type_cell(rowAlias = "@row") {
cy.get(rowAlias).find('[data-fieldname="document_type"]').click();
cy.get(rowAlias).find('[data-fieldname="document_type"] input').should("exist");
}

/** Awesomplete dropdown is attached via `aria-owns` (often outside the row); items are `div[role="option"]`, not `li`. */
function select_document_type_link(rowAlias, label) {
cy.get(rowAlias).find('[data-fieldname="document_type"] input').as("docTypeInput");
cy.get("@docTypeInput").clear().focus().type(label, { delay: 100 });
cy.get("@docTypeInput").invoke("attr", "aria-owns").should("match", /\w+/);
cy.get("@docTypeInput")
.invoke("attr", "aria-owns")
.then((ownsId) => {
const sel = `#${CSS.escape(ownsId)}`;
cy.get(sel).should("be.visible");
cy.get(sel)
.find('[role="option"]')
.filter((_, el) => {
const $el = Cypress.$(el);
const primary =
$el.find("strong").first().text().trim() ||
$el.text().trim().split("\n")[0];
return primary === label;
})
.should("have.length", 1)
.scrollIntoView()
.click({ force: true });
});
cy.get("@docTypeInput").blur();
cy.get("@docTypeInput").should("have.value", label);
}

beforeEach(() => {
cy.login("Administrator", Cypress.env("adminPassword") || "admin");
cy.visit("/desk/global-search-settings");
cy.get("body").should("have.attr", "data-ajax-state", "complete");
cy.get(`${GS_GRID}`).should("exist");
});

it("shows a message when Configure is clicked without Document Type", () => {
cy.get('.frappe-control[data-fieldname="allowed_in_global_search"]')
.find(".grid-add-row")
.click();
cy.get(
'.frappe-control[data-fieldname="allowed_in_global_search"] .grid-body .grid-row:last'
)
.find('[data-fieldname="configure"] button')
.click();
cy.get(".msgprint").should("contain", "Please select Document Type first");
});

it("opens configure dialog with MultiCheck field options and filter search", () => {
ensure_first_priority_row();
cy.get(`${GS_GRID} .grid-body .grid-row[data-idx="1"]`).as("row");
activate_document_type_cell();
select_document_type_link("@row", "ToDo");

cy.get("@row").find('[data-fieldname="configure"] button').click();

cy.get_open_dialog().find(".modal-title").should("contain", "Configure search fields");
cy.get_open_dialog().should("contain", "ToDo");
cy.get_open_dialog()
.find('.checkbox-options input[type="checkbox"][data-unit="name"]')
.should("exist");

const unlikely = "xyz-nonmatching-global-search-filter-12345";
cy.get_open_dialog().find('[data-element="search"]').clear().type(unlikely);
cy.get_open_dialog()
.find(".checkbox-options .unit-checkbox:visible")
.should("have.length", 0);
cy.get_open_dialog().find('[data-element="search"]').clear();
cy.get_open_dialog()
.find(".checkbox-options .unit-checkbox:visible")
.should((els) => {
expect(els.length).to.be.greaterThan(0);
});

cy.get_open_dialog().find(".btn-modal-close").click();
cy.get(".modal:visible").should("not.exist");
});

it("saves selected fields and shows success toast", () => {
cy.intercept(
"POST",
"/api/method/frappe.desk.doctype.global_search_settings.global_search_settings.update_global_search_fields"
).as("update_global_search_fields");

ensure_first_priority_row();
cy.get(`${GS_GRID} .grid-body .grid-row[data-idx="1"]`).as("row");
activate_document_type_cell();
// Must not be a Core module DocType — API rejects those (no toast; server error).
select_document_type_link("@row", "ToDo");

cy.get("@row").find('[data-fieldname="configure"] button').click();

cy.get_open_dialog()
.find('.checkbox-options input[type="checkbox"][data-unit="name"]')
.should("exist");

cy.get_open_dialog()
.find(".modal-footer .standard-actions .btn-primary")
.contains("Save")
.click({ force: true });

cy.wait("@update_global_search_fields").then(({ response }) => {
expect(response.statusCode).to.eq(200);
expect(response.body.exc, JSON.stringify(response.body)).to.be.undefined;
expect(response.body.message?.success).to.eq(true);
});

cy.get('[role="alert"].desk-alert .alert-message', { timeout: 25000 }).should(
"contain",
"Search fields updated."
);
});
});
86 changes: 86 additions & 0 deletions cypress/integration/grid.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,90 @@ context("Grid", () => {
cy.get("@table-form").find(".grid-footer-toolbar").click();
});
});

it("shows edit button only when child table allow_bulk_edit is enabled", () => {
cy.visit("/desk/contact/Test Contact");
cy.get('.frappe-control[data-fieldname="phone_nos"]').as("table");

cy.window()
.its("cur_frm")
.then((frm) => {
const grid = frm.get_field("phone_nos").grid;
grid.meta.allow_bulk_edit = false;
grid.refresh_edit_rows_button();
});

cy.get("@table").find('.grid-row[data-idx="1"] .grid-row-check').click({ force: true });
cy.get("@table").find(".grid-edit-rows").should("have.class", "hidden");

cy.window()
.its("cur_frm")
.then((frm) => {
const grid = frm.get_field("phone_nos").grid;
grid.meta.allow_bulk_edit = true;
grid.refresh_edit_rows_button();
});

cy.get("@table").find(".grid-edit-rows").should("not.have.class", "hidden");
});

it("bulk edit updates only selected child rows", () => {
const updated_phone = `99999${Date.now().toString().slice(-5)}`;

cy.visit("/desk/contact/Test Contact");
cy.get('.frappe-control[data-fieldname="phone_nos"]').as("table");

cy.window()
.its("cur_frm")
.then((frm) => {
const grid = frm.get_field("phone_nos").grid;
grid.meta.allow_bulk_edit = true;
grid.refresh_edit_rows_button();

expect(frm.doc.phone_nos.length).to.be.greaterThan(1);
const phone_df = grid.docfields.find((df) => df.fieldname === "phone");
expect(phone_df).to.exist;
cy.wrap(phone_df.label).as("phoneFieldLabel");
cy.wrap(frm.doc.phone_nos[1].phone || "").as("secondRowPhoneBefore");
});

cy.get("@table").find('.grid-row[data-idx="1"] .grid-row-check').click({ force: true });
cy.get("@table").find(".grid-edit-rows").click({ force: true });

cy.window()
.its("cur_dialog")
.then((dialog) => {
cy.get("@phoneFieldLabel").then((phoneFieldLabel) => {
return dialog
.set_value("field", phoneFieldLabel)
.then(() => dialog.set_value("value", updated_phone))
.then(() => {
dialog.get_primary_btn().click();
});
});
});

cy.window().its("cur_frm.doc.phone_nos.0.phone").should("eq", updated_phone);
cy.window()
.its("cur_frm")
.then((frm) => {
cy.get("@secondRowPhoneBefore").then((secondRowPhoneBefore) => {
expect(frm.doc.phone_nos[1].phone || "").to.equal(secondRowPhoneBefore);
});
});
});

it("hides add-row and add-multiple-rows buttons when rows are selected", () => {
cy.visit("/desk/contact/Test Contact");
cy.get('.frappe-control[data-fieldname="phone_nos"]').as("table");

cy.get("@table").find('.grid-row[data-idx="1"] .grid-row-check').click({ force: true });

cy.get("@table").find(".grid-add-row").should("have.class", "hidden");
cy.get("@table").find(".grid-add-multiple-rows").should("have.class", "hidden");

cy.get("@table").find('.grid-row[data-idx="1"] .grid-row-check').click({ force: true });

cy.get("@table").find(".grid-add-row").should("not.have.class", "hidden");
});
});
23 changes: 23 additions & 0 deletions cypress/integration/grid_row_form_tabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,29 @@ context("Grid Row Form Tabs", () => {
cy.get("@table-form2").find(".form-tabs .nav-link").first().should("have.class", "active");
});

it("should jump to a field inside the grid row form", () => {
cy.new_form(parent_doctype_name);
cy.fill_field("title", "Test Jump To Field");

// Add a row and open the grid row form
cy.get('.frappe-control[data-fieldname="items"]').as("table");
cy.get("@table").findByRole("button", { name: "Add row" }).click();
cy.get("@table").find('[data-idx="1"]').find(".btn-open-row").click();
cy.get(".grid-row-open").as("table-form");

// Jump to a field that lives on a different tab (Details > Notes)
cy.get("body").type("{esc}").type("{ctrl+j}");
cy.get(".modal input[type='text']").first().focus();
cy.get("body").type("Notes").wait(1000).type("{enter}").wait(200);
cy.findByRole("button", { name: "Go" }).click().wait(500);

// Grid row form stays open and the target field is focused
cy.get(".grid-row-open").should("exist");
cy.get("@table-form")
.find('.frappe-control[data-fieldname="notes"] input')
.should("be.focused");
});

it("should allow data entry in fields across different tabs", () => {
cy.new_form(parent_doctype_name);
cy.fill_field("title", "Test Data Entry");
Expand Down
13 changes: 11 additions & 2 deletions cypress/integration/query_report.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,17 @@ context("Query Report", () => {
.click({ force: true });
cy.get_open_dialog().get(".modal-title").should("contain", "Add Column");
cy.get('select[data-fieldname="doctype"]').select("Role (Name)", { force: true });
cy.get('select[data-fieldname="field"]').select("Role Name", { force: true });
cy.get('select[data-fieldname="insert_after"]').select("Name", { force: true });
cy.wait(500);
cy.get_open_dialog()
.find('.control-input > .awesomplete > input[data-fieldname="field"]')
.should("be.visible")
.clear({ force: true })
.type("Role Name{enter}", { delay: 150, force: true });
cy.get_open_dialog()
.find('.control-input > .awesomplete > input[data-fieldname="insert_after"]')
.should("be.visible")
.clear({ force: true })
.type("Name{enter}", { delay: 150, force: true });
cy.get_open_dialog()
.findByRole("button", { name: "Submit" })
.click({ force: true });
Expand Down
Loading