openreplay/frontend/app/components/shared/ConditionSet/ConditionSet.tsx
Delirium 5e21d88e8c
feat(tracker): Msg buffering and conditional recording (#1775)
* feat(tracker) start message buffering support

* feat(tracker): buffered recordings

* feat(tracker): buffered recordings timedelay adjust

* fix(tracker): condition manager

* fix(tracker): conditions handlers

* fix(tracker): conditions

* fix(tracker): pre-fetch feature flags and conditions, fix naming and dnt check repeating

* fix(tracker): fix conditions fetch

* feat(tracker): test coverage for conditionsManager

* feat(tracker): some api connections

* feat(tracker): fix projid in session info

* feat(tracker): added fetch req status condition, partially added offline recording, type fixes

* fix(tracker): fix tests

* fix(tracker): fix network req c

* fix(tracker): fix conditions test

* feat(ui): conditional recording ui

* fix(tracker): fix prestart callbacks

* feat(ui): conditions ui and api stuff

* feat(ui): fix ?

* fix(tracker): map raw db response in tracker

* fix(tracker): fix condition processing, add cond name to trigger event, change unit tests

* fix(tracker): simplify mapping, rename functions

* fix(tracker): change toggler design, change network request condition

* fix(tracker): some formatting

* fix(tracker): reformat logging

* fix(ui): rm console log
2024-01-09 13:18:26 +01:00

128 lines
3.9 KiB
TypeScript

import React from 'react';
import { Icon, Input, Button } from 'UI';
import cn from 'classnames';
import FilterList from 'Shared/Filters/FilterList';
import { observer } from 'mobx-react-lite';
import FilterSelection from 'Shared/Filters/FilterSelection';
import { Typography } from 'antd';
import { BranchesOutlined } from '@ant-design/icons';
interface Props {
set: number;
removeCondition: (ind: number) => void;
index: number;
readonly?: boolean;
onAddFilter: (filter: Record<string, any>) => void;
conditions: any;
bottomLine1: string;
bottomLine2: string;
onPercentChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
excludeFilterKeys?: string[];
onUpdateFilter: (filterIndex: number, filter: any) => void;
onRemoveFilter: (filterIndex: number) => void;
onChangeEventsOrder: (_: any, { name, value }: any) => void;
isConditional?: boolean;
changeName: (name: string) => void;
}
function ConditionSetComponent({
removeCondition,
index,
set,
readonly,
onAddFilter,
bottomLine1,
bottomLine2,
onPercentChange,
excludeFilterKeys,
conditions,
onUpdateFilter,
onRemoveFilter,
onChangeEventsOrder,
isConditional,
changeName,
}: Props) {
return (
<div className={'border bg-white rounded'}>
<div className={'flex items-center border-b px-4 py-2 gap-2'}>
{conditions.name ? (
<div className={'flex gap-2'}>
<BranchesOutlined rotate={90} />
<Typography.Text
className={'underline decoration-dashed decoration-black cursor-pointer'}
editable={{
onChange: changeName,
triggerType: ['icon', 'text'],
maxLength: 20,
}}
>
{conditions.name}
</Typography.Text>
</div>
) : (
<>
<div>Condition</div>
<div className={'p-2 rounded bg-gray-lightest'}>Set {set}</div>
</>
)}
{readonly ? null : (
<div
className={cn('p-2 px-4 cursor-pointer rounded ml-auto', 'hover:bg-teal-light')}
onClick={() => removeCondition(index)}
>
<Icon name={'trash'} color={'main'} />
</div>
)}
</div>
<div className={'p-2'}>
<div className={conditions.filter.filters.length > 0 ? 'p-2 mb-2' : ''}>
<FilterList
filter={conditions.filter}
onUpdateFilter={onUpdateFilter}
onRemoveFilter={onRemoveFilter}
onChangeEventsOrder={onChangeEventsOrder}
hideEventsOrder
excludeFilterKeys={excludeFilterKeys}
readonly={readonly}
isConditional={isConditional}
/>
{readonly && !conditions.filter?.filters?.length ? (
<div className={'p-2'}>No conditions</div>
) : null}
</div>
{readonly ? null : (
<div className={'px-2'}>
<FilterSelection
isConditional={isConditional}
filter={undefined}
onFilterClick={onAddFilter}
excludeFilterKeys={excludeFilterKeys}
>
<Button variant="text-primary" icon="plus">
Add Condition
</Button>
</FilterSelection>
</div>
)}
</div>
<div className={'px-4 py-2 flex items-center gap-2 border-t'}>
<span>{bottomLine1}</span>
{readonly ? (
<div className={'font-semibold'}>{conditions.rolloutPercentage}%</div>
) : (
<Input
type="text"
width={60}
value={conditions.rolloutPercentage}
onChange={onPercentChange}
leadingButton={<div className={'p-2 text-disabled-text'}>%</div>}
/>
)}
<span>{bottomLine2}</span>
</div>
</div>
);
}
export default observer(ConditionSetComponent);