@@ -11,11 +11,15 @@ import { MetricFormValuesContext, MetricFormValuesStorage } from '../storages/Me
1111import { ReactComponent as SVGTrash } from 'bootstrap-icons/icons/trash.svg' ;
1212import { IActions } from '../storages/MetricFormValues/reducer' ;
1313import {
14+ METRIC_META_SHARED_STRATEGY ,
15+ METRIC_META_SHARED_STRATEGY_DESCRIPTION ,
1416 METRIC_META_TAG_RAW_KIND ,
1517 METRIC_TYPE ,
1618 METRIC_TYPE_DESCRIPTION ,
19+ MetricMetaSharedStrategy ,
1720 type MetricMetaTagRawKind ,
1821 type MetricType ,
22+ toMetricMetaSharedStrategy ,
1923 toMetricMetaTagRawKind ,
2024} from '@/api/enum' ;
2125import { maxTagsSize } from '@/common/settings' ;
@@ -37,6 +41,21 @@ import { useHistoricalMetricVersion } from '@/hooks/useHistoricalMetricVersion';
3741
3842const METRIC_TYPE_KEYS : MetricType [ ] = Object . values ( METRIC_TYPE ) ;
3943const METRIC_META_TAG_RAW_KIND_KEYS : MetricMetaTagRawKind [ ] = Object . values ( METRIC_META_TAG_RAW_KIND ) ;
44+ const METRIC_META_SHARED_STRATEGY_KEYS : MetricMetaSharedStrategy [ ] = Object . values ( METRIC_META_SHARED_STRATEGY ) ;
45+
46+ const kindConfig = [
47+ { label : 'Counter' , value : 'counter' } ,
48+ { label : 'Value' , value : 'value' } ,
49+ { label : 'Unique' , value : 'unique' } ,
50+ { label : 'Mixed' , value : 'mixed' } ,
51+ ] ;
52+
53+ const shardStrategyConfig = METRIC_META_SHARED_STRATEGY_KEYS . map ( ( value ) => ( {
54+ label : METRIC_META_SHARED_STRATEGY_DESCRIPTION [ value ] ,
55+ value : value ,
56+ } ) ) ;
57+
58+ const tagsConfig = new Array ( maxTagsSize ) . fill ( 0 ) . map ( ( _v , n ) => n + 1 ) ;
4059
4160export function FormPage ( props : { yAxisSize : number ; adminMode : boolean } ) {
4261 const { adminMode } = props ;
@@ -84,13 +103,6 @@ export function FormPage(props: { yAxisSize: number; adminMode: boolean }) {
84103 ) ;
85104}
86105
87- const kindConfig = [
88- { label : 'Counter' , value : 'counter' } ,
89- { label : 'Value' , value : 'value' } ,
90- { label : 'Unique' , value : 'unique' } ,
91- { label : 'Mixed' , value : 'mixed' } ,
92- ] ;
93-
94106export function EditForm ( props : { isReadonly : boolean ; adminMode : boolean ; isHistoricalMetric : boolean } ) {
95107 const { isReadonly, adminMode, isHistoricalMetric } = props ;
96108 const { values, dispatch } = useContext ( MetricFormValuesContext ) ;
@@ -294,18 +306,20 @@ export function EditForm(props: { isReadonly: boolean; adminMode: boolean; isHis
294306 < div className = "col-sm" >
295307 < div className = "row" >
296308 < div className = "col-sm-auto" >
297- < input
309+ < select
298310 id = "tagsNum"
299311 name = "tagsNum"
300- className = "form-control"
301- type = "number"
302- min = "1"
303- max = { maxTagsSize }
304- step = "1"
312+ className = "form-select"
305313 value = { values . tagsSize }
306314 onChange = { ( e ) => dispatch ( { type : 'numTags' , num : e . target . value } ) }
307315 disabled = { isReadonly }
308- />
316+ >
317+ { tagsConfig . map ( ( n ) => (
318+ < option key = { n } value = { n } >
319+ { n }
320+ </ option >
321+ ) ) }
322+ </ select >
309323 </ div >
310324 </ div >
311325 < div id = "tagsHelpBlock" className = "form-text" >
@@ -602,6 +616,49 @@ export function EditForm(props: { isReadonly: boolean; adminMode: boolean; isHis
602616 </ div >
603617 < div id = "fair_key_tag_idsHelpBlock" className = "form-text" > </ div >
604618 </ div >
619+ < div className = "row mb-3" >
620+ < label htmlFor = "shard_strategy" className = "col-sm-2 col-form-label" >
621+ Shared strategy
622+ </ label >
623+ < div className = "col-sm-auto" >
624+ < select
625+ id = "shard_strategy"
626+ className = "form-select"
627+ value = { values . shard_strategy }
628+ onChange = { ( e ) =>
629+ dispatch ( {
630+ shard_strategy : toMetricMetaSharedStrategy ( e . target . value , METRIC_META_SHARED_STRATEGY . noStrategy ) ,
631+ } )
632+ }
633+ disabled = { isReadonly || ! adminMode }
634+ >
635+ { shardStrategyConfig . map ( ( item ) => (
636+ < option key = { item . value } value = { item . value } >
637+ { item . label }
638+ </ option >
639+ ) ) }
640+ </ select >
641+ </ div >
642+ < div id = "shardStrategyHelpBlock" className = "form-text" > </ div >
643+ </ div >
644+ < div className = "row mb-3" >
645+ < label htmlFor = "shard_num" className = "col-sm-2 col-form-label" >
646+ Shared num
647+ </ label >
648+ < div className = "col-sm-auto" >
649+ < input
650+ id = "shard_num"
651+ type = "number"
652+ min = { 1 }
653+ step = { 1 }
654+ className = "form-control"
655+ value = { toNumber ( values . shard_num , 0 ) + 1 }
656+ onChange = { ( e ) => dispatch ( { shard_num : toNumber ( e . target . value , 0 ) - 1 } ) }
657+ disabled = { isReadonly || ! adminMode || values . shard_strategy !== 'fixed_shard' }
658+ />
659+ </ div >
660+ < div id = "shardNumHelpBlock" className = "form-text" > </ div >
661+ </ div >
605662
606663 < div >
607664 { /*<button type="button" disabled={isRunning || isReadonly} className="btn btn-primary me-3" onClick={onSubmit}>*/ }
0 commit comments