1- import React from 'react' ;
1+ import React , { Fragment } from 'react' ;
22import { Labeled , TextField } from 'react-admin' ;
33import { useTranslate } from 'ra-core' ;
44import Grid from '@material-ui/core/Grid' ;
@@ -13,6 +13,7 @@ import ExpansionPanel from '@material-ui/core/ExpansionPanel';
1313import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary' ;
1414import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails' ;
1515import classnames from 'classnames' ;
16+ import moment from 'moment' ;
1617
1718import { useCopyToClipboard } from '../ui' ;
1819
@@ -33,6 +34,11 @@ const getStatusColor = (classes, status) => {
3334 statusLabel : 'Delete_Failed' ,
3435 statusColorClass : classes . disabled ,
3536 } ;
37+ case 'EXPIRED' :
38+ return {
39+ statusLabel : 'Expired' ,
40+ statusColorClass : classes . expired ,
41+ } ;
3642 default :
3743 return {
3844 statusLabel : 'Disabled' ,
@@ -42,7 +48,7 @@ const getStatusColor = (classes, status) => {
4248} ;
4349
4450export const ApplicationDetailsKeyClient = props => {
45- const { data, includeSecret } = props ;
51+ const { data, includeSecret, isKeyExpiryEnabled } = props ;
4652 const classes = useStyles ( ) ;
4753 const translate = useTranslate ( ) ;
4854 const copyToClipboard = useCopyToClipboard ( {
@@ -58,6 +64,56 @@ export const ApplicationDetailsKeyClient = props => {
5864 data . status
5965 ) ;
6066
67+ const getExpiryDateText = data => {
68+ let expiryDateText = translate (
69+ 'resources.applications.fields.none'
70+ ) ;
71+ const secretExpiryTs = data . secretExpiryTs ;
72+ if ( isKeyExpiryEnabled && secretExpiryTs ) {
73+ const keyExpiryDate = moment ( secretExpiryTs ) ;
74+ expiryDateText = keyExpiryDate . format (
75+ 'dddd, MMMM Do YYYY, HH:mm:ss'
76+ ) ;
77+ }
78+ return expiryDateText ;
79+ } ;
80+
81+ const getExpiryDateSubText = data => {
82+ let expiryDateSubText = '' ;
83+ const secretExpiryTs = data . secretExpiryTs ;
84+ const keyStatus = data . status ;
85+ if ( isKeyExpiryEnabled && secretExpiryTs ) {
86+ const keyExpiryDate = moment ( secretExpiryTs ) ;
87+ const currentTime = moment ( ) ;
88+ if ( keyStatus === 'EXPIRED' ) {
89+ expiryDateSubText = translate (
90+ 'resources.applications.status.expired'
91+ ) ;
92+ } else {
93+ const days = keyExpiryDate . diff ( currentTime , 'days' ) ;
94+ let suffix = translate (
95+ 'resources.applications.fields.days'
96+ ) ;
97+ if ( days === 1 ) {
98+ suffix = translate (
99+ 'resources.applications.fields.day'
100+ ) ;
101+ }
102+ expiryDateSubText = `${ days } ${ suffix } ` ;
103+ }
104+ }
105+ return expiryDateSubText ;
106+ } ;
107+
108+ const getExpiryDateSubTextClass = data => {
109+ let expiryDateSubTextClass = '' ;
110+ const keyStatus = data . status ;
111+ if ( keyStatus === 'EXPIRED' ) {
112+ expiryDateSubTextClass = classes . expiredKeyStatus ;
113+ }
114+ return expiryDateSubTextClass ;
115+ } ;
116+
61117 return (
62118 < ListItem
63119 disableGutters
@@ -225,7 +281,7 @@ export const ApplicationDetailsKeyClient = props => {
225281 </ Grid >
226282 ) }
227283 </ Grid >
228- < Grid >
284+ < Grid container >
229285 { data . oauthType && (
230286 < Grid item md = { 6 } sm = { 6 } xs = { 12 } >
231287 < Labeled
@@ -245,6 +301,40 @@ export const ApplicationDetailsKeyClient = props => {
245301 </ Labeled >
246302 </ Grid >
247303 ) }
304+ { isKeyExpiryEnabled && (
305+ < Grid item md = { 6 } sm = { 6 } xs = { 12 } >
306+ < Labeled
307+ // On <Labeled />, this will translate in a correct `for` attribute on the label
308+ id = "expiryDate"
309+ label = {
310+ 'resources.applications.fields.expiryDate'
311+ }
312+ classes = { classes }
313+ className = { classes . fieldLabel }
314+ >
315+ < Fragment >
316+ < Typography
317+ variant = "body2"
318+ className = { classes . fieldContent }
319+ >
320+ < span
321+ className = { classes . fieldValue }
322+ >
323+ { getExpiryDateText ( data ) }
324+ </ span >
325+ </ Typography >
326+ < Typography
327+ className = { getExpiryDateSubTextClass (
328+ data
329+ ) }
330+ variant = "body2"
331+ >
332+ { getExpiryDateSubText ( data ) }
333+ </ Typography >
334+ </ Fragment >
335+ </ Labeled >
336+ </ Grid >
337+ ) }
248338 </ Grid >
249339 </ ExpansionPanelDetails >
250340 </ ExpansionPanel >
@@ -277,6 +367,16 @@ const useStyles = makeStyles(
277367 backgroundColor : '#4CAF50' ,
278368 } ,
279369 } ,
370+ expired : {
371+ color : '#B30303' ,
372+ '&:before' : {
373+ backgroundColor : '#B30303' ,
374+ } ,
375+ } ,
376+ expiredKeyStatus : {
377+ color : '#B30303' ,
378+ fontFamily : 'clear-sans-bold' ,
379+ } ,
280380 disabled : {
281381 color : '#696969' ,
282382 '&:before' : {
0 commit comments