diff --git a/frontend/app/components/FFlags/FFlagsList.tsx b/frontend/app/components/FFlags/FFlagsList.tsx
index 50028a701..0febf8016 100644
--- a/frontend/app/components/FFlags/FFlagsList.tsx
+++ b/frontend/app/components/FFlags/FFlagsList.tsx
@@ -1,3 +1,4 @@
+import {numberWithCommas} from "App/utils";
import React from 'react';
import FFlagsListHeader from 'Components/FFlags/FFlagsListHeader';
import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
@@ -91,12 +92,9 @@ function FFlagsList({ siteId }: { siteId: string }) {
- {'Showing '}
-
- {Math.min(featureFlagsStore.total, featureFlagsStore.pageSize)}
-
- {' out of '}
- {featureFlagsStore.total} Feature Flags
+ Showing {(featureFlagsStore.page - 1) * featureFlagsStore.pageSize + 1} to{' '}
+ {(featureFlagsStore.page - 1) * featureFlagsStore.pageSize + featureFlagsStore.flags.length} of{' '}
+ {numberWithCommas(featureFlagsStore.total)} Feature Flags.
- {
- `
-type FeatureFlag = {
- key: string;
- is_persist: boolean;
- value: string | boolean;
- payload: string
+ {`
+// can be imported from @openreplay/tracker
+interface IFeatureFlag {
+ key: string
+ is_persist: boolean
+ value: string | boolean
+ payload: string
}
-tracker.onFlagsLoad((flags: FeatureFlag) => {
+tracker.onFlagsLoad((flags: IFeatureFlag[]) => {
/* run code */
})
@@ -27,12 +27,21 @@ tracker.onFlagsLoad((flags: FeatureFlag) => {
if (openreplay.isFlagEnabled('my_flag')) {
// run your activation code here
-}`}
+}
+
+// or
+// returns FeatureFlag if exists
+tracker.getFeatureFlag('my_flag')
+
+// reload flags from server
+// (in case if any user data changed during the session)
+tracker.reloadFlags()
+`}
Documentation
- )
+ );
}
-export default HowTo;
\ No newline at end of file
+export default HowTo;
diff --git a/frontend/app/components/FFlags/NewFFlag/Multivariant.tsx b/frontend/app/components/FFlags/NewFFlag/Multivariant.tsx
index ceccd46a8..dde352620 100644
--- a/frontend/app/components/FFlags/NewFFlag/Multivariant.tsx
+++ b/frontend/app/components/FFlags/NewFFlag/Multivariant.tsx
@@ -137,7 +137,7 @@ function Multivariant() {
})}
- {featureFlagsStore.currentFflag!.variants.length <= 10 ? (
+ {featureFlagsStore.currentFflag!.variants.length < 10 ? (
diff --git a/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx b/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx
index 8a023911d..c26b8fbad 100644
--- a/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx
+++ b/frontend/app/components/shared/Filters/FilterItem/FilterItem.tsx
@@ -60,7 +60,7 @@ function FilterItem(props: Props) {
};
return (
-
+
{!isFilter && (
{filter.value.map((val: string) => {
return filter.options && filter.options.length
- ? filter.options[filter.options.findIndex((i: any) => i.value === val)]?.label
+ ? filter.options[filter.options.findIndex((i: any) => i.value === val)]?.label ?? val
: val
}).join(', ')}
diff --git a/frontend/app/mstore/featureFlagsStore.ts b/frontend/app/mstore/featureFlagsStore.ts
index 120cb0e6a..7f892b30b 100644
--- a/frontend/app/mstore/featureFlagsStore.ts
+++ b/frontend/app/mstore/featureFlagsStore.ts
@@ -112,7 +112,7 @@ export default class FeatureFlagsStore {
if (!this.currentFflag.isSingleOption && this.currentFflag?.variants.findIndex((v) => v.value === '') !== -1) {
return 'All variants must include unique key'
}
- if (this.currentFflag?.isRedDistribution) {
+ if (!this.currentFflag?.isSingleOption && this.currentFflag?.isRedDistribution) {
return 'Variants rollout percentage must add up to 100%'
}
return null;
diff --git a/frontend/app/mstore/types/FeatureFlag.ts b/frontend/app/mstore/types/FeatureFlag.ts
index 9b6f689c2..90293cc4b 100644
--- a/frontend/app/mstore/types/FeatureFlag.ts
+++ b/frontend/app/mstore/types/FeatureFlag.ts
@@ -187,6 +187,9 @@ export default class FeatureFlag {
setIsSingleOption = (isSingleOption: boolean) => {
this.isSingleOption = isSingleOption;
+ if (isSingleOption) {
+ this.variants = []
+ }
this.setHasChanged(true)
}