From d4c8c3ab0a0092f2ba7747994ef9d8d6e634d296 Mon Sep 17 00:00:00 2001
From: Julian Waller <git@julusian.co.uk>
Date: Sun, 15 Dec 2024 15:58:01 +0000
Subject: [PATCH] feat: edit page names from panel list #3126

---
 webui/src/Buttons/ButtonGridHeader.tsx   |  2 +-
 webui/src/Buttons/ButtonGridPanel.tsx    |  2 +-
 webui/src/Buttons/EditPageProperties.tsx | 35 +++++++++++++-----------
 webui/src/Buttons/Pages.tsx              | 25 +++++++++++++----
 webui/src/Buttons/PagesAddModal.tsx      |  8 ++----
 5 files changed, 43 insertions(+), 29 deletions(-)

diff --git a/webui/src/Buttons/ButtonGridHeader.tsx b/webui/src/Buttons/ButtonGridHeader.tsx
index 391f732aae..61b5c446e2 100644
--- a/webui/src/Buttons/ButtonGridHeader.tsx
+++ b/webui/src/Buttons/ButtonGridHeader.tsx
@@ -47,7 +47,7 @@ export const ButtonGridHeader = observer(function ButtonGridHeader({
 	const pageOptions = useComputed(() => {
 		const pageOptions: SelectOption[] = pagesStore.data.map((value, index) => ({
 			value: index + 1,
-			label: `${index + 1} (${value.name})`,
+			label: value.name ? `${index + 1} (${value.name})` : `${index + 1}`,
 		}))
 
 		if (newPageAtEnd) {
diff --git a/webui/src/Buttons/ButtonGridPanel.tsx b/webui/src/Buttons/ButtonGridPanel.tsx
index cbd17bf4d2..cf0014db1a 100644
--- a/webui/src/Buttons/ButtonGridPanel.tsx
+++ b/webui/src/Buttons/ButtonGridPanel.tsx
@@ -136,7 +136,7 @@ export const ButtonsGridPanel = observer(function ButtonsPage({
 		<KeyReceiver onKeyDown={onKeyDown} tabIndex={0} className="button-grid-panel">
 			<div className="button-grid-panel-header" ref={isInViewRef}>
 				<ConfirmExportModal ref={exportModalRef} title="Export Page" />
-				<EditPagePropertiesModal ref={editRef} />
+				<EditPagePropertiesModal ref={editRef} includeName />
 
 				<h4>Buttons</h4>
 				<p style={{ marginBottom: '0.5rem' }}>
diff --git a/webui/src/Buttons/EditPageProperties.tsx b/webui/src/Buttons/EditPageProperties.tsx
index 627c798eea..256fab4b19 100644
--- a/webui/src/Buttons/EditPageProperties.tsx
+++ b/webui/src/Buttons/EditPageProperties.tsx
@@ -18,11 +18,11 @@ export interface EditPagePropertiesModalRef {
 	show(pageNumber: number, pageInfo: PagesStoreModel | undefined): void
 }
 interface EditPagePropertiesModalProps {
-	// Nothing
+	includeName: boolean
 }
 
 export const EditPagePropertiesModal = forwardRef<EditPagePropertiesModalRef, EditPagePropertiesModalProps>(
-	function EditPagePropertiesModal(_props, ref) {
+	function EditPagePropertiesModal({ includeName }, ref) {
 		const socket = useContext(SocketContext)
 		const [pageNumber, setPageNumber] = useState<number | null>(null)
 		const [show, setShow] = useState(false)
@@ -80,20 +80,23 @@ export const EditPagePropertiesModal = forwardRef<EditPagePropertiesModalRef, Ed
 				</CModalHeader>
 				<CModalBody>
 					<CForm onSubmit={doAction}>
-						<CRow className="mb-3">
-							<CFormLabel htmlFor="colFormName" className="col-sm-3 col-form-label col-form-label-sm">
-								Name
-							</CFormLabel>
-							<CCol sm={9}>
-								<CFormInput
-									ref={inputRef}
-									name="colFormName"
-									type="text"
-									value={pageName || ''}
-									onChange={onNameChange}
-								/>
-							</CCol>
-						</CRow>
+						{includeName && (
+							<CRow className="mb-3">
+								<CFormLabel htmlFor="colFormName" className="col-sm-3 col-form-label col-form-label-sm">
+									Name
+								</CFormLabel>
+								<CCol sm={9}>
+									<CFormInput
+										ref={inputRef}
+										name="colFormName"
+										type="text"
+										value={pageName || ''}
+										onChange={onNameChange}
+									/>
+								</CCol>
+							</CRow>
+						)}
+						{/* TODO: more fields should be added here */}
 					</CForm>
 				</CModalBody>
 				<CModalFooter>
diff --git a/webui/src/Buttons/Pages.tsx b/webui/src/Buttons/Pages.tsx
index 4c3d8a5a39..4d2cbfa1c7 100644
--- a/webui/src/Buttons/Pages.tsx
+++ b/webui/src/Buttons/Pages.tsx
@@ -2,7 +2,7 @@ import React, { useCallback, useContext, useRef } from 'react'
 import { CButton, CButtonGroup, CCol, CRow } from '@coreui/react'
 import { socketEmitPromise } from '../util.js'
 import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faPlus, faTrash, faPencil, faSort, faShareFromSquare } from '@fortawesome/free-solid-svg-icons'
+import { faPlus, faTrash, faSort, faShareFromSquare } from '@fortawesome/free-solid-svg-icons'
 import { GenericConfirmModal, GenericConfirmModalRef } from '../Components/GenericConfirmModal.js'
 import { EditPagePropertiesModal, EditPagePropertiesModalRef } from './EditPageProperties.js'
 import { AddPagesModal, AddPagesModalRef } from './PagesAddModal.js'
@@ -10,6 +10,7 @@ import { RootAppStoreContext } from '../Stores/RootAppStore.js'
 import { observer } from 'mobx-react-lite'
 import { PagesStoreModel } from '../Stores/PagesStore.js'
 import { useDrag, useDrop } from 'react-dnd'
+import { TextInputField } from '../Components/TextInputField.js'
 
 interface PagesListProps {
 	setPageNumber: (page: number) => void
@@ -80,7 +81,7 @@ export const PagesList = observer(function PagesList({ setPageNumber }: PagesLis
 				<CCol xs={12}>
 					<GenericConfirmModal ref={deleteRef} />
 					<AddPagesModal ref={addRef} />
-					<EditPagePropertiesModal ref={editRef} />
+					<EditPagePropertiesModal ref={editRef} includeName={false} />
 
 					<table className="table table-responsive-sm pages-list-table">
 						<thead>
@@ -154,12 +155,21 @@ const PageListRow = observer(function PageListRow({
 	info,
 	pageCount,
 	goToPage,
-	configurePage,
+	// configurePage,
 	doInsertPage,
 	doDeletePage,
 }: PageListRowProps) {
 	const { socket } = useContext(RootAppStoreContext)
 
+	const changeName = useCallback(
+		(newName: string) => {
+			socketEmitPromise(socket, 'pages:set-name', [pageNumber, newName ?? '']).catch((e) => {
+				console.error('Failed to set name', e)
+			})
+		},
+		[socket, pageNumber]
+	)
+
 	const ref = useRef<HTMLTableRowElement>(null)
 	const [, drop] = useDrop<PageListDragItem>({
 		accept: PAGE_LIST_DRAG_ID,
@@ -207,13 +217,16 @@ const PageListRow = observer(function PageListRow({
 				<FontAwesomeIcon icon={faSort} />
 			</td>
 			<td style={{ width: 80, textAlign: 'center', fontWeight: 'bold' }}>{pageNumber}</td>
-			<td>{info.name ?? ''}</td>
+			<td>
+				<TextInputField value={info.name ?? ''} setValue={changeName} placeholder="Unnamed page" />
+			</td>
 			<td style={{ width: 100, textAlign: 'right' }}>
 				<CButtonGroup>
 					<CButton color="secondary" size="sm" onClick={goToPage} title="Jump to page" data-page={pageNumber}>
 						<FontAwesomeIcon icon={faShareFromSquare} />
 					</CButton>
-					<CButton
+					{/* <CButton
+						TODO: for future use, once the modal has more properties
 						color="info"
 						size="sm"
 						onClick={configurePage}
@@ -222,7 +235,7 @@ const PageListRow = observer(function PageListRow({
 						data-page-info={JSON.stringify(info)}
 					>
 						<FontAwesomeIcon icon={faPencil} />
-					</CButton>
+					</CButton> */}
 					<CButton color="warning" size="sm" onClick={doInsertPage} title="Insert page above" data-page={pageNumber}>
 						<FontAwesomeIcon icon={faPlus} />
 					</CButton>
diff --git a/webui/src/Buttons/PagesAddModal.tsx b/webui/src/Buttons/PagesAddModal.tsx
index b56b298ef8..ad64585de0 100644
--- a/webui/src/Buttons/PagesAddModal.tsx
+++ b/webui/src/Buttons/PagesAddModal.tsx
@@ -12,8 +12,6 @@ export interface AddPagesModalRef {
 	show(beforePageNumber: number): void
 }
 
-const DEFAULT_PAGE_NAME = 'New Page'
-
 interface ModalState {
 	show: boolean
 
@@ -25,7 +23,7 @@ const defaultState: ModalState = {
 	show: false,
 
 	beforePage: 1,
-	names: [DEFAULT_PAGE_NAME],
+	names: [''],
 }
 
 export const AddPagesModal = forwardRef<AddPagesModalRef, AddPagesModalProps>(function AddPagesModal({}, ref) {
@@ -90,7 +88,7 @@ export const AddPagesModal = forwardRef<AddPagesModalRef, AddPagesModalProps>(fu
 		if (!isNaN(pageNumber)) {
 			setState((oldState) => {
 				const newNames = [...oldState.names]
-				newNames.splice(pageNumber, 0, DEFAULT_PAGE_NAME)
+				newNames.splice(pageNumber, 0, '')
 				return { ...oldState, names: newNames }
 			})
 		}
@@ -176,7 +174,7 @@ function AddPageRow({ index, name, canDelete, changeName, doInsertPage, doDelete
 	return (
 		<tr>
 			<td>
-				<CFormInput type="text" value={name} onChange={changeName} data-page={index} />
+				<CFormInput type="text" value={name} onChange={changeName} data-page={index} placeholder="Unnamed page" />
 			</td>
 			<td style={{ width: 50, textAlign: 'right' }}>
 				<CButtonGroup>