diff --git a/crm/hooks.py b/crm/hooks.py
index a1996f4b..e652e3e1 100644
--- a/crm/hooks.py
+++ b/crm/hooks.py
@@ -293,7 +293,14 @@ standard_dropdown_items = [
"label": "Settings",
"type": "Route",
"icon": "settings",
- "route": "#",
+ "route": "#",
+ "is_standard": 1,
+ },
+ {
+ "name1": "login_to_fc",
+ "label": "Login to Frappe Cloud",
+ "type": "Route",
+ "route": "#",
"is_standard": 1,
},
{
@@ -307,7 +314,7 @@ standard_dropdown_items = [
"label": "Log out",
"type": "Route",
"icon": "log-out",
- "route": "#",
+ "route": "#",
"is_standard": 1,
},
]
diff --git a/crm/www/crm.py b/crm/www/crm.py
index f980091e..c630506f 100644
--- a/crm/www/crm.py
+++ b/crm/www/crm.py
@@ -3,6 +3,7 @@
import frappe
+from frappe.integrations.frappe_providers.frappecloud_billing import is_fc_site
from frappe.utils import cint, get_system_timezone
from frappe.utils.telemetry import capture
@@ -36,6 +37,7 @@ def get_boot():
"setup_complete": cint(frappe.get_system_settings("setup_complete")),
"sysdefaults": frappe.defaults.get_defaults(),
"is_demo_site": frappe.conf.get("is_demo_site"),
+ "is_fc_site": is_fc_site(),
"timezone": {
"system": get_system_timezone(),
"user": frappe.db.get_value("User", frappe.session.user, "time_zone")
diff --git a/frappe-ui b/frappe-ui
index e01b1ee3..33c9907a 160000
--- a/frappe-ui
+++ b/frappe-ui
@@ -1 +1 @@
-Subproject commit e01b1ee305a0207413cd67ed7345578440c503db
+Subproject commit 33c9907aa9163d8d3b84f23dc2a2c829e4d8c6f1
diff --git a/frontend/package.json b/frontend/package.json
index 88fa0c76..bb53389b 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,7 +14,7 @@
"@vueuse/core": "^10.3.0",
"@vueuse/integrations": "^10.3.0",
"feather-icons": "^4.28.0",
- "frappe-ui": "^0.1.110",
+ "frappe-ui": "^0.1.111",
"gemoji": "^8.1.0",
"lodash": "^4.17.21",
"mime": "^4.0.1",
diff --git a/frontend/src/components/Icons/FrappeCloudIcon.vue b/frontend/src/components/Icons/FrappeCloudIcon.vue
new file mode 100644
index 00000000..2126bb92
--- /dev/null
+++ b/frontend/src/components/Icons/FrappeCloudIcon.vue
@@ -0,0 +1,23 @@
+
+
+
diff --git a/frontend/src/components/Layouts/AppSidebar.vue b/frontend/src/components/Layouts/AppSidebar.vue
index e44ae5ca..cf9ea854 100644
--- a/frontend/src/components/Layouts/AppSidebar.vue
+++ b/frontend/src/components/Layouts/AppSidebar.vue
@@ -73,6 +73,7 @@
+
import BrandLogo from '@/components/BrandLogo.vue'
+import FrappeCloudIcon from '@/components/Icons/FrappeCloudIcon.vue'
import Apps from '@/components/Apps.vue'
import { sessionStore } from '@/stores/session'
import { usersStore } from '@/stores/users'
import { getSettings } from '@/stores/settings'
import { showSettings, isMobileView } from '@/composables/settings'
+import { confirmLoginToFrappeCloud } from '@/composables/frappecloud'
import { Dropdown } from 'frappe-ui'
import { theme, toggleTheme } from '@/stores/theme'
import { computed, h, markRaw } from 'vue'
@@ -156,6 +158,13 @@ function getStandardItem(item) {
onClick: () => (showSettings.value = true),
condition: () => !isMobileView.value,
}
+ case 'login_to_fc':
+ return {
+ icon: h(FrappeCloudIcon),
+ label: __(item.label),
+ onClick: () => confirmLoginToFrappeCloud(),
+ condition: () => !isMobileView.value && window.is_fc_site,
+ }
case 'logout':
return {
icon: item.icon,
diff --git a/frontend/src/composables/frappecloud.js b/frontend/src/composables/frappecloud.js
new file mode 100644
index 00000000..f36fcdc4
--- /dev/null
+++ b/frontend/src/composables/frappecloud.js
@@ -0,0 +1,45 @@
+import { globalStore } from '@/stores/global'
+import { createResource } from 'frappe-ui'
+import { ref } from 'vue'
+
+const baseEndpoint = ref('https://frappecloud.com')
+const siteName = ref('')
+
+export const currentSiteInfo = createResource({
+ url: 'frappe.integrations.frappe_providers.frappecloud_billing.current_site_info',
+ cache: 'currentSiteInfo',
+ onSuccess: (data) => {
+ baseEndpoint.value = data.base_url
+ siteName.value = data.site_name
+ },
+})
+
+export const confirmLoginToFrappeCloud = () => {
+ currentSiteInfo.fetch()
+
+ const { $dialog } = globalStore()
+
+ $dialog({
+ title: __('Login to Frappe Cloud?'),
+ message: __(
+ 'Are you sure you want to login to your Frappe Cloud dashboard?',
+ ),
+ actions: [
+ {
+ label: __('Confirm'),
+ variant: 'solid',
+ onClick(close) {
+ loginToFrappeCloud()
+ close()
+ },
+ },
+ ],
+ })
+}
+
+const loginToFrappeCloud = () => {
+ window.open(
+ `${baseEndpoint.value}/dashboard/sites/${siteName.value}`,
+ '_blank',
+ )
+}
diff --git a/yarn.lock b/yarn.lock
index 25bbca56..77758d1f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2388,10 +2388,10 @@ fraction.js@^4.3.7:
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
-frappe-ui@^0.1.110:
- version "0.1.110"
- resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.110.tgz#dbe02d294cb0aeb0a4c1b3000682093c309450ae"
- integrity sha512-kFah6SoPauULXaeSbljNUq595/82VmY4k4+KA8zi4sXxpn4sXYi12qUl/1I8GOBhsCQQizmoh46DO7e/uU2M1A==
+frappe-ui@^0.1.111:
+ version "0.1.111"
+ resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.111.tgz#c7615aa8f02da9af0596074352150d813d0f4b3d"
+ integrity sha512-JCh/SQwcbsQQxTZIFFzEULPgp2QAQZe+vwrM2jqekIx4dBgYW2H1KgXSlf+uO2ng2vqk4Q1MiStA3svHQEXsLQ==
dependencies:
"@headlessui/vue" "^1.7.14"
"@popperjs/core" "^2.11.2"