11// Libraries
2- import React , { PureComponent , ChangeEvent , FormEvent } from 'react'
2+ import React , { ChangeEvent , FormEvent , PureComponent } from 'react'
33
44// Components
5- import { Form , Input , Button , Accordion , Overlay } from '@influxdata/clockface'
5+ // Types
6+ import {
7+ Accordion ,
8+ BannerPanel ,
9+ Button ,
10+ ButtonType ,
11+ ComponentColor ,
12+ ComponentSize ,
13+ ComponentStatus ,
14+ FlexBox ,
15+ Form ,
16+ Gradients ,
17+ InfluxColors ,
18+ Input ,
19+ JustifyContent ,
20+ Overlay ,
21+ } from '@influxdata/clockface'
622import Retention from 'src/buckets/components/Retention'
723import { SchemaToggle } from 'src/buckets/components/createBucketForm/SchemaToggle'
824
925// Constants
1026import {
11- isSystemBucket ,
1227 BUCKET_NAME_MINIMUM_CHARACTERS ,
28+ isSystemBucket ,
1329} from 'src/buckets/constants'
14-
15- // Types
16- import {
17- ButtonType ,
18- ComponentColor ,
19- ComponentStatus ,
20- } from '@influxdata/clockface'
2130import { RuleType } from 'src/buckets/reducers/createBucket'
2231import { CLOUD } from 'src/shared/constants'
2332
2433import {
2534 MeasurementSchemaSection ,
2635 SchemaUpdateInfo ,
2736} from 'src/buckets/components/createBucketForm/MeasurementSchemaSection'
37+ import { extractBucketMaxRetentionSeconds } from 'src/cloud/utils/limits'
38+ import { AppState } from 'src/types'
39+ import { connect } from 'react-redux'
40+ import CloudUpgradeButton from 'src/shared/components/CloudUpgradeButton'
41+ import './BucketOverlayFormStyles.scss'
2842
2943let MeasurementSchemaList = null ,
3044 MeasurementSchemaCreateRequest = null ,
@@ -41,7 +55,7 @@ if (CLOUD) {
4155 * need the schemaType that is already set;
4256 * if !isEditing (it is false)
4357 * then need the 'onChangeSchemaType' method*/
44- interface Props {
58+ interface OwnProps {
4559 name : string
4660 retentionSeconds : number
4761 ruleType : 'expire'
@@ -66,19 +80,27 @@ interface Props {
6680 useSimplifiedBucketForm ?: boolean
6781}
6882
83+ interface StateProps {
84+ maxRetentionSeconds : number
85+ }
86+
87+ type Props = OwnProps & StateProps
88+
6989interface State {
7090 showAdvanced : boolean
7191 schemaType : 'implicit' | 'explicit'
7292 newMeasurementSchemas : typeof MeasurementSchemaCreateRequest [ ]
7393 measurementSchemaUpdates : SchemaUpdateInfo [ ]
94+ retentionPeriodMaxReached : boolean
7495}
7596
76- export default class BucketOverlayForm extends PureComponent < Props > {
97+ class BucketOverlayForm extends PureComponent < Props > {
7798 public state : State = {
7899 showAdvanced : false ,
79100 schemaType : 'implicit' ,
80101 newMeasurementSchemas : [ ] ,
81102 measurementSchemaUpdates : [ ] ,
103+ retentionPeriodMaxReached : false ,
82104 }
83105
84106 onChangeSchemaTypeInternal = ( newSchemaType : typeof SchemaType ) => {
@@ -97,6 +119,7 @@ export default class BucketOverlayForm extends PureComponent<Props> {
97119 this . props . onUpdateMeasurementSchemas ( schemas )
98120 this . setState ( { measurementSchemaUpdates : schemas } )
99121 }
122+ private upgradeBannerStyle = { marginBottom : '28px' }
100123
101124 public render ( ) {
102125 const {
@@ -197,21 +220,44 @@ export default class BucketOverlayForm extends PureComponent<Props> {
197220 />
198221 ) }
199222 </ Form . ValidationElement >
200- < Form . Element
223+ < Form . ValidationElement
201224 label = {
202225 useSimplifiedBucketForm
203226 ? 'Data Retention Preferences'
204227 : 'Delete Data'
205228 }
229+ value = { retentionSeconds . toString ( ) }
230+ validationFunc = { this . handleRetentionSecondsValidation }
231+ className = "retention--dropdown"
206232 >
207- < Retention
208- type = { ruleType }
209- retentionSeconds = { retentionSeconds }
210- onChangeRuleType = { onChangeRuleType }
211- onChangeRetentionRule = { onChangeRetentionRule }
212- useSimplifiedForm = { useSimplifiedBucketForm }
213- />
214- </ Form . Element >
233+ { status => (
234+ < Retention
235+ type = { ruleType }
236+ retentionSeconds = { retentionSeconds }
237+ onChangeRuleType = { onChangeRuleType }
238+ onChangeRetentionRule = { onChangeRetentionRule }
239+ useSimplifiedForm = { useSimplifiedBucketForm }
240+ status = { status }
241+ />
242+ ) }
243+ </ Form . ValidationElement >
244+ { this . state . retentionPeriodMaxReached && (
245+ < BannerPanel
246+ size = { ComponentSize . ExtraSmall }
247+ gradient = { Gradients . PolarExpress }
248+ hideMobileIcon = { true }
249+ textColor = { InfluxColors . Yeti }
250+ style = { this . upgradeBannerStyle }
251+ >
252+ < FlexBox
253+ justifyContent = { JustifyContent . SpaceBetween }
254+ stretchToFitWidth = { true }
255+ >
256+ < h6 > Need retention period more than 30 days?</ h6 >
257+ < CloudUpgradeButton size = { ComponentSize . ExtraSmall } />
258+ </ FlexBox >
259+ </ BannerPanel >
260+ ) }
215261 { useSimplifiedBucketForm ? null : makeAdvancedSection ( ) }
216262 </ Overlay . Body >
217263 < Overlay . Footer >
@@ -259,6 +305,19 @@ export default class BucketOverlayForm extends PureComponent<Props> {
259305 return null
260306 }
261307
308+ private handleRetentionSecondsValidation = ( value : string ) : string | null => {
309+ const { maxRetentionSeconds} = this . props
310+ if ( Number ( value ) <= 0 ) {
311+ return ` `
312+ }
313+
314+ if ( maxRetentionSeconds && Number ( value ) > maxRetentionSeconds ) {
315+ this . setState ( { retentionPeriodMaxReached : true } )
316+ return ' '
317+ }
318+
319+ return null
320+ }
262321 private get nameHelpText ( ) : string {
263322 if ( this . props . isEditing ) {
264323 return 'To rename bucket use the RENAME button below'
@@ -278,13 +337,21 @@ export default class BucketOverlayForm extends PureComponent<Props> {
278337 }
279338
280339 private get submitButtonStatus ( ) : ComponentStatus {
281- const { name} = this . props
340+ const { name, retentionSeconds } = this . props
282341 const nameHasErrors = this . handleNameValidation ( name )
342+ const durationHasErrors = this . handleRetentionSecondsValidation (
343+ retentionSeconds . toString ( )
344+ )
283345
284- if ( nameHasErrors ) {
346+ if ( nameHasErrors || durationHasErrors ) {
285347 return ComponentStatus . Disabled
286348 }
287349
288350 return ComponentStatus . Default
289351 }
290352}
353+ const mstp = ( state : AppState ) => ( {
354+ maxRetentionSeconds : extractBucketMaxRetentionSeconds ( state ) ,
355+ } )
356+
357+ export default connect < StateProps , { } , OwnProps > ( mstp ) ( BucketOverlayForm )
0 commit comments