From 5bfbd5a7a052d9da0af513cea2ec697388a11542 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 15 Jun 2023 20:42:03 +0200 Subject: [PATCH] Refined navigation design in AdminX refs. https://github.com/TryGhost/Team/issues/3432 --- .../src/admin-x-ds/assets/icons/add.svg | 1 + .../src/admin-x-ds/assets/icons/hamburger.svg | 1 + .../src/admin-x-ds/global/form/TextField.tsx | 56 +++++++++++-------- .../components/settings/site/DesignModal.tsx | 11 +--- .../settings/site/NavigationModal.tsx | 25 +++++++-- .../site/navigation/NavigationEditor.tsx | 20 ++++--- .../site/navigation/NavigationItemEditor.tsx | 27 +++++++-- ghost/admin-x-settings/src/utils/helpers.ts | 9 ++- 8 files changed, 97 insertions(+), 53 deletions(-) create mode 100644 ghost/admin-x-settings/src/admin-x-ds/assets/icons/add.svg create mode 100644 ghost/admin-x-settings/src/admin-x-ds/assets/icons/hamburger.svg diff --git a/ghost/admin-x-settings/src/admin-x-ds/assets/icons/add.svg b/ghost/admin-x-settings/src/admin-x-ds/assets/icons/add.svg new file mode 100644 index 0000000000..682a97bf43 --- /dev/null +++ b/ghost/admin-x-settings/src/admin-x-ds/assets/icons/add.svg @@ -0,0 +1 @@ +add \ No newline at end of file diff --git a/ghost/admin-x-settings/src/admin-x-ds/assets/icons/hamburger.svg b/ghost/admin-x-settings/src/admin-x-ds/assets/icons/hamburger.svg new file mode 100644 index 0000000000..39ad1359f3 --- /dev/null +++ b/ghost/admin-x-settings/src/admin-x-ds/assets/icons/hamburger.svg @@ -0,0 +1 @@ +navigation-menu \ No newline at end of file diff --git a/ghost/admin-x-settings/src/admin-x-ds/global/form/TextField.tsx b/ghost/admin-x-settings/src/admin-x-ds/global/form/TextField.tsx index 4bd228d58a..fdcac083da 100644 --- a/ghost/admin-x-settings/src/admin-x-ds/global/form/TextField.tsx +++ b/ghost/admin-x-settings/src/admin-x-ds/global/form/TextField.tsx @@ -17,6 +17,8 @@ interface TextFieldProps { onBlur?: (event: React.FocusEvent) => void; className?: string; maxLength?: number; + containerClassName?: string; + unstyled?: boolean; } const TextField: React.FC = ({ @@ -33,33 +35,43 @@ const TextField: React.FC = ({ onBlur, className = '', maxLength, + containerClassName = '', + unstyled = false, ...props }) => { const id = useId(); - return ( -
- {title && {title}} - - {hint && {hint}} -
+ const textFieldClasses = !unstyled && clsx( + 'h-10 border-b py-2', + clearBg ? 'bg-transparent' : 'bg-grey-75 px-[10px]', + error ? `border-red` : `border-grey-500 hover:border-grey-700 focus:border-black`, + (title && !hideTitle && !clearBg) && `mt-2`, + className ); + + const field = ; + + if (title || hint) { + return ( +
+ {title && {title}} + {field} + {hint && {hint}} +
+ ); + } else { + return field; + } }; export default TextField; diff --git a/ghost/admin-x-settings/src/components/settings/site/DesignModal.tsx b/ghost/admin-x-settings/src/components/settings/site/DesignModal.tsx index e34d8b37d7..85c5079bb9 100644 --- a/ghost/admin-x-settings/src/components/settings/site/DesignModal.tsx +++ b/ghost/admin-x-settings/src/components/settings/site/DesignModal.tsx @@ -6,11 +6,11 @@ import TabView, {Tab} from '../../../admin-x-ds/global/TabView'; import ThemePreview from './designAndBranding/ThemePreview'; import ThemeSettings from './designAndBranding/ThemeSettings'; import useForm from '../../../hooks/useForm'; -import {CustomThemeSetting, Post, Setting, SettingValue, SiteData} from '../../../types/api'; +import {CustomThemeSetting, Post, Setting, SettingValue} from '../../../types/api'; import {PreviewModalContent} from '../../../admin-x-ds/global/modal/PreviewModal'; import {ServicesContext} from '../../providers/ServiceProvider'; import {SettingsContext} from '../../providers/SettingsProvider'; -import {getSettingValues} from '../../../utils/helpers'; +import {getHomepageUrl, getSettingValues} from '../../../utils/helpers'; const Sidebar: React.FC<{ brandSettings: BrandSettingValues @@ -47,13 +47,6 @@ const Sidebar: React.FC<{ ); }; -function getHomepageUrl(siteData: SiteData): string { - const url = new URL(siteData.url); - const subdir = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`; - - return `${url.origin}${subdir}`; -} - const DesignModal: React.FC = () => { const modal = useModal(); diff --git a/ghost/admin-x-settings/src/components/settings/site/NavigationModal.tsx b/ghost/admin-x-settings/src/components/settings/site/NavigationModal.tsx index 7f9845091b..26907a0ab4 100644 --- a/ghost/admin-x-settings/src/components/settings/site/NavigationModal.tsx +++ b/ghost/admin-x-settings/src/components/settings/site/NavigationModal.tsx @@ -1,7 +1,7 @@ -import Heading from '../../../admin-x-ds/global/Heading'; import Modal from '../../../admin-x-ds/global/modal/Modal'; import NavigationEditor from './navigation/NavigationEditor'; import NiceModal, {useModal} from '@ebay/nice-modal-react'; +import TabView from '../../../admin-x-ds/global/TabView'; import useSettingGroup from '../../../hooks/useSettingGroup'; import {NavigationItem} from './navigation/NavigationItemEditor'; import {getSettingValues} from '../../../utils/helpers'; @@ -26,7 +26,8 @@ const NavigationModal = NiceModal.create(() => { modal.remove()} onOk={async () => { @@ -34,10 +35,22 @@ const NavigationModal = NiceModal.create(() => { modal.remove(); }} > - Primary navigation - updateSetting('navigation', JSON.stringify(items))} /> - Secondary navigation - updateSetting('secondary_navigation', JSON.stringify(items))} /> +
+ updateSetting('navigation', JSON.stringify(items))} /> + }, + { + id: 'secondary-nav', + title: 'Secondary navigation', + contents: updateSetting('secondary_navigation', JSON.stringify(items))} /> + } + ]} + /> +
); }); diff --git a/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationEditor.tsx b/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationEditor.tsx index 0457d21137..77ae381c21 100644 --- a/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationEditor.tsx +++ b/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationEditor.tsx @@ -31,7 +31,6 @@ const SortableItem: React.FC<{ (items.map((item, index) => ({...item, id: index.toString()}))); - const [newItem, setNewItem] = useState({label: '', url: ''}); + const [newItem, setNewItem] = useState({label: '', url: baseUrl}); const [draggingId, setDraggingId] = useState(null); const setDraggableItems = (newItems: DraggableItem[]) => { @@ -62,8 +61,10 @@ const NavigationEditor: React.FC<{ }; const addItem = () => { - setDraggableItems(draggableItems.concat({...newItem, id: draggableItems.length.toString()})); - setNewItem({label: '', url: ''}); + if (newItem.label && newItem.url) { + setDraggableItems(draggableItems.concat({...newItem, id: draggableItems.length.toString()})); + setNewItem({label: '', url: baseUrl}); + } }; const removeItem = (id: string) => { @@ -79,7 +80,7 @@ const NavigationEditor: React.FC<{ setDraggingId(null); }; - return
+ return
moveItem(event.active.id as string, event.over?.id as string)} @@ -105,10 +106,11 @@ const NavigationEditor: React.FC<{ -
- setNewItem({...newItem, label: e.target.value})} /> - setNewItem({...newItem, url: e.target.value})} /> -
; }; diff --git a/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationItemEditor.tsx b/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationItemEditor.tsx index 34fda202a9..f2d37575b0 100644 --- a/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationItemEditor.tsx +++ b/ghost/admin-x-settings/src/components/settings/site/navigation/NavigationItemEditor.tsx @@ -1,4 +1,5 @@ import Button from '../../../../admin-x-ds/global/Button'; +import Icon from '../../../../admin-x-ds/global/Icon'; import React, {forwardRef, useEffect, useState} from 'react'; import TextField from '../../../../admin-x-ds/global/form/TextField'; import clsx from 'clsx'; @@ -101,14 +102,28 @@ const NavigationItemEditor = forwardRef - - updateItem?.({label: e.target.value})} /> - setUrlValue(e.target.value)} /> -
); }); diff --git a/ghost/admin-x-settings/src/utils/helpers.ts b/ghost/admin-x-settings/src/utils/helpers.ts index e7a61a87f6..fd09f6a1c3 100644 --- a/ghost/admin-x-settings/src/utils/helpers.ts +++ b/ghost/admin-x-settings/src/utils/helpers.ts @@ -1,4 +1,4 @@ -import {Setting, SettingValue, User} from '../types/api'; +import {Setting, SettingValue, SiteData, User} from '../types/api'; export interface IGhostPaths { adminRoot: string; @@ -92,3 +92,10 @@ export function downloadFile(url: string) { iframe.setAttribute('src', url); } + +export function getHomepageUrl(siteData: SiteData): string { + const url = new URL(siteData.url); + const subdir = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`; + + return `${url.origin}${subdir}`; +} \ No newline at end of file