Add comment to doctype from js

how can I add comment to a doc from js? (I need to add comment to a doc on its submission, from js). I tried cur_frm.add_comment, cur_frm.cscript.add_comment, doc.add_comment, this.add_comment and none of them were recognized.

1 Like

cur_frm.comments.insert_comment("Comment","My Comment")

2 Likes

Thanks a lot @saurabh6790

@saurabh6790 how about python?

You can do this by writing a whitelisted function . and write code as in below in server side

d = frappe.get_doc(‘Opportunity’, name)
#to add a new comment
d.add_comment(‘Comment’,text=‘Test Comment’)

it will add a new comment ‘Test Comment’ in Opportunity and doc.name=name

2 Likes

I think v14 doesn’t support that.

I wanted to add a comment from a dialog. Here’s my hack:

function add_comment(frm, title='Add a Comment'){
    // return new Promise((resolve, reject) => {
		const dialog = new frappe.ui.Dialog({
			title: __(title),
			fields: [],
		});
		
		// Create a container for the comment box
		const commentBoxWrapper = $('<div class="comment-box" style="margin-top:25px;"></div>').appendTo(dialog.body);
		
		// Initialize the comment box
		const commentBox = frappe.ui.form.make_control({
			parent: commentBoxWrapper[0], // Ensure the DOM element is passed
			render_input: true,
			only_input: true,
			enable_mentions: true,
			df: {
				fieldtype: "Comment",
				fieldname: "comment",
			},
			on_submit: (comment) => {
				if (strip_html(comment).trim() !== "" || comment.includes("img")) {
					commentBox.disable();
					frappe
						.xcall("frappe.desk.form.utils.add_comment", {
							reference_doctype: frm.doc.doctype,
							reference_name: frm.doc.name,
							content: comment,
							comment_email: frappe.session.user,
							comment_by: frappe.session.user_fullname,
						})
						.then((new_comment) => {
							cur_frm.reload_doc();
							
							// Close the dialog
							dialog.hide();
							// resolve(true); // Comment successfully added
						})
						.catch((error) => {
                            frappe.msgprint(__('Failed to add comment.'));
                            // reject(new Error(error));
                        })
						.finally(() => {
							commentBox.enable();
						});
				} else {
					frappe.msgprint(__('Please enter a valid comment.'));
					// reject(new Error('Invalid comment'));
				}
			},
		});
		
		// Render and display the comment box
		commentBox.refresh();
		
		// Customizations after rendering
		setTimeout(() => {
			const modal = dialog.$wrapper.find('.modal-content');
			if (modal.length && window.innerWidth >= 768) {
				modal.css({
					width: '800px',
					left: '50%',
					transform: 'translateX(-50%)'
				});
			}
			const box = dialog.$wrapper.find('.comment-box');
			if (box.length && window.innerWidth >= 768) {
				box.css({
					'margin': '20px',
					'margin-top': '25px'
				});
			}
			
			// Remove the .comment-input-header
			const header = commentBoxWrapper.find('.comment-input-header');
			if (header.length) {
				header.remove();
			}
		
			// Adjust the input box height to display 3 lines
			const editor = commentBoxWrapper.find('.ql-editor');
			if (editor.length) {
				editor.css({
					height: '5em', // Adjust height for ~3 lines
					overflowY: 'auto',
				});
			}
		}, 100);
		
		// Show the dialog
		dialog.show();	
	});
}

It’s a pretty nice dialog

  • it adapts on desktop/mobile
  • it allows tagging users using ‘@’
  • it reuses the comment field elements and hacks it a bit

Simply call it from anywhere like so

add_comment(frm, 'title string');
1 Like