3
3
* License: MS-RSL – see LICENSE.md for details
4
4
*/
5
5
6
- import { Row , Col } from "antd" ;
7
- import {
8
- React ,
9
- useMemo ,
10
- useTypedRedux ,
11
- useEffect ,
12
- redux ,
13
- } from "../../app-framework" ;
6
+ import { Alert , Row , Col } from "antd" ;
7
+ import { useEffect , useMemo , useState } from "react" ;
8
+ import { useTypedRedux , redux } from "../../app-framework" ;
14
9
import { Loading , TimeAgo } from "../../components" ;
15
10
import { projects_with_licenses } from "./util" ;
16
11
import { plural , trunc_middle } from "@cocalc/util/misc" ;
17
12
import { LICENSES_STYLE } from "./managed-licenses" ;
18
13
import { Virtuoso } from "react-virtuoso" ;
14
+ import { SelectProject } from "@cocalc/frontend/projects/select-project" ;
15
+ import { SiteLicense } from "@cocalc/frontend/project/settings/site-license" ;
19
16
20
- function open_project ( project_id : string ) : void {
21
- redux . getActions ( "projects" ) . open_project ( { project_id } ) ;
22
- redux . getProjectActions ( project_id ) . set_active_tab ( "settings" ) ;
23
- }
24
-
25
- export const ProjectsWithLicenses : React . FC = ( ) => {
17
+ export function ProjectsWithLicenses ( { } ) {
18
+ const [ project_id , setProjectId ] = useState < string | undefined > ( undefined ) ;
26
19
const project_map = useTypedRedux ( "projects" , "project_map" ) ;
27
20
const all_projects_have_been_loaded = useTypedRedux (
28
21
"projects" ,
29
- "all_projects_have_been_loaded"
22
+ "all_projects_have_been_loaded" ,
30
23
) ;
31
24
const projects = useMemo (
32
25
( ) => projects_with_licenses ( project_map ) ,
33
- [ project_map ]
26
+ [ project_map ] ,
34
27
) ;
35
28
36
29
useEffect ( ( ) => {
@@ -47,7 +40,7 @@ export const ProjectsWithLicenses: React.FC = () => {
47
40
key = { projects [ index ] ?. project_id }
48
41
style = { { borderBottom : "1px solid lightgrey" , cursor : "pointer" } }
49
42
onClick = { ( ) => {
50
- open_project ( project_id ) ;
43
+ setProjectId ( project_id ) ;
51
44
} }
52
45
>
53
46
< Col span = { 12 } style = { { paddingLeft : "15px" } } >
@@ -74,7 +67,7 @@ export const ProjectsWithLicenses: React.FC = () => {
74
67
}
75
68
return (
76
69
< div
77
- style = { { ...LICENSES_STYLE , height : "50vh " } }
70
+ style = { { ...LICENSES_STYLE , height : "175px" , marginTop : "5px " } }
78
71
className = { "smc-vfill" }
79
72
>
80
73
< Virtuoso
@@ -86,16 +79,32 @@ export const ProjectsWithLicenses: React.FC = () => {
86
79
) ;
87
80
}
88
81
89
- function render_count ( ) {
90
- if ( projects == null || projects . length == 0 ) return ;
91
- return < > ({ projects . length } )</ > ;
92
- }
93
-
94
82
return (
95
83
< div >
96
- { " " }
97
- < h3 > Projects with licenses { render_count ( ) } </ h3 >
84
+ < h3 > Projects</ h3 >
85
+ < Alert
86
+ style = { { marginBottom : "15px" } }
87
+ banner
88
+ type = "info"
89
+ message = {
90
+ < >
91
+ Select a project below to add or remove a license from that project,
92
+ or to buy a license for that project.
93
+ </ >
94
+ }
95
+ />
96
+ < SelectProject value = { project_id } onChange = { setProjectId } />
97
+ { project_id && project_map && (
98
+ < SiteLicense
99
+ project_id = { project_id }
100
+ site_license = { project_map . getIn ( [ project_id , "site_license" ] ) as any }
101
+ />
102
+ ) }
103
+ < div style = { { marginTop : "10px" } } >
104
+ The following { projects . length } { plural ( projects . length , "project" ) } { " " }
105
+ have a license:
106
+ </ div >
98
107
{ render_projects_with_license ( ) }
99
108
</ div >
100
109
) ;
101
- } ;
110
+ }
0 commit comments