From 25ada62b68ef96112f489fd393bf7ead4345e5e8 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Fri, 20 Feb 2026 16:06:47 +0530 Subject: [PATCH 1/8] fix: use set_value to avoid stale state --- frappe/public/js/frappe/ui/tag_editor.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frappe/public/js/frappe/ui/tag_editor.js b/frappe/public/js/frappe/ui/tag_editor.js index 391a336820..4c52e08c69 100644 --- a/frappe/public/js/frappe/ui/tag_editor.js +++ b/frappe/public/js/frappe/ui/tag_editor.js @@ -41,6 +41,12 @@ frappe.ui.TagEditor = class TagEditor { var user_tags = me.user_tags ? me.user_tags.split(",") : []; user_tags.push(tag); me.user_tags = user_tags.join(","); + frappe.model.set_value( + me.frm.doctype, + me.frm.docname, + "_user_tags", + me.user_tags + ); me.on_change && me.on_change(me.user_tags); frappe.tags.utils.fetch_tags(); }, @@ -56,6 +62,12 @@ frappe.ui.TagEditor = class TagEditor { var user_tags = me.user_tags.split(","); user_tags.splice(user_tags.indexOf(tag), 1); me.user_tags = user_tags.join(","); + frappe.model.set_value( + me.frm.doctype, + me.frm.docname, + "_user_tags", + me.user_tags + ); me.on_change && me.on_change(me.user_tags); frappe.tags.utils.fetch_tags(); }, From ece49ca7d605c074989007c184cb4abc39d96040 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sat, 21 Feb 2026 12:25:06 +0530 Subject: [PATCH 2/8] fix: misc. kanban fixes fixes the bug where 1st tag was skipped removes the upper limit to displayed tags in ui for kanban view --- frappe/public/js/frappe/list/list_view.js | 13 +++++++------ .../js/frappe/views/kanban/kanban_board.bundle.js | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 4fcd01514b..58b5f92d8a 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -1079,7 +1079,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { } } - get_tags_html(user_tags, limit, colored = false) { + get_tags_html(user_tags, limit = null, colored = false) { let get_tag_html = (tag) => { let color = "", style = ""; @@ -1092,11 +1092,12 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { return `
${tag}
`; } }; - return user_tags - .split(",") - .slice(1, limit + 1) - .map(get_tag_html) - .join(""); + user_tags = (user_tags || "").split(","); + if (limit !== null) { + // if there is a limit apply it + user_tags = user_tags.slice(0, limit); + } + return user_tags.map(get_tag_html).join(""); } get_meta_html(doc) { diff --git a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js index 8c661290f6..ef558b3c9c 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js +++ b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js @@ -758,9 +758,9 @@ frappe.provide("frappe.views"); function get_tags_html(card) { return card.tags ? `
- ${cur_list.get_tags_html(card.tags, 3, true)} + ${cur_list.get_tags_html(card.tags, null, true)}
` - : ""; + : ""; // no upper limit to tags } function render_card_meta() { From c9fa834e1d5bd40afa39ca642ae2e06174fc9c4a Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sat, 21 Feb 2026 16:28:44 +0530 Subject: [PATCH 3/8] refactor: modularize the code --- frappe/public/js/frappe/ui/tag_editor.js | 26 ++++++++---------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/frappe/public/js/frappe/ui/tag_editor.js b/frappe/public/js/frappe/ui/tag_editor.js index 4c52e08c69..860eab9a87 100644 --- a/frappe/public/js/frappe/ui/tag_editor.js +++ b/frappe/public/js/frappe/ui/tag_editor.js @@ -18,6 +18,12 @@ frappe.ui.TagEditor = class TagEditor { this.initialized = true; this.refresh(this.user_tags); } + update_user_tags(tags_string) { + this.user_tags = tags_string; + frappe.model.set_value(this.frm.doctype, this.frm.docname, "_user_tags", this.user_tags); + this.on_change && this.on_change(this.user_tags); + frappe.tags.utils.fetch_tags(); + } setup_tags() { var me = this; @@ -40,15 +46,7 @@ frappe.ui.TagEditor = class TagEditor { callback: function (r) { var user_tags = me.user_tags ? me.user_tags.split(",") : []; user_tags.push(tag); - me.user_tags = user_tags.join(","); - frappe.model.set_value( - me.frm.doctype, - me.frm.docname, - "_user_tags", - me.user_tags - ); - me.on_change && me.on_change(me.user_tags); - frappe.tags.utils.fetch_tags(); + me.update_user_tags(user_tags.join(",")); }, }); } @@ -61,15 +59,7 @@ frappe.ui.TagEditor = class TagEditor { callback: function (r) { var user_tags = me.user_tags.split(","); user_tags.splice(user_tags.indexOf(tag), 1); - me.user_tags = user_tags.join(","); - frappe.model.set_value( - me.frm.doctype, - me.frm.docname, - "_user_tags", - me.user_tags - ); - me.on_change && me.on_change(me.user_tags); - frappe.tags.utils.fetch_tags(); + me.update_user_tags(user_tags.join(",")); }, }); } From bd5a71726cc0e0fea539fb089b074631edca5e41 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sun, 15 Mar 2026 12:54:56 +0530 Subject: [PATCH 4/8] fix(UI): better tag display in kanban board Adds a +3 pill which, when hovered upon, displays rest of the tags. The current tags displayed on the card is capped at 3. Co-authored-by: Suraj Shetty --- .../views/kanban/kanban_board.bundle.js | 25 ++++++++-- frappe/public/scss/desk/kanban.scss | 50 +++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js index ef558b3c9c..671e543ab3 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js +++ b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js @@ -756,11 +756,26 @@ frappe.provide("frappe.views"); } function get_tags_html(card) { - return card.tags - ? `
- ${cur_list.get_tags_html(card.tags, null, true)} -
` - : ""; // no upper limit to tags + if (!card.tags) return ""; + const tags_array = card.tags.split(","); + const limit = 3; // cap. at 3 tags + const visible_tags = tags_array.slice(0, limit).join(","); + const hidden_tags = tags_array.slice(limit).join(","); + const hidden_tags_html = cur_list.get_tags_html(hidden_tags, null, true); + const hidden_count = tags_array.length - limit; + let html = `
+ ${cur_list.get_tags_html(visible_tags, null, true)}`; + + if (hidden_count > 0) { + html += ` + + +${hidden_count} + ${hidden_tags_html} + `; + } + + html += `
`; + return html; } function render_card_meta() { diff --git a/frappe/public/scss/desk/kanban.scss b/frappe/public/scss/desk/kanban.scss index 2e4678a089..be04f987f0 100644 --- a/frappe/public/scss/desk/kanban.scss +++ b/frappe/public/scss/desk/kanban.scss @@ -330,6 +330,56 @@ width: 100%; line-height: 400px; } + + .kanban-tags .more-tags { + cursor: pointer; + + .hidden-tags { + position: absolute; + + bottom: 70px; + + left: 50%; + transform: translateX(-50%); + + background: var(--card-bg); + border: 1px solid var(--border-color); + padding: 10px; + border-radius: var(--border-radius-md); + box-shadow: var(--shadow-lg); + + display: flex; + flex-wrap: wrap; + justify-content: center; + + width: calc(100% - 24px); + max-width: 220px; + + gap: 6px; + opacity: 0; + pointer-events: none; + z-index: 1000; + + .tag-pill { + margin: 0 !important; + white-space: nowrap; + } + } + + &:hover .hidden-tags { + opacity: 1; + transform: translateX(-50%) translateY(-5px); + pointer-events: auto; + } + } + + .kanban-card-wrapper:hover { + z-index: 1001; + } + + .kanban-cards { + overflow: visible !important; + } } body[data-route*="Kanban"] { From dfee4d73c5063e6e58cd7aa5724e7e85cc1840a8 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sun, 15 Mar 2026 16:44:42 +0530 Subject: [PATCH 5/8] fix(UI): fix previous changes to hover effect and make title width 100% Co-authored-by: Suraj Shetty --- frappe/public/scss/desk/kanban.scss | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/frappe/public/scss/desk/kanban.scss b/frappe/public/scss/desk/kanban.scss index be04f987f0..2e1a72d593 100644 --- a/frappe/public/scss/desk/kanban.scss +++ b/frappe/public/scss/desk/kanban.scss @@ -186,7 +186,8 @@ .kanban-title-area { margin-bottom: 12px; - max-width: 90%; + width: 100%; + max-width: 100%; font-size: var(--text-md); font-weight: 500; @@ -377,8 +378,15 @@ z-index: 1001; } - .kanban-cards { - overflow: visible !important; + .kanban-card-wrapper:first-child { + .hidden-tags { + bottom: auto; + top: 65%; + } + + &:hover .hidden-tags { + transform: translateX(-50%) translateY(5px); + } } } From a4cf368d2acf452b2f21468ed2c28ea35cd529e4 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sun, 15 Mar 2026 18:47:01 +0530 Subject: [PATCH 6/8] fix(UI): add line clamp property to kanban card title Co-authored-by: Suraj Shetty --- frappe/public/scss/desk/kanban.scss | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frappe/public/scss/desk/kanban.scss b/frappe/public/scss/desk/kanban.scss index 2e1a72d593..b1cedf0157 100644 --- a/frappe/public/scss/desk/kanban.scss +++ b/frappe/public/scss/desk/kanban.scss @@ -191,6 +191,18 @@ font-size: var(--text-md); font-weight: 500; + .kanban-card-title, + .kanban-card-doc { + white-space: normal !important; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + line-clamp: 2; + overflow: hidden; + text-overflow: ellipsis; + word-break: break-word; + } + .kanban-card-doc { .text-muted div { display: inline; From 7f25c1bc2ba0f39fbd55549215875fc53e8c87a9 Mon Sep 17 00:00:00 2001 From: AarDG10 Date: Sun, 15 Mar 2026 19:01:11 +0530 Subject: [PATCH 7/8] fix(UI): better bubble positioning on hover Co-authored-by: Suraj Shetty --- frappe/public/scss/desk/kanban.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/public/scss/desk/kanban.scss b/frappe/public/scss/desk/kanban.scss index b1cedf0157..251e824c8d 100644 --- a/frappe/public/scss/desk/kanban.scss +++ b/frappe/public/scss/desk/kanban.scss @@ -393,7 +393,6 @@ .kanban-card-wrapper:first-child { .hidden-tags { bottom: auto; - top: 65%; } &:hover .hidden-tags { From 416ce1db001fe5defbafa60978f235cbaaaad40c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 18 Mar 2026 09:17:42 +0530 Subject: [PATCH 8/8] fix(UI): Avoid text selection while dragging a card - Avoid text selection while dragging a card by using native drag - Center align text in the pill --- frappe/public/js/frappe/views/kanban/kanban_board.bundle.js | 4 ---- frappe/public/scss/desk/tags.scss | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js index 671e543ab3..b8a7660a76 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js +++ b/frappe/public/js/frappe/views/kanban/kanban_board.bundle.js @@ -589,8 +589,6 @@ frappe.provide("frappe.views"); group: "cards", animation: 150, dataIdAttr: "data-name", - forceFallback: true, - fallbackTolerance: 20, onStart: function () { wrapper.find(".kanban-card.add-card").fadeOut(200, function () { wrapper.find(".kanban-cards").height("100vh"); @@ -599,7 +597,6 @@ frappe.provide("frappe.views"); onEnd: function (e) { wrapper.find(".kanban-card.add-card").fadeIn(100); wrapper.find(".kanban-cards").height("auto"); - // update order const args = { name: decodeURIComponent($(e.item).attr("data-name")), from_colname: $(e.from) @@ -611,7 +608,6 @@ frappe.provide("frappe.views"); }; store.dispatch("update_order_for_single_card", args); }, - onAdd: function () {}, }); } diff --git a/frappe/public/scss/desk/tags.scss b/frappe/public/scss/desk/tags.scss index 895206f140..a14da7c3bb 100644 --- a/frappe/public/scss/desk/tags.scss +++ b/frappe/public/scss/desk/tags.scss @@ -1,10 +1,10 @@ .tag-pill { background-color: var(--gray-200); border-radius: var(--border-radius); - display: inline-block; - padding: 3px 10px; + display: inline-flex; + padding: 4px 10px; + align-items: center; color: var(--text-muted); - height: 24px; width: 60px; vertical-align: middle; }