diff --git a/frappe/public/js/frappe/ui/toolbar/about.js b/frappe/public/js/frappe/ui/toolbar/about.js index 9a52f45a74..242546f762 100644 --- a/frappe/public/js/frappe/ui/toolbar/about.js +++ b/frappe/public/js/frappe/ui/toolbar/about.js @@ -1,78 +1,156 @@ frappe.provide("frappe.ui.misc"); frappe.ui.misc.about = function () { - if (!frappe.ui.misc.about_dialog) { - var d = new frappe.ui.Dialog({ title: __("Frappe Framework") }); - - $(d.body).html( - repl( - `
-

${__("Open Source Applications for the Web")}

-

- ${__("Website")}: - https://frappeframework.com

-

- ${__("Source")}: - https://github.com/frappe

-

- Frappe School: https://frappe.school

-

- Linkedin: https://linkedin.com/company/frappe-tech

-

- Twitter: https://twitter.com/frappetech

-

- YouTube: https://www.youtube.com/@frappetech

-
-

${__("Installed Apps")}

-
${__("Loading versions...")}
-

- - - ${__("Dependencies & Licenses")} - - -

-
-

${__("© Frappe Technologies Pvt. Ltd. and contributors")}

-
`, - frappe.app - ) - ); - - frappe.ui.misc.about_dialog = d; - - frappe.ui.misc.about_dialog.on_page_show = function () { - if (!frappe.versions) { - frappe.call({ - method: "frappe.utils.change_log.get_versions", - callback: function (r) { - show_versions(r.message); - }, - }); - } else { - show_versions(frappe.versions); - } - }; - - var show_versions = function (versions) { - var $wrap = $("#about-app-versions").empty(); - $.each(Object.keys(versions).sort(), function (i, key) { - var v = versions[key]; - let text; - if (v.branch) { - text = $.format("

{0}: v{1} ({2})

", [ - v.title, - v.branch_version || v.version, - v.branch, - ]); - } else { - text = $.format("

{0}: v{1}

", [v.title, v.version]); - } - $(text).appendTo($wrap); - }); - - frappe.versions = versions; - }; + if (frappe.ui.misc.about_dialog) { + frappe.ui.misc.about_dialog.show(); + return; } + const dialog = new frappe.ui.Dialog({ title: __("Frappe Framework") }); + + $(dialog.body).html( + `
+

${__("Open Source Applications for the Web")}

+ +

+ + ${__("Website")}: + https://frappe.io/ +

+ +

+ + ${__("Source Code")}: + https://github.com/frappe +

+ +

+ + ${__("Frappe Blog")}: + https://frappe.io/blog +

+ +

+ + ${__("Frappe Forum")}: + https://discuss.frappe.io +

+ +

+ + ${__("LinkedIn")}: + https://linkedin.com/company/frappe-tech +

+ +

+ + + + X: + https://x.com/frappetech +

+ +

+ + ${__("YouTube")}: + https://www.youtube.com/@frappetech +

+ +

+ + ${__("Instagram")}: + https://www.instagram.com/frappetech +

+ +
+ +
+

${__("Installed Apps")}

+ +
+ +
${__("Loading versions...")}
+

+ + + ${__("Dependencies & Licenses")} + + +

+ +
+ +

${__("© Frappe Technologies Pvt. Ltd. and contributors")}

+
` + ); + + frappe.ui.misc.about_dialog = dialog; + + frappe.ui.misc.about_dialog.on_page_show = function () { + if (!frappe.versions) { + frappe.call({ + method: "frappe.utils.change_log.get_versions", + callback: function (r) { + show_versions(r.message); + }, + }); + } else { + show_versions(frappe.versions); + } + }; + + const show_versions = function (versions) { + const $wrap = $("#about-app-versions").empty(); + let app = {}; + + function get_version_text(app) { + if (app.branch) { + return `v${app.branch_version || app.version} (${app.branch})`; + } else { + return `v${app.version}`; + } + } + + for (const app_name in versions) { + app = versions[app_name]; + const title = `${app_name}: ${app.branch_version || app.version}`; + const text = `

+ ${app.title}: ${get_version_text(app)} +

`; + $(text).appendTo($wrap); + } + + frappe.versions = versions; + + if (frappe.versions) { + $(dialog.body).find("#copy-apps-info").removeClass("hidden"); + } + }; + + const code_block = (snippet, lang = "") => "```" + lang + "\n" + snippet + "\n```"; + + // Listener for copying installed apps info + $(dialog.body).on("click", "#copy-apps-info", function () { + if (!frappe.versions) return; + + const versions = Object.entries(frappe.versions).reduce((acc, [key, app]) => { + acc[key] = app.branch_version || app.version; + return acc; + }, {}); + + frappe.utils.copy_to_clipboard(code_block(JSON.stringify(versions, null, "\t"), "json")); + }); + + // Listener for copy app version + $(dialog.body).on("click", ".app-version", function () { + const title = $(this).attr("title"); + if (title) { + frappe.utils.copy_to_clipboard(title); + } + }); + frappe.ui.misc.about_dialog.show(); };