fix workflow

This commit is contained in:
Simon Larsen
2023-02-08 12:02:53 +00:00
parent e0f59e4754
commit 2808db2683
12 changed files with 123 additions and 116 deletions

View File

@@ -10,7 +10,7 @@ import { VeryLightGrey } from 'Common/Types/BrandColors';
export enum ModalWidth { export enum ModalWidth {
Normal, Normal,
Large Large,
} }
export interface ComponentProps { export interface ComponentProps {
@@ -28,7 +28,7 @@ export interface ComponentProps {
isBodyLoading?: boolean | undefined; isBodyLoading?: boolean | undefined;
icon?: IconProp | undefined; icon?: IconProp | undefined;
iconType?: IconType | undefined; iconType?: IconType | undefined;
modalWidth?: ModalWidth | undefined modalWidth?: ModalWidth | undefined;
} }
const Modal: FunctionComponent<ComponentProps> = ( const Modal: FunctionComponent<ComponentProps> = (
@@ -57,7 +57,14 @@ const Modal: FunctionComponent<ComponentProps> = (
<div className="fixed inset-0 z-10 overflow-y-auto"> <div className="fixed inset-0 z-10 overflow-y-auto">
<div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"> <div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
<div className={`relative transform rounded-lg bg-white text-left shadow-xl transition-all sm:my-8 sm:w-full ${props.modalWidth && props.modalWidth === ModalWidth.Large ? "sm:max-w-7xl" : "sm:max-w-lg"} `}> <div
className={`relative transform rounded-lg bg-white text-left shadow-xl transition-all sm:my-8 sm:w-full ${
props.modalWidth &&
props.modalWidth === ModalWidth.Large
? 'sm:max-w-7xl'
: 'sm:max-w-lg'
} `}
>
{props.onClose && ( {props.onClose && (
<div className="absolute top-0 right-0 hidden pt-4 pr-4 sm:block"> <div className="absolute top-0 right-0 hidden pt-4 pr-4 sm:block">
<Button <Button
@@ -91,8 +98,9 @@ const Modal: FunctionComponent<ComponentProps> = (
)} )}
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:mr-4 sm:text-left"> <div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:mr-4 sm:text-left">
<h3 <h3
className={`text-lg font-medium leading-6 text-gray-900 ${props.icon ? 'ml-10 -mt-8 mb-5' : '' className={`text-lg font-medium leading-6 text-gray-900 ${
}`} props.icon ? 'ml-10 -mt-8 mb-5' : ''
}`}
id="modal-title" id="modal-title"
> >
{props.title} {props.title}

View File

@@ -64,14 +64,14 @@ export enum ShowTableAs {
} }
export interface ComponentProps<TBaseModel extends BaseModel> { export interface ComponentProps<TBaseModel extends BaseModel> {
modelType: { new(): TBaseModel }; modelType: { new (): TBaseModel };
id: string; id: string;
onFetchInit?: onFetchInit?:
| undefined | undefined
| ((pageNumber: number, itemsOnPage: number) => void); | ((pageNumber: number, itemsOnPage: number) => void);
onFetchSuccess?: onFetchSuccess?:
| undefined | undefined
| ((data: Array<TBaseModel>, totalCount: number) => void); | ((data: Array<TBaseModel>, totalCount: number) => void);
cardProps?: CardComponentProps | undefined; cardProps?: CardComponentProps | undefined;
columns: Columns<TBaseModel>; columns: Columns<TBaseModel>;
selectMoreFields?: Select<TBaseModel>; selectMoreFields?: Select<TBaseModel>;
@@ -203,8 +203,8 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
alignItem: column.alignItem, alignItem: column.alignItem,
getElement: column.getElement getElement: column.getElement
? (item: JSONObject): ReactElement => { ? (item: JSONObject): ReactElement => {
return column.getElement!(item, onBeforeFetchData); return column.getElement!(item, onBeforeFetchData);
} }
: undefined, : undefined,
}); });
@@ -236,7 +236,7 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
try { try {
setErrorModalText( setErrorModalText(
(err as HTTPErrorResponse).message || (err as HTTPErrorResponse).message ||
'Server Error. Please try again' 'Server Error. Please try again'
); );
} catch (e) { } catch (e) {
setErrorModalText('Server Error. Please try again'); setErrorModalText('Server Error. Please try again');
@@ -349,7 +349,7 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
try { try {
setTableFilterError( setTableFilterError(
(err as HTTPErrorResponse).message || (err as HTTPErrorResponse).message ||
'Server Error. Please try again' 'Server Error. Please try again'
); );
} catch (e) { } catch (e) {
setTableFilterError('Server Error. Please try again'); setTableFilterError('Server Error. Please try again');
@@ -385,8 +385,8 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
getSelect(), getSelect(),
sortBy sortBy
? { ? {
[sortBy as any]: sortOrder, [sortBy as any]: sortOrder,
} }
: {}, : {},
getPopulate(), getPopulate(),
props.fetchRequestOptions props.fetchRequestOptions
@@ -398,7 +398,7 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
try { try {
setError( setError(
(err as HTTPErrorResponse).message || (err as HTTPErrorResponse).message ||
'Server Error. Please try again' 'Server Error. Please try again'
); );
} catch (e) { } catch (e) {
setError('Server Error. Please try again'); setError('Server Error. Please try again');
@@ -511,8 +511,9 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
showTableAs !== ShowTableAs.OrderedStatesList showTableAs !== ShowTableAs.OrderedStatesList
) { ) {
headerbuttons.push({ headerbuttons.push({
title: `${props.createVerb || 'Create'} ${props.singularName || model.singularName title: `${props.createVerb || 'Create'} ${
}`, props.singularName || model.singularName
}`,
buttonStyle: ButtonStyleType.NORMAL, buttonStyle: ButtonStyleType.NORMAL,
className: className:
props.showFilterButton || props.showRefreshButton props.showFilterButton || props.showRefreshButton
@@ -730,9 +731,13 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
if ( if (
(permissions && (permissions &&
((props.isDeleteable && model.hasDeletePermissions(permissions)) || ((props.isDeleteable &&
(props.isEditable && model.hasUpdatePermissions(permissions)) || model.hasDeletePermissions(permissions)) ||
(props.isViewable && model.hasReadPermissions(permissions)))) || (props.actionButtons && props.actionButtons.length > 0) (props.isEditable &&
model.hasUpdatePermissions(permissions)) ||
(props.isViewable &&
model.hasReadPermissions(permissions)))) ||
(props.actionButtons && props.actionButtons.length > 0)
) { ) {
columns.push({ columns.push({
title: 'Actions', title: 'Actions',
@@ -999,9 +1004,9 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
let getTitleElement: let getTitleElement:
| (( | ((
item: JSONObject, item: JSONObject,
onBeforeFetchData?: JSONObject | undefined onBeforeFetchData?: JSONObject | undefined
) => ReactElement) ) => ReactElement)
| undefined = undefined; | undefined = undefined;
let getDescriptionElement: let getDescriptionElement:
| ((item: JSONObject) => ReactElement) | ((item: JSONObject) => ReactElement)
@@ -1045,10 +1050,10 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
onCreateNewItem={ onCreateNewItem={
props.isCreateable props.isCreateable
? (order: number) => { ? (order: number) => {
setOrderedStatesListNewItemOrder(order); setOrderedStatesListNewItemOrder(order);
setModalType(ModalType.Create); setModalType(ModalType.Create);
setShowModal(true); setShowModal(true);
} }
: undefined : undefined
} }
singularLabel={ singularLabel={
@@ -1113,8 +1118,9 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
}} }}
> >
<Pill <Pill
text={`${new props.modelType().readBillingPlan text={`${
} Plan`} new props.modelType().readBillingPlan
} Plan`}
color={Yellow} color={Yellow}
/> />
</span> </span>
@@ -1188,16 +1194,19 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
<ModelFormModal<TBaseModel> <ModelFormModal<TBaseModel>
title={ title={
modalType === ModalType.Create modalType === ModalType.Create
? `${props.createVerb || 'Create'} New ${props.singularName || model.singularName ? `${props.createVerb || 'Create'} New ${
}` props.singularName || model.singularName
}`
: `Edit ${props.singularName || model.singularName}` : `Edit ${props.singularName || model.singularName}`
} }
name={ name={
modalType === ModalType.Create modalType === ModalType.Create
? `${props.name} > ${props.createVerb || 'Create' ? `${props.name} > ${
} New ${props.singularName || model.singularName}` props.createVerb || 'Create'
: `${props.name} > Edit ${props.singularName || model.singularName } New ${props.singularName || model.singularName}`
}` : `${props.name} > Edit ${
props.singularName || model.singularName
}`
} }
initialValues={ initialValues={
modalType === ModalType.Create modalType === ModalType.Create
@@ -1209,8 +1218,9 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
}} }}
submitButtonText={ submitButtonText={
modalType === ModalType.Create modalType === ModalType.Create
? `${props.createVerb || 'Create'} ${props.singularName || model.singularName ? `${props.createVerb || 'Create'} ${
}` props.singularName || model.singularName
}`
: `Save Changes` : `Save Changes`
} }
onSuccess={async (item: TBaseModel) => { onSuccess={async (item: TBaseModel) => {

View File

@@ -82,7 +82,7 @@ const TableRow: FunctionComponent<ComponentProps> = (
props.item[column.key] ? ( props.item[column.key] ? (
OneUptimeDate.getDateAsLocalFormattedString( OneUptimeDate.getDateAsLocalFormattedString(
props.item[ props.item[
column.key column.key
] as string, ] as string,
true true
) )
@@ -90,11 +90,11 @@ const TableRow: FunctionComponent<ComponentProps> = (
'' ''
) )
) : column.type === ) : column.type ===
FieldType.DateTime ? ( FieldType.DateTime ? (
props.item[column.key] ? ( props.item[column.key] ? (
OneUptimeDate.getDateAsLocalFormattedString( OneUptimeDate.getDateAsLocalFormattedString(
props.item[ props.item[
column.key column.key
] as string, ] as string,
false false
) )
@@ -102,7 +102,7 @@ const TableRow: FunctionComponent<ComponentProps> = (
'' ''
) )
) : column.type === ) : column.type ===
FieldType.Boolean ? ( FieldType.Boolean ? (
props.item[column.key] ? ( props.item[column.key] ? (
<Icon <Icon
icon={IconProp.Check} icon={IconProp.Check}
@@ -183,7 +183,7 @@ const TableRow: FunctionComponent<ComponentProps> = (
} }
isLoading={ isLoading={
isButtonLoading[ isButtonLoading[
i i
] ]
} }
onClick={() => { onClick={() => {

View File

@@ -19,8 +19,8 @@ const WorkflowElement: FunctionComponent<ComponentProps> = (
const projectId: string | undefined = props.workflow.projectId const projectId: string | undefined = props.workflow.projectId
? props.workflow.projectId.toString() ? props.workflow.projectId.toString()
: props.workflow.project : props.workflow.project
? props.workflow.project._id ? props.workflow.project._id
: ''; : '';
return ( return (
<Link <Link
onNavigateComplete={props.onNavigateComplete} onNavigateComplete={props.onNavigateComplete}

View File

@@ -20,9 +20,6 @@ import Modal, { ModalWidth } from 'CommonUI/src/Components/Modal/Modal';
const Workflows: FunctionComponent<PageComponentProps> = ( const Workflows: FunctionComponent<PageComponentProps> = (
_props: PageComponentProps _props: PageComponentProps
): ReactElement => { ): ReactElement => {
const [showViewLogsModal, setShowViewLogsModal] = useState<boolean>(false); const [showViewLogsModal, setShowViewLogsModal] = useState<boolean>(false);
const [logs, setLogs] = useState<string>(''); const [logs, setLogs] = useState<string>('');
@@ -65,8 +62,7 @@ const Workflows: FunctionComponent<PageComponentProps> = (
item: JSONObject, item: JSONObject,
onCompleteAction: Function onCompleteAction: Function
) => { ) => {
setLogs(item['logs'] as string);
setLogs((item['logs'] as string));
setShowViewLogsModal(true); setShowViewLogsModal(true);
onCompleteAction(); onCompleteAction();
@@ -78,7 +74,7 @@ const Workflows: FunctionComponent<PageComponentProps> = (
name="Workflow Logs" name="Workflow Logs"
isViewable={false} isViewable={false}
selectMoreFields={{ selectMoreFields={{
logs: true logs: true,
}} }}
cardProps={{ cardProps={{
icon: IconProp.Logs, icon: IconProp.Logs,
@@ -107,7 +103,9 @@ const Workflows: FunctionComponent<PageComponentProps> = (
<WorkflowElement <WorkflowElement
workflow={ workflow={
JSONFunctions.fromJSON( JSONFunctions.fromJSON(
(item['workflow'] as JSONObject) || [], (item[
'workflow'
] as JSONObject) || [],
Workflow Workflow
) as Workflow ) as Workflow
} }
@@ -126,29 +124,25 @@ const Workflows: FunctionComponent<PageComponentProps> = (
]} ]}
/> />
{showViewLogsModal && <Modal {showViewLogsModal && (
title={'Workflow Logs'} <Modal
description="Here are the logs for this workflow" title={'Workflow Logs'}
isLoading={false} description="Here are the logs for this workflow"
modalWidth={ModalWidth.Large} isLoading={false}
onSubmit={() => { modalWidth={ModalWidth.Large}
setShowViewLogsModal(false); onSubmit={() => {
}} setShowViewLogsModal(false);
}}
submitButtonText={ submitButtonText={'Close'}
'Close' submitButtonStyleType={ButtonStyleType.NORMAL}
} >
submitButtonStyleType={ <div className="text-gray-500 mt-5 text-sm h-96 overflow-scroll overflow-x-hidden p-5 border-gray-50 border border-2 bg-gray-100 rounded">
ButtonStyleType.NORMAL {logs}
} </div>
> </Modal>
<div className="text-gray-500 mt-5 text-sm h-96 overflow-scroll overflow-x-hidden p-5 border-gray-50 border border-2 bg-gray-100 rounded"> )}
{logs}
</div>
</Modal>}
</> </>
</Page > </Page>
); );
}; };

View File

@@ -96,8 +96,7 @@ const Workflows: FunctionComponent<PageComponentProps> = (
content: true, content: true,
}, },
title: 'Content', title: 'Content',
description: description: 'Enter the content of the variable',
'Enter the content of the variable',
fieldType: FormFieldSchemaType.LongText, fieldType: FormFieldSchemaType.LongText,
required: true, required: true,
}, },

View File

@@ -89,7 +89,7 @@ const Delete: FunctionComponent<PageComponentProps> = (
isEnabled: true, isEnabled: true,
}, },
title: 'Enabled', title: 'Enabled',
fieldType: FormFieldSchemaType.Checkbox fieldType: FormFieldSchemaType.Checkbox,
}, },
]} ]}
modelDetailProps={{ modelDetailProps={{
@@ -120,7 +120,7 @@ const Delete: FunctionComponent<PageComponentProps> = (
isEnabled: true, isEnabled: true,
}, },
title: 'Enabled', title: 'Enabled',
fieldType: FieldType.Boolean fieldType: FieldType.Boolean,
}, },
], ],
modelId: modelId, modelId: modelId,

View File

@@ -24,12 +24,9 @@ const Delete: FunctionComponent<PageComponentProps> = (
): ReactElement => { ): ReactElement => {
const modelId: ObjectID = Navigation.getLastParamAsObjectID(1); const modelId: ObjectID = Navigation.getLastParamAsObjectID(1);
const [showViewLogsModal, setShowViewLogsModal] = useState<boolean>(false); const [showViewLogsModal, setShowViewLogsModal] = useState<boolean>(false);
const [logs, setLogs] = useState<string>(''); const [logs, setLogs] = useState<string>('');
return ( return (
<Page <Page
title={'Workflow'} title={'Workflow'}
@@ -75,10 +72,11 @@ const Delete: FunctionComponent<PageComponentProps> = (
name="Workflow Logs" name="Workflow Logs"
query={{ query={{
workflowId: modelId, workflowId: modelId,
projectId: DashboardNavigation.getProjectId()?.toString(), projectId:
DashboardNavigation.getProjectId()?.toString(),
}} }}
selectMoreFields={{ selectMoreFields={{
logs: true logs: true,
}} }}
actionButtons={[ actionButtons={[
{ {
@@ -89,8 +87,7 @@ const Delete: FunctionComponent<PageComponentProps> = (
item: JSONObject, item: JSONObject,
onCompleteAction: Function onCompleteAction: Function
) => { ) => {
setLogs(item['logs'] as string);
setLogs((item['logs'] as string));
setShowViewLogsModal(true); setShowViewLogsModal(true);
onCompleteAction(); onCompleteAction();
@@ -125,7 +122,9 @@ const Delete: FunctionComponent<PageComponentProps> = (
<WorkflowElement <WorkflowElement
workflow={ workflow={
JSONFunctions.fromJSON( JSONFunctions.fromJSON(
(item['workflow'] as JSONObject) || [], (item[
'workflow'
] as JSONObject) || [],
Workflow Workflow
) as Workflow ) as Workflow
} }
@@ -144,28 +143,24 @@ const Delete: FunctionComponent<PageComponentProps> = (
]} ]}
/> />
{showViewLogsModal && <Modal {showViewLogsModal && (
title={'Workflow Logs'} <Modal
description="Here are the logs for this workflow" title={'Workflow Logs'}
isLoading={false} description="Here are the logs for this workflow"
modalWidth={ModalWidth.Large} isLoading={false}
onSubmit={() => { modalWidth={ModalWidth.Large}
setShowViewLogsModal(false); onSubmit={() => {
}} setShowViewLogsModal(false);
}}
submitButtonText={ submitButtonText={'Close'}
'Close' submitButtonStyleType={ButtonStyleType.NORMAL}
} >
submitButtonStyleType={ <div className="text-gray-500 mt-5 text-sm h-96 overflow-scroll overflow-x-hidden p-5 border-gray-50 border border-2 bg-gray-100 rounded">
ButtonStyleType.NORMAL {logs}
} </div>
> </Modal>
<div className="text-gray-500 mt-5 text-sm h-96 overflow-scroll overflow-x-hidden p-5 border-gray-50 border border-2 bg-gray-100 rounded"> )}
{logs}
</div>
</Modal>}
</> </>
</Page> </Page>
); );
}; };

View File

@@ -114,8 +114,7 @@ const Workflows: FunctionComponent<PageComponentProps> = (
content: true, content: true,
}, },
title: 'Content', title: 'Content',
description: description: 'Enter the content of the variable',
'Enter the content of the variable',
fieldType: FormFieldSchemaType.LongText, fieldType: FormFieldSchemaType.LongText,
required: true, required: true,
}, },

View File

@@ -76,7 +76,7 @@ const Workflows: FunctionComponent<PageComponentProps> = (
isEnabled: true, isEnabled: true,
}, },
title: 'Enabled', title: 'Enabled',
fieldType: FormFieldSchemaType.Checkbox fieldType: FormFieldSchemaType.Checkbox,
}, },
]} ]}
showRefreshButton={true} showRefreshButton={true}

View File

@@ -302,7 +302,7 @@ export class RouteUtil {
if ( if (
route.toString() === RouteMap[PageMap.USER_PROFILE]?.toString() || route.toString() === RouteMap[PageMap.USER_PROFILE]?.toString() ||
route.toString() === route.toString() ===
RouteMap[PageMap.PROJECT_INVITATIONS]?.toString() || RouteMap[PageMap.PROJECT_INVITATIONS]?.toString() ||
route.toString() === RouteMap[PageMap.ACTIVE_INCIDENTS]?.toString() route.toString() === RouteMap[PageMap.ACTIVE_INCIDENTS]?.toString()
) { ) {
return true; return true;

View File

@@ -246,10 +246,12 @@ export default class WorkflowVariable extends BaseModel {
Permission.ProjectAdmin, Permission.ProjectAdmin,
Permission.CanCreateWorkflowVariable, Permission.CanCreateWorkflowVariable,
], ],
read: [Permission.ProjectOwner, read: [
Permission.ProjectAdmin, Permission.ProjectOwner,
Permission.ProjectMember, Permission.ProjectAdmin,
Permission.CanReadWorkflowVariable], Permission.ProjectMember,
Permission.CanReadWorkflowVariable,
],
update: [], update: [],
}) })
@TableColumn({ required: true, type: TableColumnType.Boolean }) @TableColumn({ required: true, type: TableColumnType.Boolean })