openreplay/frontend/app/components/FFlags/FFlagsList.tsx
Shekar Siri df67acc78f
fix(ui): sessions list and page titles (#2916)
* fix(ui): session tags issue type to be lowercase

* fix(ui): bookmarks separation and other page titles
2025-01-02 15:17:36 +01:00

125 lines
4.7 KiB
TypeScript

import React from 'react';
import { numberWithCommas } from 'App/utils';
import withPermissions from 'HOCs/withPermissions';
import FFlagsListHeader from 'Components/FFlags/FFlagsListHeader';
import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
import { Loader, NoContent, Pagination } from 'UI';
import FFlagItem from './FFlagItem';
import { useStore } from 'App/mstore';
import { observer } from 'mobx-react-lite';
import Select from 'Shared/Select';
import usePageTitle from '@/hooks/usePageTitle';
function FFlagsList({ siteId }: { siteId: string }) {
usePageTitle('Feature Flags - OpenReplay');
const { featureFlagsStore, userStore } = useStore();
React.useEffect(() => {
void featureFlagsStore.fetchFlags();
void userStore.fetchUsers();
}, []);
return (
<div
className={'mb-5 w-full mx-auto bg-white rounded pb-10 pt-4 widget-wrapper'}
style={{ maxWidth: '1360px' }}
>
<FFlagsListHeader siteId={siteId} />
<div className={'border-y px-3 py-2 mt-2 flex items-center w-full justify-end gap-4'}>
<div className={'flex items-center gap-2'}>
Status:
<Select
options={[
{ label: 'All', value: '0' as const },
{ label: 'Enabled', value: '1' as const },
{ label: 'Disabled', value: '2' as const }
]}
defaultValue={featureFlagsStore.activity}
plain
onChange={({ value }) => {
featureFlagsStore.setActivity(value.value);
void featureFlagsStore.fetchFlags();
}}
/>
</div>
<div>
<Select
options={[
{ label: 'Newest', value: 'DESC' },
{ label: 'Oldest', value: 'ASC' }
]}
defaultValue={featureFlagsStore.sort.order}
plain
onChange={({ value }) => {
featureFlagsStore.setSort({ query: '', order: value.value });
void featureFlagsStore.fetchFlags();
}}
/>
</div>
</div>
<Loader loading={featureFlagsStore.isLoading}>
<div className="w-full h-full">
<NoContent
show={featureFlagsStore.flags.length === 0}
title={
<div className={'flex flex-col items-center justify-center'}>
<AnimatedSVG name={ICONS.NO_FFLAGS} size={60} />
<div className="text-center mt-4 text-lg font-medium">
{featureFlagsStore.sort.query === ''
? 'You haven\'t created any feature flags yet'
: 'No matching results'}
</div>
</div>
}
subtext={
featureFlagsStore.sort.query === '' ? (
<div className="text-center flex justify-center items-center flex-col">
Use feature flags to deploy and rollback new functionality with ease.
</div>
) : null
}
>
<div>
<div className={'flex items-center font-semibold border-b py-2 px-6'}>
<div style={{ flex: 1 }}>Key</div>
<div style={{ flex: 1 }}>Last modified</div>
<div style={{ flex: 1 }}>By</div>
<div style={{ marginLeft: 'auto', width: 115 }}>Status</div>
</div>
{featureFlagsStore.flags.map((flag) => (
<React.Fragment key={flag.featureFlagId}>
<FFlagItem flag={flag} />
</React.Fragment>
))}
</div>
<div className="w-full flex items-center justify-between pt-4 px-6">
<div>
Showing{' '}
<span className="font-medium">
{(featureFlagsStore.page - 1) * featureFlagsStore.pageSize + 1}
</span>{' '}
to{' '}
<span className="font-medium">
{(featureFlagsStore.page - 1) * featureFlagsStore.pageSize +
featureFlagsStore.flags.length}
</span>{' '}
of <span className="font-medium">{numberWithCommas(featureFlagsStore.total)}</span>{' '}
Feature Flags.
</div>
<Pagination
page={featureFlagsStore.page}
total={featureFlagsStore.total}
onPageChange={(page) => featureFlagsStore.setPage(page)}
limit={featureFlagsStore.pageSize}
debounceRequest={100}
/>
</div>
</NoContent>
</div>
</Loader>
</div>
);
}
export default withPermissions(['FEATURE_FLAGS'])(observer(FFlagsList));