diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index c647e6af84..e851a50674 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -77,8 +77,6 @@ frappe.ui.form.on("DocType", { istable: (frm) => { if (frm.doc.istable && frm.is_new()) { - frm.set_value("autoname", "autoincrement"); - frm.set_value("allow_rename", 0); frm.set_value("default_view", null); } else if (!frm.doc.istable && !frm.is_new()) { frm.events.set_default_permission(frm); diff --git a/frappe/handler.py b/frappe/handler.py index 30ebe30c9d..0a25f329c7 100644 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -33,6 +33,8 @@ ALLOWED_MIMETYPES = ( "application/vnd.oasis.opendocument.text", "application/vnd.oasis.opendocument.spreadsheet", "text/plain", + "video/quicktime", + "video/mp4", ) diff --git a/frappe/model/document.py b/frappe/model/document.py index d60fae7ab5..773ee4a764 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -193,7 +193,7 @@ class Document(BaseDocument): self.load_from_db() def get_latest(self): - if not hasattr(self, "_doc_before_save"): + if not getattr(self, "_doc_before_save", None): self.load_doc_before_save() return self._doc_before_save diff --git a/frappe/public/js/frappe/form/controls/base_control.js b/frappe/public/js/frappe/form/controls/base_control.js index 9d9c919e97..37cb977fdc 100644 --- a/frappe/public/js/frappe/form/controls/base_control.js +++ b/frappe/public/js/frappe/form/controls/base_control.js @@ -2,12 +2,6 @@ frappe.ui.form.Control = class BaseControl { constructor(opts) { $.extend(this, opts); this.make(); - - // if developer_mode=1, show fieldname as tooltip - if (frappe.boot.user && frappe.boot.developer_mode === 1 && this.$wrapper) { - this.$wrapper.attr("title", __(this.df.fieldname)); - } - if (this.render_input) { this.refresh(); } @@ -19,6 +13,7 @@ frappe.ui.form.Control = class BaseControl { .attr("data-fieldname", this.df.fieldname); this.wrapper = this.$wrapper.get(0); this.wrapper.fieldobj = this; // reference for event handlers + this.$wrapper.append(`${__(this.df.fieldname)}`); } make_wrapper() { diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index e070e1db0b..b425bfd475 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -35,6 +35,7 @@ frappe.ui.form.Layout = class Layout { } this.setup_tab_events(); + this.setup_tooltip_events(); this.render(); } @@ -529,6 +530,19 @@ frappe.ui.form.Layout = class Layout { }); } + setup_tooltip_events() { + $(document).on("keydown", (e) => { + if (e.metaKey || e.ctrlKey) { + this.wrapper.addClass("show-tooltip"); + } + }); + $(document).on("keyup", (e) => { + if (!e.metaKey || !e.ctrlKey) { + this.wrapper.removeClass("show-tooltip"); + } + }); + } + handle_tab(doctype, fieldname, shift) { let grid_row = null, prev = null, diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 76c99652c6..adb4df9d2a 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -1321,7 +1321,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { if (this.list_view_settings && this.list_view_settings.disable_auto_refresh) { return; } - frappe.socketio.list_subscribe(this.doctype); + frappe.socketio.doctype_subscribe(this.doctype); frappe.realtime.on("list_update", (data) => { if (!frappe.get_doc(data?.doctype, data?.name)?.__unsaved) { frappe.model.remove_from_locals(data.doctype, data.name); diff --git a/frappe/public/js/frappe/socketio_client.js b/frappe/public/js/frappe/socketio_client.js index 1ac875544c..792346ed87 100644 --- a/frappe/public/js/frappe/socketio_client.js +++ b/frappe/public/js/frappe/socketio_client.js @@ -129,8 +129,8 @@ frappe.socketio = { task_unsubscribe: function (task_id) { frappe.socketio.socket.emit("task_unsubscribe", task_id); }, - list_subscribe: function (doctype) { - frappe.socketio.socket.emit("list_update", doctype); + doctype_subscribe: function (doctype) { + frappe.socketio.socket.emit("doctype_subscribe", doctype); }, doc_subscribe: function (doctype, docname) { if (frappe.flags.doc_subscribe) { diff --git a/frappe/public/js/frappe/views/reports/report_view.js b/frappe/public/js/frappe/views/reports/report_view.js index f58b06f6cf..cbd9bebcb0 100644 --- a/frappe/public/js/frappe/views/reports/report_view.js +++ b/frappe/public/js/frappe/views/reports/report_view.js @@ -56,7 +56,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { if (this.list_view_settings?.disable_auto_refresh) { return; } - frappe.socketio.list_subscribe(this.doctype); + frappe.socketio.doctype_subscribe(this.doctype); frappe.realtime.on("list_update", (data) => this.on_update(data)); } diff --git a/frappe/public/scss/desk/form.scss b/frappe/public/scss/desk/form.scss index 183c4b9033..b2cb19baf7 100644 --- a/frappe/public/scss/desk/form.scss +++ b/frappe/public/scss/desk/form.scss @@ -1,6 +1,29 @@ @import "../common/form.scss"; @import '~cropperjs/dist/cropper.min'; +.tooltip-content { + position: absolute; + bottom: 104%; + left: 0; + z-index: 9999; + padding: 2px 6px; + border-radius: var(--border-radius-sm); + background: var(--gray-dark); + color: var(--text-dark); + font-size: var(--text-xs); + opacity: 0; + cursor: default; + transition: opacity 0.3s, transform 3s; + pointer-events: none; +} + +.show-tooltip .frappe-control:hover .tooltip-content { + opacity: 1; + transform: translate3d(0,0,0); + pointer-events: auto; +} + + .std-form-layout > .form-layout > .form-page { border-radius: var(--border-radius-md); box-shadow: var(--card-shadow); diff --git a/frappe/realtime.py b/frappe/realtime.py index eff3ea2b77..6283b8eb80 100644 --- a/frappe/realtime.py +++ b/frappe/realtime.py @@ -115,7 +115,7 @@ def can_subscribe_doc(doctype: str, docname: str) -> bool: @frappe.whitelist(allow_guest=True) -def can_subscribe_list(doctype: str) -> bool: +def can_subscribe_doctype(doctype: str) -> bool: from frappe.exceptions import PermissionError if not frappe.has_permission(user=frappe.session.user, doctype=doctype, ptype="read"): diff --git a/frappe/utils/subscription.py b/frappe/utils/subscription.py index 709ac1afae..a1ade0e8b3 100644 --- a/frappe/utils/subscription.py +++ b/frappe/utils/subscription.py @@ -9,7 +9,7 @@ import frappe def remote_login(): try: login_url = frappe.conf.subscription["login_url"] - if frappe.conf.subscription["expiry"] and login_url: + if login_url: resp = requests.post(login_url) if resp.status_code != 200: diff --git a/socketio.js b/socketio.js index 250f3744d1..67746ee84e 100644 --- a/socketio.js +++ b/socketio.js @@ -58,8 +58,8 @@ io.on("connection", function (socket) { socket.join(get_site_room(socket)); } - socket.on("list_update", function (doctype) { - can_subscribe_list({ + socket.on("doctype_subscribe", function (doctype) { + can_subscribe_doctype({ socket, doctype, callback: () => { @@ -286,11 +286,11 @@ function can_subscribe_doc(args) { }); } -function can_subscribe_list(args) { +function can_subscribe_doctype(args) { if (!args) return; if (!args.doctype) return; request - .get(get_url(args.socket, "/api/method/frappe.realtime.can_subscribe_list")) + .get(get_url(args.socket, "/api/method/frappe.realtime.can_subscribe_doctype")) .type("form") .query({ sid: args.socket.sid, @@ -306,7 +306,7 @@ function can_subscribe_list(args) { args.callback && args.callback(err, res); return true; } - log("ERROR (can_subscribe_list): ", err, res); + log("ERROR (can_subscribe_doctype): ", err, res); }); }