function TestScenarioDrawerSettingsPanel()

in packages/scesim-editor/src/drawer/TestScenarioDrawerSettingsPanel.tsx [43:302]


function TestScenarioDrawerSettingsPanel() {
  const { i18n } = useTestScenarioEditorI18n();
  const { openFileNormalizedPosixPathRelativeToTheWorkspaceRoot } = useTestScenarioEditor();
  const { onRequestExternalModelsAvailableToInclude, onRequestExternalModelByPath } = useExternalModels();
  const [allDmnModelNormalizedPosixRelativePaths, setAllDmnModelNormalizedPosixRelativePaths] = useState<
    string[] | undefined
  >(undefined);
  const [dmnNotFoundError, setDmnNotFoundError] = useState<any>(undefined);
  const settingsModel = useTestScenarioEditorStore((state) => state.scesim.model.ScenarioSimulationModel.settings);
  const [selectedDmnPathRelativeToThisScesim, setSelectedDmnPathRelativeToThisScesim] = useState<string | undefined>(
    settingsModel.dmnFilePath?.__$$text
  );
  const testScenarioEditorStoreApi = useTestScenarioEditorStoreApi();
  const testScenarioType = settingsModel.type?.__$$text.toUpperCase();

  const [selectedDmnModel, setSelectedDmnModel] = useState<ExternalDmn | undefined>(undefined);

  /* Retrieving all the DMN available in the project */
  useCancelableEffect(
    useCallback(
      ({ canceled }) => {
        onRequestExternalModelsAvailableToInclude?.()
          .then((paths) => {
            if (canceled.get()) {
              setAllDmnModelNormalizedPosixRelativePaths(undefined);
              return;
            }
            setAllDmnModelNormalizedPosixRelativePaths(
              paths.sort((modelA, modelB) => basename(modelA).localeCompare(basename(modelB)))
            );
          })
          .catch((err) => {
            console.error(err);
          });
      },
      [onRequestExternalModelsAvailableToInclude]
    )
  );

  /** It returns the unmarshalled representation of a DMN model given its path */
  useCancelableEffect(
    useCallback(
      ({ canceled }) => {
        if (!selectedDmnPathRelativeToThisScesim || onRequestExternalModelByPath === undefined) {
          return;
        }
        onRequestExternalModelByPath(selectedDmnPathRelativeToThisScesim)
          .then((externalDmnModel) => {
            console.debug(
              "[TestScenarioDrawerSettingsPanel] The below external DMN model have been loaded ",
              externalDmnModel
            );

            if (canceled.get() || !externalDmnModel) {
              setSelectedDmnModel(undefined);
              setDmnNotFoundError(
                new Error(`The related DMN file ${selectedDmnPathRelativeToThisScesim} can't be loaded`)
              );
              return;
            }

            setSelectedDmnModel(externalDmnModel);
            testScenarioEditorStoreApi.setState((state) => {
              state.scesim.model.ScenarioSimulationModel.settings.dmnFilePath!.__$$text =
                selectedDmnPathRelativeToThisScesim;
              state.scesim.model.ScenarioSimulationModel.settings.dmnName!.__$$text =
                externalDmnModel.model.definitions["@_name"];
              state.scesim.model.ScenarioSimulationModel.settings.dmnNamespace!.__$$text =
                externalDmnModel.model.definitions["@_namespace"];
            });
            setDmnNotFoundError(undefined);
          })
          .catch((err) => {
            setSelectedDmnModel(undefined);
            setDmnNotFoundError(err);
            console.error(
              `[TestScenarioDrawerSettingsPanel] An error occurred when parsing the selected model '${selectedDmnPathRelativeToThisScesim}'. Please double-check it is a non-empty valid model.`
            );
            console.error(err);
          });
      },
      [onRequestExternalModelByPath, selectedDmnPathRelativeToThisScesim, testScenarioEditorStoreApi]
    )
  );

  const isSelectedDmnValid = useMemo(
    () =>
      !dmnNotFoundError &&
      (!selectedDmnModel ||
        selectedDmnModel.normalizedPosixPathRelativeToTheOpenFile === settingsModel.dmnFilePath?.__$$text),
    [dmnNotFoundError, selectedDmnModel, settingsModel.dmnFilePath?.__$$text]
  );

  const updateSettingsField = useCallback(
    (fieldName: keyof SceSim__settingsType, value: string | boolean) =>
      testScenarioEditorStoreApi.setState((state) => {
        (state.scesim.model.ScenarioSimulationModel.settings[fieldName] as { __$$text: string | boolean }) = {
          __$$text: value,
        };
      }),
    [testScenarioEditorStoreApi]
  );
  const [isModelSelectOpen, setModelSelectOpen] = useState(false);
  return (
    <>
      <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
        {i18n.drawer.settings.fileName}
      </Title>
      <TextInput
        aria-label="filename"
        className={"kie-scesim-editor-drawer-settings--text-input"}
        isDisabled
        type="text"
        value={basename(openFileNormalizedPosixPathRelativeToTheWorkspaceRoot ?? "")}
      />
      <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
        {i18n.drawer.settings.assetType}
      </Title>
      <TextInput
        aria-label="asset-type"
        className={"kie-scesim-editor-drawer-settings--text-input"}
        isDisabled
        type="text"
        value={testScenarioType}
      />
      {testScenarioType === "DMN" ? (
        <>
          <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
            {i18n.drawer.settings.dmnModel}
          </Title>
          <Select
            variant={SelectVariant.single}
            aria-label="form-select-input"
            className={"kie-scesim-editor-drawer-settings--form-select"}
            ouiaId="BasicFormSelect"
            onToggle={(_event, val) => setModelSelectOpen(val)}
            isOpen={isModelSelectOpen}
            maxHeight={"350px"}
            onSelect={(e, path) => {
              if (typeof path !== "string") {
                throw new Error(`Invalid path for an included model ${JSON.stringify(path)}`);
              }
              setSelectedDmnPathRelativeToThisScesim(path);
              console.debug("[TestScenarioDrawerSettingsPanel] Selected path: ", path);
              setModelSelectOpen(false);
            }}
            validated={isSelectedDmnValid ? undefined : "error"}
            selections={isSelectedDmnValid ? settingsModel.dmnFilePath?.__$$text : undefined}
          >
            {!selectedDmnModel
              ? [
                  <SelectOption key={undefined} isDisabled>
                    {i18n.drawer.settings.dmnModelReferenceError}
                  </SelectOption>,
                ]
              : ((allDmnModelNormalizedPosixRelativePaths?.length ?? 0) > 0 &&
                  allDmnModelNormalizedPosixRelativePaths?.map((normalizedPosixPathRelativeToTheOpenFile) => (
                    <SelectOption
                      key={normalizedPosixPathRelativeToTheOpenFile}
                      value={normalizedPosixPathRelativeToTheOpenFile}
                      description={normalizedPosixPathRelativeToTheOpenFile}
                    >
                      {basename(normalizedPosixPathRelativeToTheOpenFile)}
                    </SelectOption>
                  ))) || [
                  <SelectOption key={"none-dmn"} isDisabled={true} description={""} value={undefined}>
                    {i18n.creationPanel.dmnNoPresent}
                  </SelectOption>,
                ]}
          </Select>
          <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
            {i18n.drawer.settings.dmnName}
          </Title>
          <TextInput
            aria-label="dmn-name"
            className={"kie-scesim-editor-drawer-settings--text-input"}
            isDisabled
            type="text"
            value={settingsModel.dmnName?.__$$text}
          />
          <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
            {i18n.drawer.settings.dmnNameSpace}
          </Title>
          <TextInput
            aria-label="dmn-namespace"
            className={"kie-scesim-editor-drawer-settings--text-input"}
            isDisabled
            type="text"
            value={settingsModel.dmnNamespace?.__$$text}
          />
        </>
      ) : (
        <>
          <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
            {i18n.drawer.settings.kieSessionRule}
            <Tooltip content={i18n.drawer.settings.kieSessionRuleTooltip}>
              <Icon className={"kie-scesim-editor-drawer-settings--info-icon"} size="sm" status="info">
                <HelpIcon />
              </Icon>
            </Tooltip>
          </Title>
          <TextInput
            aria-label="rule-session"
            className={"kie-scesim-editor-drawer-settings--text-input"}
            onChange={(_event, value) => updateSettingsField("dmoSession", value)}
            placeholder={i18n.drawer.settings.kieSessionRulePlaceholder}
            type="text"
            value={settingsModel.dmoSession?.__$$text}
          />
          <Title className={"kie-scesim-editor-drawer-settings--title"} headingLevel={"h6"}>
            {i18n.drawer.settings.ruleFlowGroup}
            <Tooltip content={i18n.drawer.settings.ruleFlowGroupTooltip}>
              <Icon className={"kie-scesim-editor-drawer-settings--info-icon"} size="sm" status="info">
                <HelpIcon />
              </Icon>
            </Tooltip>
          </Title>
          <TextInput
            aria-label="rule-flow-group"
            className={"kie-scesim-editor-drawer-settings--text-input"}
            onChange={(_event, value) => updateSettingsField("ruleFlowGroup", value)}
            placeholder={i18n.drawer.settings.ruleFlowGroupPlaceholder}
            type="text"
            value={settingsModel.ruleFlowGroup?.__$$text}
          />
          <div className={"kie-scesim-editor-drawer-settings--checkbox-group"}>
            <div className={"kie-scesim-editor-drawer-settings--checkbox"}>
              <Checkbox
                id="stateless-session"
                isChecked={settingsModel.stateless?.__$$text ?? false}
                label={i18n.drawer.settings.statelessSessionRule}
                onChange={(_event, value) => updateSettingsField("stateless", value)}
              />
            </div>
            <Tooltip content={i18n.drawer.settings.statelessSessionRuleTooltip}>
              <Icon className={"kie-scesim-editor-drawer-settings--info-icon"} size="sm" status="info">
                <HelpIcon />
              </Icon>
            </Tooltip>
          </div>
        </>
      )}
      <div className={"kie-scesim-editor-drawer-settings--checkbox-group"}>
        <div className={"kie-scesim-editor-drawer-settings--checkbox"}>
          <Checkbox
            id="skip-test"
            isChecked={settingsModel.skipFromBuild?.__$$text ?? false}
            label={i18n.drawer.settings.testSkipped}
            onChange={(_event, value) => updateSettingsField("skipFromBuild", value)}
          />
        </div>
        <Tooltip content={i18n.drawer.settings.testSkippedTooltip}>
          <Icon className={"kie-scesim-editor-drawer-settings--info-icon"} size="sm" status="info">
            <HelpIcon />
          </Icon>
        </Tooltip>
      </div>
    </>
  );
}