diff --git a/frontend/ee b/frontend/ee index 3b2d439f68..8ed7be478b 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit 3b2d439f681f3879da6663f4c9b6d30deffc0380 +Subproject commit 8ed7be478b266e8b812ce1d3c43f2cb7e2ee3d07 diff --git a/frontend/src/AppBuilder/AppCanvas/AppCanvas.jsx b/frontend/src/AppBuilder/AppCanvas/AppCanvas.jsx index b48143f383..2cd94143c7 100644 --- a/frontend/src/AppBuilder/AppCanvas/AppCanvas.jsx +++ b/frontend/src/AppBuilder/AppCanvas/AppCanvas.jsx @@ -8,7 +8,13 @@ import './appCanvas.scss'; import useStore from '@/AppBuilder/_stores/store'; import { shallow } from 'zustand/shallow'; import { computeViewerBackgroundColor, getCanvasWidth } from './appCanvasUtils'; -import { NO_OF_GRIDS } from './appCanvasConstants'; +import { + LEFT_SIDEBAR_WIDTH, + NO_OF_GRIDS, + PAGES_SIDEBAR_WIDTH_COLLAPSED, + PAGES_SIDEBAR_WIDTH_EXPANDED, + RIGHT_SIDEBAR_WIDTH, +} from './appCanvasConstants'; import cx from 'classnames'; import FreezeVersionInfo from '@/AppBuilder/Header/FreezeVersionInfo'; import { computeCanvasContainerHeight } from '../_helpers/editorHelpers'; @@ -134,7 +140,7 @@ export const AppCanvas = ({ appId, isViewer = false, switchDarkMode, darkMode }) width: currentMode === 'edit' ? `calc(100% - 96px)` : '100%', alignItems: 'unset', justifyContent: 'unset', - borderRight: currentMode === 'edit' && isRightSidebarOpen && '299' + 'px solid', + borderRight: currentMode === 'edit' && isRightSidebarOpen && `300px solid ${canvasBgColor}`, padding: currentMode === 'edit' && '8px', paddingBottom: currentMode === 'edit' && '2px', }; @@ -152,15 +158,34 @@ export const AppCanvas = ({ appId, isViewer = false, switchDarkMode, darkMode }) const shouldAdjust = isSidebarOpen || (isRightSidebarOpen && currentMode === 'edit'); if (!shouldAdjust) return ''; - let offset; - if (isViewerSidebarPinned) { - offset = position === 'side' ? '352px' : '126px'; + if (isViewerSidebarPinned && !isPagesSidebarHidden) { + if (position === 'side' && isSidebarOpen && isRightSidebarOpen && !isPagesSidebarHidden) { + offset = `${LEFT_SIDEBAR_WIDTH + RIGHT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_EXPANDED}px`; + } else if (position === 'side' && isSidebarOpen && !isRightSidebarOpen && !isPagesSidebarHidden) { + offset = `${LEFT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_EXPANDED}px`; + } else if (position === 'side' && isRightSidebarOpen && !isSidebarOpen && !isPagesSidebarHidden) { + offset = `${RIGHT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_EXPANDED}px`; + } } else { - offset = position === 'side' ? '171px' : '126px'; + if (position === 'side' && isSidebarOpen && isRightSidebarOpen && !isPagesSidebarHidden) { + offset = `${LEFT_SIDEBAR_WIDTH + RIGHT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_COLLAPSED}px`; + } else if (position === 'side' && isSidebarOpen && !isRightSidebarOpen && !isPagesSidebarHidden) { + offset = `${LEFT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_COLLAPSED}px`; + } else if (position === 'side' && isRightSidebarOpen && !isSidebarOpen && !isPagesSidebarHidden) { + offset = `${RIGHT_SIDEBAR_WIDTH - PAGES_SIDEBAR_WIDTH_COLLAPSED}px`; + } } - return `calc(100vw - ${offset})`; + if ((position === 'top' || isPagesSidebarHidden) && isSidebarOpen && isRightSidebarOpen) { + offset = `${LEFT_SIDEBAR_WIDTH + RIGHT_SIDEBAR_WIDTH}px`; + } else if ((position === 'top' || isPagesSidebarHidden) && isSidebarOpen && !isRightSidebarOpen) { + offset = `${LEFT_SIDEBAR_WIDTH}px`; + } else if ((position === 'top' || isPagesSidebarHidden) && isRightSidebarOpen && !isSidebarOpen) { + offset = `${RIGHT_SIDEBAR_WIDTH}px`; + } + + return `calc(100% + ${offset})`; } return ( @@ -177,7 +202,7 @@ export const AppCanvas = ({ appId, isViewer = false, switchDarkMode, darkMode }) 'canvas-container d-flex page-container', { 'dark-theme theme-dark': isAppDarkMode, close: !isViewerSidebarPinned }, { 'overflow-x-auto': currentMode === 'edit' }, - { 'position-top': position === 'top' }, + { 'position-top': position === 'top' || isPagesSidebarHidden }, { 'overflow-x-hidden': moduleId !== 'canvas' } // Disbling horizontal scroll for modules in view mode )} style={canvasContainerStyles} diff --git a/frontend/src/AppBuilder/AppCanvas/appCanvas.scss b/frontend/src/AppBuilder/AppCanvas/appCanvas.scss index 66e5d622dd..fea79195c5 100644 --- a/frontend/src/AppBuilder/AppCanvas/appCanvas.scss +++ b/frontend/src/AppBuilder/AppCanvas/appCanvas.scss @@ -26,6 +26,7 @@ .empty-box-cont{ display: flex; justify-content: center; + margin: unset !important; .dotted-cont{ border: 1px dashed var(--indigo8); diff --git a/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js b/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js index 9553504441..0d3fa570e3 100644 --- a/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js +++ b/frontend/src/AppBuilder/AppCanvas/appCanvasConstants.js @@ -14,9 +14,13 @@ export const DEFAULT_CANVAS_WIDTH = 1292; export const APP_HEADER_HEIGHT = 47; -export const LEFT_SIDEBAR_WIDTH = 348; // exclusive of border +export const LEFT_SIDEBAR_WIDTH = 350; -export const RIGHT_SIDEBAR_WIDTH = 299; +export const RIGHT_SIDEBAR_WIDTH = 300; + +export const PAGES_SIDEBAR_WIDTH_EXPANDED = 226; + +export const PAGES_SIDEBAR_WIDTH_COLLAPSED = 44; export const SUBCONTAINER_WIDGETS = ['Container', 'Tabs', 'Listview', 'Kanban', 'Form']; diff --git a/frontend/src/AppBuilder/AppCanvas/useSidebarMargin.js b/frontend/src/AppBuilder/AppCanvas/useSidebarMargin.js index d80cbd76cc..df94532289 100644 --- a/frontend/src/AppBuilder/AppCanvas/useSidebarMargin.js +++ b/frontend/src/AppBuilder/AppCanvas/useSidebarMargin.js @@ -9,6 +9,7 @@ const useSidebarMargin = (canvasContainerRef) => { const { moduleId } = useModuleContext(); const [editorMarginLeft, setEditorMarginLeft] = useState(0); const isSidebarOpen = useStore((state) => state.isSidebarOpen, shallow); + const isRightSidebarOpen = useStore((state) => state.isRightSidebarOpen, shallow); const mode = useStore((state) => state.modeStore.modules[moduleId].currentMode, shallow); useEffect(() => { @@ -17,10 +18,10 @@ const useSidebarMargin = (canvasContainerRef) => { }, [isSidebarOpen, mode]); useEffect(() => { - if (!isEmpty(canvasContainerRef?.current)) { + if (!isEmpty(canvasContainerRef?.current) && isSidebarOpen && canvasContainerRef.current.scrollLeft === 0) { canvasContainerRef.current.scrollLeft += editorMarginLeft; } - }, [editorMarginLeft, canvasContainerRef]); + }, [editorMarginLeft, canvasContainerRef, isSidebarOpen]); return editorMarginLeft; }; diff --git a/frontend/src/AppBuilder/LeftSidebar/GlobalSettings/index.jsx b/frontend/src/AppBuilder/LeftSidebar/GlobalSettings/index.jsx index 9f8379f85c..341ed07652 100644 --- a/frontend/src/AppBuilder/LeftSidebar/GlobalSettings/index.jsx +++ b/frontend/src/AppBuilder/LeftSidebar/GlobalSettings/index.jsx @@ -31,7 +31,6 @@ const GlobalSettings = ({ darkMode }) => {
-
Canvas Styles diff --git a/frontend/src/AppBuilder/QueryPanel/QueryPanel.jsx b/frontend/src/AppBuilder/QueryPanel/QueryPanel.jsx index efba1741b4..ac854f4716 100644 --- a/frontend/src/AppBuilder/QueryPanel/QueryPanel.jsx +++ b/frontend/src/AppBuilder/QueryPanel/QueryPanel.jsx @@ -155,6 +155,7 @@ export const QueryPanel = ({ darkMode }) => { justifyContent: 'space-between', alignItems: 'center', zIndex: 2, + width: '100%', }} >
{ const selectedComponentId = useStore((state) => state.selectedComponents?.[0], shallow); const activeTab = useStore((state) => state.activeRightSideBarTab, shallow); - const toggleRightSidebarPin = useStore((state) => state.toggleRightSidebarPin); - const isRightSidebarPinned = useStore((state) => state.isRightSidebarPinned); + const setRightSidebarOpen = useStore((state) => state.setRightSidebarOpen); const setActiveRightSideBarTab = useStore((state) => state.setActiveRightSideBarTab); + + const handleToggle = () => { + setActiveRightSideBarTab(null); + setRightSidebarOpen(false); + }; if (!selectedComponentId && activeTab !== RIGHT_SIDE_BAR_TAB.PAGES) { // return setActiveRightSideBarTab(RIGHT_SIDE_BAR_TAB.COMPONENTS); return ( <>
Component properties
-
toggleRightSidebarPin()}> - +
+
@@ -39,6 +43,7 @@ export const ComponentConfigurationTab = ({ darkMode, isModuleEditor }) => { selectedComponentId={selectedComponentId} pages={[]} isModuleEditor={isModuleEditor} + handleRightSidebarToggle={handleToggle} /> ); }; diff --git a/frontend/src/AppBuilder/RightSideBar/ComponentManagerTab/ComponentsManagerTab.jsx b/frontend/src/AppBuilder/RightSideBar/ComponentManagerTab/ComponentsManagerTab.jsx index a6c7db5e52..0c4d1c92ab 100644 --- a/frontend/src/AppBuilder/RightSideBar/ComponentManagerTab/ComponentsManagerTab.jsx +++ b/frontend/src/AppBuilder/RightSideBar/ComponentManagerTab/ComponentsManagerTab.jsx @@ -74,8 +74,10 @@ export const ComponentsManagerTab = ({ darkMode, isModuleEditor }) => { } }, [hasModuleAccess, activeTab]); - const toggleRightSidebarPin = useStore((state) => state.toggleRightSidebarPin); - const isRightSidebarPinned = useStore((state) => state.isRightSidebarPinned); + const setRightSidebarOpen = useStore((state) => state.setRightSidebarOpen); + const activeRightSideBarTab = useStore((state) => state.activeRightSideBarTab); + const setActiveRightSideBarTab = useStore((state) => state.setActiveRightSideBarTab); + const isRightSidebarOpen = useStore((state) => state.isRightSidebarOpen); const handleSearchQueryChange = useCallback( debounce((value) => { @@ -88,6 +90,11 @@ export const ComponentsManagerTab = ({ darkMode, isModuleEditor }) => { [activeTab] ); + const handleToggle = () => { + setActiveRightSideBarTab(null); + setRightSidebarOpen(false); + }; + const filterComponents = useCallback((value) => { if (value !== '') { const fuse = new Fuse(componentList, { @@ -223,11 +230,16 @@ export const ComponentsManagerTab = ({ darkMode, isModuleEditor }) => { return (
- {isModuleEditor ? ( -

Components

- ) : ( - - )} +
+ {isModuleEditor ? ( +

Components

+ ) : ( + + )} +
+ +
+
{ +export const Inspector = ({ + componentDefinitionChanged, + darkMode, + pages, + selectedComponentId, + handleRightSidebarToggle, +}) => { const allComponents = useStore((state) => state.getCurrentPageComponents()); const setComponentProperty = useStore((state) => state.setComponentProperty, shallow); const setComponentName = useStore((state) => state.setComponentName, shallow); @@ -528,19 +534,19 @@ export const Inspector = ({ componentDefinitionChanged, darkMode, pages, selecte
-
clearSelectedComponents()}> +
clearSelectedComponents()}>
-
{renderAppNameInput()}
+
{renderAppNameInput()}
{!isModuleContainer && ( <> -
+
)} +
+ +
{renderTabs()}
diff --git a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/AddNewPageMenu.jsx b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/AddNewPageMenu.jsx index 261ab9d0d1..7e6ee48539 100644 --- a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/AddNewPageMenu.jsx +++ b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/AddNewPageMenu.jsx @@ -20,7 +20,7 @@ export function AddNewPageMenu({ darkMode, isLicensed }) { }; return ( -
+
@@ -344,6 +381,9 @@ export const RenderPageAndPageGroup = ({ darkMode={darkMode} linkRefs={linkRefs} isSidebarPinned={isSidebarPinned} + isExpanded={expandedPageGroupId === page.id} + onToggle={handleAccordionToggle} + onPageClick={closeAllAccordions} /> ); @@ -360,6 +400,7 @@ export const RenderPageAndPageGroup = ({ homePageId={homePageId} linkRefs={linkRefs} isSidebarPinned={isSidebarPinned} + onPageClick={closeAllAccordions} /> ); } diff --git a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageGroupItem.jsx b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageGroupItem.jsx index 8913fb860c..b748724a68 100644 --- a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageGroupItem.jsx +++ b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageGroupItem.jsx @@ -138,7 +138,7 @@ export const PageGroupItem = memo(({ page, index, collapsed, onCollapse, highlig >
{ handleOpenPopup('group', page); diff --git a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageMenuItem.jsx b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageMenuItem.jsx index 0ea8161aa5..6d0a971f63 100644 --- a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageMenuItem.jsx +++ b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PageMenuItem.jsx @@ -72,7 +72,7 @@ export const PageMenuItem = withRouter( const icon = (props) => { const iconName = isHomePage && !page.icon ? 'IconHome2' : page.icon; // eslint-disable-next-line import/namespace - const Icon = Icons?.[iconName] ?? Icons?.['IconFileDescription']; + const Icon = Icons?.[iconName] ?? Icons?.['IconFile']; return ( @@ -269,7 +269,6 @@ export const PageMenuItem = withRouter( return ''; } - return (
setIsHovered(true)} @@ -281,7 +280,7 @@ export const PageMenuItem = withRouter( <>
{' '}
- {icon()} - +
{icon()}
+ {page.name} - - {PAGE_TYPES[page?.type]} - + {PAGE_TYPES[page?.type] && ( // If 'page' object has a 'type' property like 'URL' + {PAGE_TYPES[page?.type]} + )} {isHomePage && (
diff --git a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagePermission.jsx b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagePermission.jsx index 160a941ebe..054325f9ab 100644 --- a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagePermission.jsx +++ b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagePermission.jsx @@ -22,9 +22,9 @@ export default function PagePermission({ darkMode }) { const togglePagePermissionModal = useStore((state) => state.togglePagePermissionModal); const editingPage = useStore((state) => state.editingPage); const appId = useStore((state) => state.appStore.modules[moduleId].app.appId); - const selectedUserGroups = useStore((state) => state.selectedUserGroups); + const selectedUserGroups = useStore((state) => state.appPermission.selectedUserGroups); const setSelectedUserGroups = useStore((state) => state.setSelectedUserGroups); - const selectedUsers = useStore((state) => state.selectedUsers); + const selectedUsers = useStore((state) => state.appPermission.selectedUsers); const setSelectedUsers = useStore((state) => state.setSelectedUsers); const pagePermission = useStore((state) => state.pagePermission); const setPagePermission = useStore((state) => state.setPagePermission); @@ -353,7 +353,7 @@ export default function PagePermission({ darkMode }) { const UserGroupSelect = () => { const { moduleId } = useModuleContext(); const appId = useStore((state) => state.appStore.modules[moduleId].app.appId); - const selectedUserGroups = useStore((state) => state.selectedUserGroups); + const selectedUserGroups = useStore((state) => state.appPermission.selectedUserGroups); const setSelectedUserGroups = useStore((state) => state.setSelectedUserGroups); const [userGroups, setUserGroups] = useState([]); useEffect(() => { @@ -415,7 +415,7 @@ const UserSelect = () => { const { moduleId } = useModuleContext(); const appId = useStore((state) => state.appStore.modules[moduleId].app.appId); const editingPage = useStore((state) => state.editingPage); - const selectedUsers = useStore((state) => state.selectedUsers); + const selectedUsers = useStore((state) => state.appPermission.selectedUsers); const setSelectedUsers = useStore((state) => state.setSelectedUsers); const [users, setUsers] = useState([]); useEffect(() => { diff --git a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagesSidebarNavigation.jsx b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagesSidebarNavigation.jsx index 03f129d32c..072ca62774 100644 --- a/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagesSidebarNavigation.jsx +++ b/frontend/src/AppBuilder/RightSideBar/PageSettingsTab/PageMenu/PagesSidebarNavigation.jsx @@ -34,7 +34,7 @@ export const PagesSidebarNavigation = ({ const { moduleId } = useModuleContext(); const { definition: { styles = {}, properties = {} } = {} } = useStore((state) => state.pageSettings) || {}; const selectedVersionName = useStore((state) => state.selectedVersion?.name); - const currentMode = useStore((state) => state.currentMode); + const currentMode = useStore((state) => state.modeStore.modules[moduleId].currentMode); const selectedEnvironmentName = useStore((state) => state.selectedEnvironment?.name); const homePageId = useStore((state) => state.appStore.modules[moduleId].app.homePageId); const license = useStore((state) => state.license); @@ -266,6 +266,10 @@ export const PagesSidebarNavigation = ({ const headerHidden = isLicensed ? hideHeader : false; const isPagesSidebarHidden = resolveReferences(disableMenu?.value); + if (hideHeader && hideLogo && isPagesSidebarHidden) { + return null; + } + return (