mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-20 22:49:18 +00:00
feat: wip for form
This commit is contained in:
@@ -80,6 +80,14 @@ export async function postAliases(data: Alias[]) {
|
|||||||
return axios.post(`${ontimeURL}/aliases`, data);
|
return axios.post(`${ontimeURL}/aliases`, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description HTTP request to update aliases
|
||||||
|
* @return {Promise}
|
||||||
|
*/
|
||||||
|
export async function updateAliases(data: Partial<Alias>) {
|
||||||
|
return axios.put(`${ontimeURL}/aliases`, data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description HTTP request to retrieve user fields
|
* @description HTTP request to retrieve user fields
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ type Aliases = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default function UrlAliasList() {
|
export default function UrlAliasList() {
|
||||||
const { data, status, isFetching } = useAliases();
|
const { data, status, isFetching, refetch } = useAliases();
|
||||||
|
|
||||||
// const { emitError } = useEmitLog();
|
// const { emitError } = useEmitLog();
|
||||||
const {
|
const {
|
||||||
@@ -43,6 +43,10 @@ export default function UrlAliasList() {
|
|||||||
}
|
}
|
||||||
}, [data, reset]);
|
}, [data, reset]);
|
||||||
|
|
||||||
|
const handleRefetch = async () => {
|
||||||
|
await refetch();
|
||||||
|
};
|
||||||
|
|
||||||
// const onReset = () => {
|
// const onReset = () => {
|
||||||
// reset({ aliases: data });
|
// reset({ aliases: data });
|
||||||
// };
|
// };
|
||||||
@@ -62,9 +66,6 @@ export default function UrlAliasList() {
|
|||||||
const disableInputs = status === 'pending';
|
const disableInputs = status === 'pending';
|
||||||
// const hasTooManyOptions = fields.length >= 20;
|
// const hasTooManyOptions = fields.length >= 20;
|
||||||
|
|
||||||
console.log('bolama');
|
|
||||||
console.log({ isFetching });
|
|
||||||
|
|
||||||
if (isFetching) {
|
if (isFetching) {
|
||||||
return <ModalLoader />;
|
return <ModalLoader />;
|
||||||
}
|
}
|
||||||
@@ -86,6 +87,7 @@ export default function UrlAliasList() {
|
|||||||
alias={alias.alias}
|
alias={alias.alias}
|
||||||
enabled={alias.enabled}
|
enabled={alias.enabled}
|
||||||
pathAndParams={alias.pathAndParams}
|
pathAndParams={alias.pathAndParams}
|
||||||
|
onRefetch={handleRefetch}
|
||||||
key={alias.id}
|
key={alias.id}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,82 +1,78 @@
|
|||||||
|
import { useCallback, useMemo, useState } from 'react';
|
||||||
import { IconButton, Menu, MenuButton, MenuItem, MenuList, Switch } from '@chakra-ui/react';
|
import { IconButton, Menu, MenuButton, MenuItem, MenuList, Switch } from '@chakra-ui/react';
|
||||||
import { IoEllipsisHorizontal } from '@react-icons/all-files/io5/IoEllipsisHorizontal';
|
import { IoEllipsisHorizontal } from '@react-icons/all-files/io5/IoEllipsisHorizontal';
|
||||||
|
|
||||||
export type EditMode = 'rename' | 'duplicate' | null;
|
import { updateAliases } from '../../../../common/api/ontimeApi';
|
||||||
|
|
||||||
interface UrlAliasListItemProps {
|
interface UrlAliasListItemProps {
|
||||||
alias: string;
|
alias: string;
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
pathAndParams: string;
|
pathAndParams: string;
|
||||||
// onToggleEditMode: (editMode: EditMode, filename: string | null) => void;
|
onRefetch: () => Promise<void>;
|
||||||
// onSubmit: () => void;
|
|
||||||
// onRefetch: () => Promise<void>;
|
|
||||||
// editingFilename: string | null;
|
|
||||||
// editingMode: EditMode | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function UrlAliasListItem({ alias, enabled, pathAndParams }: UrlAliasListItemProps) {
|
export default function UrlAliasListItem({ alias, enabled, pathAndParams, onRefetch }: UrlAliasListItemProps) {
|
||||||
// const [submitError, setSubmitError] = useState<string | null>(null);
|
const [isEditing, setIsEditing] = useState(false);
|
||||||
|
|
||||||
// const handleSubmitRename = async (values: ProjectFormValues) => {
|
const handleToggle = useCallback(async () => {
|
||||||
// try {
|
// TODO: Error handling
|
||||||
// setSubmitError(null);
|
await updateAliases({
|
||||||
|
alias,
|
||||||
|
enabled: !enabled,
|
||||||
|
pathAndParams,
|
||||||
|
});
|
||||||
|
|
||||||
// if (!values.filename) {
|
await onRefetch();
|
||||||
// setSubmitError('Filename cannot be blank');
|
}, [alias, enabled, onRefetch, pathAndParams]);
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// await renameProject(filename, values.filename);
|
|
||||||
// await onRefetch();
|
|
||||||
// onSubmit();
|
|
||||||
// } catch (error) {
|
|
||||||
// setSubmitError(maybeAxiosError(error));
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
||||||
// const handleSubmitDuplicate = async (values: ProjectFormValues) => {
|
const handleToggleEditMode = useCallback(() => {
|
||||||
// try {
|
setIsEditing(!isEditing);
|
||||||
// setSubmitError(null);
|
}, [isEditing]);
|
||||||
|
|
||||||
// if (!values.filename) {
|
const handleRenderAliases = useMemo(() => {
|
||||||
// setSubmitError('Filename cannot be blank');
|
if (!isEditing) {
|
||||||
// return;
|
return (
|
||||||
// }
|
<>
|
||||||
// await duplicateProject(filename, values.filename);
|
<td
|
||||||
// await onRefetch();
|
style={{
|
||||||
// onSubmit();
|
width: '45%',
|
||||||
// } catch (error) {
|
}}
|
||||||
// setSubmitError(maybeAxiosError(error));
|
>
|
||||||
// }
|
{alias}
|
||||||
// };
|
</td>
|
||||||
|
<td
|
||||||
// const handleToggleEditMode = (editMode: EditMode, filename: string | null) => {
|
style={{
|
||||||
// setSubmitError(null);
|
width: '45%',
|
||||||
// onToggleEditMode(editMode, filename);
|
}}
|
||||||
// };
|
>
|
||||||
|
{pathAndParams}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<Switch variant='ontime-on-light' isChecked={enabled} onChange={handleToggle} />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ActionMenu onChangeEditMode={handleToggleEditMode} />
|
||||||
|
</td>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Return a form
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, [alias, enabled, handleToggle, handleToggleEditMode, isEditing, pathAndParams]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr key={alias}>
|
<tr key={alias}>
|
||||||
<td>{alias}</td>
|
{handleRenderAliases}
|
||||||
<td>{pathAndParams}</td>
|
|
||||||
<td>
|
|
||||||
<Switch
|
|
||||||
variant='ontime-on-light'
|
|
||||||
defaultValue={enabled}
|
|
||||||
// isDisabled={disableInputs}
|
|
||||||
/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<ActionMenu />
|
|
||||||
</td>
|
|
||||||
{/* <td>{new Date(updatedAt).toLocaleString()}</td>
|
{/* <td>{new Date(updatedAt).toLocaleString()}</td>
|
||||||
<td className={style.actionButton}></td> */}
|
<td className={style.actionButton}></td> */}
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ActionMenu() {
|
function ActionMenu({ onChangeEditMode }: { onChangeEditMode: () => void }) {
|
||||||
const handleRename = () => {
|
const handleEdit = () => {
|
||||||
// onChangeEditMode('rename', filename);
|
onChangeEditMode();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDelete = async () => {
|
const handleDelete = async () => {
|
||||||
@@ -94,7 +90,7 @@ function ActionMenu() {
|
|||||||
size='sm'
|
size='sm'
|
||||||
/>
|
/>
|
||||||
<MenuList>
|
<MenuList>
|
||||||
<MenuItem onClick={handleRename}>Edit</MenuItem>
|
<MenuItem onClick={handleEdit}>Edit</MenuItem>
|
||||||
<MenuItem onClick={handleDelete}>Delete</MenuItem>
|
<MenuItem onClick={handleDelete}>Delete</MenuItem>
|
||||||
</MenuList>
|
</MenuList>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|||||||
@@ -189,6 +189,34 @@ export const postAliases = async (req: Request, res: Response) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Update controller for PUT request to '/ontime/aliases'
|
||||||
|
// Returns ACK message
|
||||||
|
export const updateAliases = async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
const { alias, enabled, pathAndParams } = req.body;
|
||||||
|
|
||||||
|
const aliases = DataProvider.getAliases();
|
||||||
|
|
||||||
|
const index = aliases.findIndex((a) => a.alias === alias);
|
||||||
|
|
||||||
|
if (index === -1) {
|
||||||
|
return res.status(404).send({ message: `Alias ${alias} not found` });
|
||||||
|
}
|
||||||
|
|
||||||
|
aliases[index] = {
|
||||||
|
alias,
|
||||||
|
enabled,
|
||||||
|
pathAndParams,
|
||||||
|
};
|
||||||
|
|
||||||
|
await DataProvider.setAliases(aliases);
|
||||||
|
|
||||||
|
res.status(200).send(aliases);
|
||||||
|
} catch (error) {
|
||||||
|
res.status(400).send({ message: String(error) });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Create controller for GET request to '/ontime/userfields'
|
// Create controller for GET request to '/ontime/userfields'
|
||||||
// Returns -
|
// Returns -
|
||||||
export const getUserFields = async (_req: Request, res: Response) => {
|
export const getUserFields = async (_req: Request, res: Response) => {
|
||||||
|
|||||||
@@ -39,6 +39,21 @@ export const validateAliases = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description Validates object for PUT /ontime/aliases
|
||||||
|
*/
|
||||||
|
export const validateUpdateAlises = [
|
||||||
|
body('alias').isString().trim(),
|
||||||
|
body('pathAndParams').isString().trim().optional(),
|
||||||
|
body('enabled').isBoolean().optional(),
|
||||||
|
|
||||||
|
(req: Request, res: Response, next: NextFunction) => {
|
||||||
|
const errors = validationResult(req);
|
||||||
|
if (!errors.isEmpty()) return res.status(422).json({ errors: errors.array() });
|
||||||
|
next();
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Validates object for POST /ontime/userfields
|
* @description Validates object for POST /ontime/userfields
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import {
|
|||||||
postId,
|
postId,
|
||||||
getAuthentication,
|
getAuthentication,
|
||||||
getClientSecrect as getClientSecret,
|
getClientSecrect as getClientSecret,
|
||||||
|
updateAliases,
|
||||||
} from '../controllers/ontimeController.js';
|
} from '../controllers/ontimeController.js';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -48,6 +49,7 @@ import {
|
|||||||
validateSheetid,
|
validateSheetid,
|
||||||
validateWorksheet,
|
validateWorksheet,
|
||||||
validateSheetOptions,
|
validateSheetOptions,
|
||||||
|
validateUpdateAlises,
|
||||||
} from '../controllers/ontimeController.validate.js';
|
} from '../controllers/ontimeController.validate.js';
|
||||||
import { projectSanitiser } from '../controllers/projectController.validate.js';
|
import { projectSanitiser } from '../controllers/projectController.validate.js';
|
||||||
import { sanitizeProjectFilename } from '../utils/sanitizeProjectFilename.js';
|
import { sanitizeProjectFilename } from '../utils/sanitizeProjectFilename.js';
|
||||||
@@ -87,6 +89,9 @@ router.get('/aliases', getAliases);
|
|||||||
// create route between controller and '/ontime/aliases' endpoint
|
// create route between controller and '/ontime/aliases' endpoint
|
||||||
router.post('/aliases', validateAliases, postAliases);
|
router.post('/aliases', validateAliases, postAliases);
|
||||||
|
|
||||||
|
// create route between controller and /ontime/aliases' endpoint
|
||||||
|
router.put('/aliases', validateUpdateAlises, updateAliases);
|
||||||
|
|
||||||
// create route between controller and '/ontime/aliases' endpoint
|
// create route between controller and '/ontime/aliases' endpoint
|
||||||
router.get('/userfields', getUserFields);
|
router.get('/userfields', getUserFields);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user