Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useEffect } from "react";
import _ from "lodash";
import DatePicker from "react-datepicker";
import { Formik, FormikErrors, FormikProps } from "formik";
import { Formik, FormikErrors, FormikProps, FormikValues } from "formik";
import Notifications from "../../../shared/Notifications";
import {
getSchedulingConflicts,
Expand Down Expand Up @@ -52,6 +52,8 @@ import SchedulingInputs from "../wizards/scheduling/SchedulingInputs";
import SchedulingConflicts from "../wizards/scheduling/SchedulingConflicts";
import { ParseKeys } from "i18next";
import ModalContentTable from "../../../shared/modals/ModalContentTable";
import SchedulingRadio from "../wizards/scheduling/SchedulingRadio";
import * as Yup from "yup";

export type InitialValues = {
scheduleStartDate: string;
Expand All @@ -64,6 +66,10 @@ export type InitialValues = {
scheduleEndMinute: string;
captureAgent: string;
inputs: string[];
stream: string;
record: string;
layout: string;
cameraPosition: string;
}

/**
Expand Down Expand Up @@ -124,11 +130,63 @@ const EventDetailsSchedulingTab = ({
// finds the inputs to be displayed in the formik
const getInputs = (deviceId: Recording["id"]) => {
if (deviceId === source.device.id) {
return source.device.inputs ? source.device.inputs : [];
return source.device.parsedCapabilities.inputs ? source.device.parsedCapabilities.inputs : [];
} else {
for (const agent of filterDevicesForAccess(user, captureAgents)) {
if (agent.id === deviceId) {
return agent.inputs ? agent.inputs : [];
return agent.parsedCapabilities.inputs ? agent.parsedCapabilities.inputs : [];
}
}
return [];
}
};

const getStream = (deviceId: Recording["id"]) => {
if (deviceId === source.device.id) {
return source.device.parsedCapabilities.stream ? source.device.parsedCapabilities.stream : [];
} else {
for (const agent of filterDevicesForAccess(user, captureAgents)) {
if (agent.id === deviceId) {
return agent.parsedCapabilities.stream ? agent.parsedCapabilities.stream : [];
}
}
return [];
}
};

const getRecord = (deviceId: Recording["id"]) => {
if (deviceId === source.device.id) {
return source.device.parsedCapabilities.record ? source.device.parsedCapabilities.record : [];
} else {
for (const agent of filterDevicesForAccess(user, captureAgents)) {
if (agent.id === deviceId) {
return agent.parsedCapabilities.record ? agent.parsedCapabilities.record : [];
}
}
return [];
}
};

const getLayout = (deviceId: Recording["id"]) => {
if (deviceId === source.device.id) {
return source.device.parsedCapabilities.layout ? source.device.parsedCapabilities.layout : [];
} else {
for (const agent of filterDevicesForAccess(user, captureAgents)) {
if (agent.id === deviceId) {
return agent.parsedCapabilities.layout ? agent.parsedCapabilities.layout : [];
}
}
return [];
}
};

const getCameraPosition = (deviceId: Recording["id"]) => {
if (deviceId === source.device.id) {
return source.device.parsedCapabilities.cameraPosition ? source.device.parsedCapabilities.cameraPosition : [];
} else {
for (const agent of filterDevicesForAccess(user, captureAgents)) {
if (agent.id === deviceId) {
return agent.parsedCapabilities.cameraPosition ? agent.parsedCapabilities.cameraPosition : [];
}
}
return [];
Expand All @@ -141,6 +199,30 @@ const EventDetailsSchedulingTab = ({
return value ? t(value as ParseKeys) : "";
};

const getStreamForAgent = (deviceId: Recording["id"], s: string) => {
const stream = getStream(deviceId);
const value = stream.find(agent => agent.id === s)?.value;
return value ? t(value as ParseKeys) : "";
};

const getRecordForAgent = (deviceId: Recording["id"], s: string) => {
const record = getRecord(deviceId);
const value = record.find(agent => agent.id === s)?.value;
return value ? t(value as ParseKeys) : "";
};

const getLayoutForAgent = (deviceId: Recording["id"], s: string) => {
const layout = getLayout(deviceId);
const value = layout.find(agent => agent.id === s)?.value;
return value ? t(value as ParseKeys) : "";
};

const getCameraPositionForAgent = (deviceId: Recording["id"], s: string) => {
const cameraPosition = getCameraPosition(deviceId);
const value = cameraPosition.find(agent => agent.id === s)?.value;
return value ? t(value as ParseKeys) : "";
};

// changes the inputs in the formik
const changeInputs = (deviceId: Recording["id"], setFieldValue: (field: string, value: any) => Promise<void | FormikErrors<any>>) => {
setFieldValue("captureAgent", deviceId);
Expand Down Expand Up @@ -206,14 +288,56 @@ const EventDetailsSchedulingTab = ({
);
};

const validationSchema = Yup.object({
// Capture agent specific validation
stream: Yup.string()
.nullable()
.oneOf(["0", "1"], "Invalid stream value")
.optional(),
record: Yup.string()
.nullable()
.oneOf(["0", "1"], "Invalid record value")
.optional()
.test(
"record-depends-on-stream",
"Record can be 0 only if Stream is 1",
function (value) {
const { stream } = this.parent as FormikValues;

// If record is not provided — no validation needed
if (value == null) { return true; }

// If stream is not provided — also fine
if (stream == null || stream === "") { return true; }

// Enforce the rule only when both are defined
if (value === "0" && stream !== "1") { return false; }

return true;
},
),
});

// initial values of the formik form
const getInitialValues = () => {
const startDate = new Date(source.start.date);
const endDate = new Date(source.end.date);

const inputs = source.device.inputMethods
? Array.from(source.device.inputMethods)
const inputs = source.device.capabilitiesMethods.inputs
? Array.from(source.device.capabilitiesMethods.inputs)
: [];
const stream = source.device.capabilitiesMethods.stream && source.device.capabilitiesMethods.stream.length > 0
? source.device.capabilitiesMethods.stream[0]
: "";
const record = source.device.capabilitiesMethods.record && source.device.capabilitiesMethods.record.length > 0
? source.device.capabilitiesMethods.record[0]
: "";
const layout = source.device.capabilitiesMethods.layout && source.device.capabilitiesMethods.layout.length > 0
? source.device.capabilitiesMethods.layout[0]
: "";
const cameraPosition = source.device.capabilitiesMethods.cameraPosition && source.device.capabilitiesMethods.cameraPosition.length > 0
? source.device.capabilitiesMethods.cameraPosition[0]
: "";

startDate.setHours(0, 0, 0);
endDate.setHours(0, 0, 0);
Expand All @@ -229,6 +353,10 @@ const EventDetailsSchedulingTab = ({
scheduleEndMinute: source.end.minute != null ? makeTwoDigits(source.end.minute) : "",
captureAgent: source.device.name,
inputs: inputs.filter(input => input !== ""),
stream: stream,
record: record,
layout: layout,
cameraPosition: cameraPosition,
};
};

Expand All @@ -249,6 +377,7 @@ const EventDetailsSchedulingTab = ({
<Formik<InitialValues>
enableReinitialize
initialValues={getInitialValues()}
validationSchema={validationSchema}
onSubmit={values => submitForm(values)}
innerRef={formikRef}
>
Expand Down Expand Up @@ -505,6 +634,7 @@ const EventDetailsSchedulingTab = ({
(hasAccessRole &&
accessAllowed(formik.values.captureAgent)
? <SchedulingInputs
name="inputs"
inputs={getInputs(formik.values.captureAgent)}
/>
: formik.values.inputs.map((input, key) => (
Expand All @@ -515,6 +645,114 @@ const EventDetailsSchedulingTab = ({
)))}
</td>
</tr>

{/* stream */}
<tr>
<td>
{t(
"EVENTS.EVENTS.DETAILS.SOURCE.PLACEHOLDER.STREAM",
)}
</td>
<td>
{!!formik.values.captureAgent &&
!!getStream(formik.values.captureAgent) &&
getStream(formik.values.captureAgent).length >
0 &&
(hasAccessRole &&
accessAllowed(formik.values.captureAgent)
? <SchedulingRadio
name="stream"
inputs={getStream(formik.values.captureAgent)}
/>
:
<span>
{getStreamForAgent(formik.values.captureAgent, formik.values.stream)}
<br />
</span>
)}
</td>
</tr>

{/* record */}
<tr>
<td>
{t(
"EVENTS.EVENTS.DETAILS.SOURCE.PLACEHOLDER.RECORD",
)}
</td>
<td>
{!!formik.values.captureAgent &&
!!getRecord(formik.values.captureAgent) &&
getRecord(formik.values.captureAgent).length >
0 &&
(hasAccessRole &&
accessAllowed(formik.values.captureAgent)
? <SchedulingRadio
name="record"
inputs={getRecord(formik.values.captureAgent)}
/>
:
<span>
{getRecordForAgent(formik.values.captureAgent, formik.values.record)}
<br />
</span>
)}
</td>
</tr>

{/* layout */}
<tr>
<td>
{t(
"EVENTS.EVENTS.DETAILS.SOURCE.PLACEHOLDER.LAYOUT",
)}
</td>
<td>
{!!formik.values.captureAgent &&
!!getLayout(formik.values.captureAgent) &&
getLayout(formik.values.captureAgent).length >
0 &&
(hasAccessRole &&
accessAllowed(formik.values.captureAgent)
? <SchedulingRadio
name="layout"
inputs={getLayout(formik.values.captureAgent)}
/>
:
<span>
{getLayoutForAgent(formik.values.captureAgent, formik.values.layout)}
<br />
</span>
)}
</td>
</tr>

{/* cameraPosition */}
<tr>
<td>
{t(
"EVENTS.EVENTS.DETAILS.SOURCE.PLACEHOLDER.CAMERA_POSITION",
)}
</td>
<td>
{!!formik.values.captureAgent &&
!!getCameraPosition(formik.values.captureAgent) &&
getCameraPosition(formik.values.captureAgent).length >
0 &&
(hasAccessRole &&
accessAllowed(formik.values.captureAgent)
? <SchedulingRadio
name="cameraPosition"
inputs={getCameraPosition(formik.values.captureAgent)}
/>
:
<span>
{getCameraPositionForAgent(formik.values.captureAgent, formik.values.cameraPosition)}
<br />
</span>
)}
</td>
</tr>
</tbody>
</table>
</div>
Expand Down
Loading