1+ import { computed } from 'mobx' ;
2+ import { observer } from 'mobx-react' ;
3+ import { ObservedComponent } from 'mobx-react-helper' ;
4+ import { Field , RestForm } from 'mobx-restful-table' ;
5+
6+ import fileStore from '../../models/File' ;
7+ import { Sponsor , SponsorLevel , SponsorModel , SponsorStatus } from '../../models/Sponsor' ;
8+ import { i18n , I18nContext } from '../../models/Translation' ;
9+
10+ export interface SponsorEditorProps {
11+ sponsor ?: Sponsor ;
12+ activityId : number ;
13+ }
14+
15+ @observer
16+ export class SponsorEditor extends ObservedComponent < SponsorEditorProps , typeof i18n > {
17+ static contextType = I18nContext ;
18+
19+ sponsorStore = new SponsorModel ( this . props . activityId ) ;
20+
21+ componentDidMount ( ) {
22+ const { sponsor } = this . props ;
23+
24+ if ( sponsor ) this . sponsorStore . currentOne = sponsor ;
25+ }
26+
27+ submitHandler = ( data : Sponsor ) => {
28+ const { activityId } = this . props ;
29+ const { t } = this . observedContext ;
30+ const isUpdate = ! ! this . props . sponsor ;
31+
32+ alert ( isUpdate ? t ( 'sponsor_updated_successfully' ) : t ( 'sponsor_created_successfully' ) ) ;
33+
34+ window . location . href = `/activity/${ activityId } /sponsor` ;
35+ } ;
36+
37+ @computed
38+ get fields ( ) : Field < Sponsor > [ ] {
39+ const { t } = this . observedContext ;
40+
41+ return [
42+ {
43+ key : 'name' ,
44+ renderLabel : t ( 'name' ) ,
45+ required : true ,
46+ invalidMessage : t ( 'field_required' ) ,
47+ } ,
48+ {
49+ key : 'englishName' ,
50+ renderLabel : t ( 'english_name' ) ,
51+ } ,
52+ {
53+ key : 'url' ,
54+ renderLabel : t ( 'website' ) ,
55+ type : 'url' ,
56+ } ,
57+ {
58+ key : 'logo' ,
59+ renderLabel : t ( 'logo' ) ,
60+ type : 'file' ,
61+ accept : 'image/*' ,
62+ uploader : fileStore ,
63+ } ,
64+ {
65+ key : 'level' ,
66+ renderLabel : t ( 'sponsor_level' ) ,
67+ type : 'select' ,
68+ options : Object . values ( SponsorLevel ) . map ( level => ( {
69+ title : t ( `sponsor_level_${ level } ` ) ,
70+ value : level ,
71+ } ) ) ,
72+ required : true ,
73+ invalidMessage : t ( 'field_required' ) ,
74+ } ,
75+ {
76+ key : 'sponsorshipAmount' ,
77+ renderLabel : t ( 'sponsorship_amount' ) ,
78+ type : 'number' ,
79+ min : 0 ,
80+ step : 100 ,
81+ } ,
82+ {
83+ key : 'contactPerson' ,
84+ renderLabel : t ( 'contact_person' ) ,
85+ } ,
86+ {
87+ key : 'status' ,
88+ renderLabel : t ( 'status' ) ,
89+ type : 'select' ,
90+ options : Object . values ( SponsorStatus ) . map ( status => ( {
91+ title : t ( `sponsor_status_${ status } ` ) ,
92+ value : status ,
93+ } ) ) ,
94+ required : true ,
95+ invalidMessage : t ( 'field_required' ) ,
96+ } ,
97+ {
98+ key : 'summary' ,
99+ renderLabel : t ( 'summary' ) ,
100+ rows : 3 ,
101+ } ,
102+ {
103+ key : 'remarks' ,
104+ renderLabel : t ( 'remarks' ) ,
105+ rows : 3 ,
106+ } ,
107+ ] ;
108+ }
109+
110+ render ( ) {
111+ const { downloading, uploading } = this . sponsorStore ;
112+
113+ const loading = downloading > 0 || uploading > 0 ;
114+
115+ return (
116+ < >
117+ < RestForm
118+ className = "container-fluid"
119+ translator = { this . observedContext }
120+ store = { this . sponsorStore }
121+ fields = { this . fields }
122+ onSubmit = { this . submitHandler }
123+ />
124+ { loading && < div > Loading...</ div > }
125+ </ >
126+ ) ;
127+ }
128+ }
0 commit comments