/* * Copyright (c) 2025 by Christian Kellner. * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ import React, { Fragment, useState } from 'react'; import NotificationAdapterMutator from './components/notificationAdapter/NotificationAdapterMutator'; import NotificationAdapterTable from '../../../components/table/NotificationAdapterTable'; import ProviderTable from '../../../components/table/ProviderTable'; import ProviderMutator from './components/provider/ProviderMutator'; import Headline from '../../../components/headline/Headline'; import { useActions, useSelector } from '../../../services/state/store'; import { xhrPost } from '../../../services/xhr'; import { useNavigate, useParams } from 'react-router-dom'; import { Divider, Input, Switch, Button, TagInput, Toast, Select } from '@douyinfe/semi-ui'; import './JobMutation.less'; import { SegmentPart } from '../../../components/segment/SegmentPart'; import { IconBell, IconBriefcase, IconPaperclip, IconPlayCircle, IconPlusCircle, IconUser, IconClear, } from '@douyinfe/semi-icons'; export default function JobMutator() { const jobs = useSelector((state) => state.jobsData.jobs); const shareableUserList = useSelector((state) => state.jobsData.shareableUserList); const params = useParams(); const jobToBeEdit = params.jobId == null ? null : jobs.find((job) => job.id === params.jobId); const defaultBlacklist = jobToBeEdit?.blacklist || []; const defaultName = jobToBeEdit?.name || null; const defaultProviderData = jobToBeEdit?.provider || []; const defaultNotificationAdapter = jobToBeEdit?.notificationAdapter || []; const defaultEnabled = jobToBeEdit?.enabled ?? true; const [providerToEdit, setProviderToEdit] = useState(null); const [providerCreationVisible, setProviderCreationVisibility] = useState(false); const [notificationCreationVisible, setNotificationCreationVisibility] = useState(false); const [editNotificationAdapter, setEditNotificationAdapter] = useState(null); const [providerData, setProviderData] = useState(defaultProviderData); const [name, setName] = useState(defaultName); const [blacklist, setBlacklist] = useState(defaultBlacklist); const [notificationAdapterData, setNotificationAdapterData] = useState(defaultNotificationAdapter); const [shareWithUsers, setShareWithUsers] = useState(jobToBeEdit?.shared_with_user ?? []); const [enabled, setEnabled] = useState(defaultEnabled); const navigate = useNavigate(); const actions = useActions(); const isSavingEnabled = () => { return Boolean(notificationAdapterData.length && providerData.length && name); }; const handleProviderEdit = (data) => { setProviderData( providerData.map((provider) => (provider.url === data.oldProviderToEdit.url ? data.newData : provider)), ); }; const mutateJob = async () => { try { await xhrPost('/api/jobs', { provider: providerData, notificationAdapter: notificationAdapterData, shareWithUsers, name, blacklist, enabled, jobId: jobToBeEdit?.id || null, }); await actions.jobsData.getJobs(); Toast.success('Job successfully saved...'); navigate('/jobs'); } catch (Exception) { console.error(Exception.json.message); Toast.error(Exception.json != null ? Exception.json.message : Exception); } }; return ( setProviderCreationVisibility(visible)} onData={(data) => { setProviderData([...providerData, data]); }} onEditData={handleProviderEdit} providerToEdit={providerToEdit} /> {notificationCreationVisible && ( { setEditNotificationAdapter(null); setNotificationCreationVisibility(visible); }} selected={notificationAdapterData} editNotificationAdapter={ editNotificationAdapter == null ? null : notificationAdapterData.find((adapter) => adapter.id === editNotificationAdapter) } onData={(data) => { const oldData = [...notificationAdapterData].filter((o) => o.id !== data.id); setNotificationAdapterData([...oldData, data]); }} /> )}
setName(value)} /> { setProviderData(providerData.filter((provider) => provider.url !== providerUrl)); }} onEdit={(provider) => { setProviderCreationVisibility(true); setProviderToEdit(provider); }} /> { setEditNotificationAdapter(null); setNotificationAdapterData(notificationAdapterData.filter((adapter) => adapter.id !== adapterId)); }} onEdit={(adapterId) => { setEditNotificationAdapter(adapterId); setNotificationCreationVisibility(true); }} /> setBlacklist([...v])} /> {shareableUserList.length === 0 ? (
No users found to share this Job to. Please create additional non-admin user.
) : ( )}
setEnabled(checked)} checked={enabled} />
); }