рдПрдЯрд▓рд╕рд┐рдпрди рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдЯрд▓рд╕рд┐рдпрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдкрд░рд┐рдЪрдп


рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдФрд░ рдбрд╛рдЯрд╛ рд╕реЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП Atlassian рдЙрддреНрдкрд╛рджреЛрдВ, рддреЛ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡реА рдПрдо , рд╕реЛрдпрд╛ , requirejs , jQuery , рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдЙрдкрд▓рдмреНрдз рдЖрдк рдмреЙрдХреНрд╕ рдХреЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ ред рдпрд╣рд╛рдБ рдпрд╣рд╛рдБ рдЖрдк рдХреИрд╕реЗ рдмреЙрдХреНрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдмрд╛рд╣рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реНрдЯреИрдХ рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреБрдирд╛ рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд░рдо рдореЗрдВ рдпрд╣ рдЖрд╕рд╛рди рдмрд╛рджрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕рд░реНрд╡рд░ рдкреНрд▓рдЧ-рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рд╣реИ atlaskit ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдЯрд▓реЗрд╕рд┐рдпрди рдЬреАрд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдПрдЯрд▓рд╕рд┐рдпрди рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдЖрд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ git рдФрд░ Atlassian SDK рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

рддреЛ, рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

рдорд╛рд╡реЗрди рдЖрд░реНрдХрд┐рдЯрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред


рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд╡реЗрди рдЖрд░реНрдХрдПрдкреНрдЯрд╛рдЗрдк рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдВрдЧреАред

рдпрджрд┐ рдЖрдк рдЖрд░реНрдХрдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдЗрд╕ рдЖрд░реНрдХ - рдЯрд╛рдЗрдк рд╕реЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдЗрдХрдЯреНрдард╛ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдореЗрд░реЗ Bitbucket рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЪрд╛рдкрд▓реВрд╕реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ:

git clone https://alex1mmm@bitbucket.org/alex1mmm/jira-react-atlaskit-archetype.git --branch v1 --single-branch

Jira-reaction-atlaskit-archetype рдлрд╝реЛрд▓реНрдбрд░ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп Maven рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЗрд╕ archetype рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

cd jira-react-atlaskit-archetype
atlas-mvn install

рдЙрд╕рдХреЗ рдмрд╛рдж, рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдПрдХ рд╕реНрддрд░ рдЕрдзрд┐рдХ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ:

cd ..
atlas-mvn archetype:generate -DarchetypeCatalog=local

рдПрдХ рдкреНрд░рд╢реНрди рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдореЗрд░реЗ рдкреБрд░рд╛рд▓реЗрдЦ рд╣реИрдВ:

1: local -> com.cprime.jira.sil.extension:sil-extension-archetype (This is the com.cprime.jira.sil.extension:sil-extension plugin for Atlassian JIRA.)
2: local -> ru.matveev.alexey.sil.extension:sil-extension-archetype (This is the ru.matveev.alexey.sil.extension:sil-extension plugin for Atlassian JIRA.)
3: local -> ru.matveev.alexey.atlas.jira:jira-react-atlaskit-archetype-archetype (jira-react-atlaskit-archetype-archetype)

Ru.matveev.alexey.atlas.jira: jira-reaction-atlaskit-archetype-archetype рдЪреБрдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрддреНрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 3 рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред

рдлрд┐рд░ рдЖрдкрдХреЛ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣ рдФрд░ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

Define value for property 'groupId': react.atlaskit.tutorial
Define value for property 'artifactId': my-tutorial
Define value for property 'version' 1.0-SNAPSHOT: : 
Define value for property 'package' react.atlaskit.tutorial: : 
Confirm properties configuration:
groupId: react.atlaskit.tutorial
artifactId: my-tutorial
version: 1.0-SNAPSHOT
package: react.atlaskit.tutorial
 Y: : Y

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ:

cd my-tutorial
atlas-mvn package

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдмреИрдХрдПрдВрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ Atlassian Jira рдЪрд▓рд╛рдПрдВ:

cd backend
atlas-run

рдкрд░реАрдХреНрд╖рдг рдкреНрд▓рдЧрдЗрди


рдПрдЯрдЯрд▓рд┐рдпрди рдЬреАрд░рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрди рдкрддреЗ рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдЬрд╛рдПрдВ:

http://localhost:2990/jira

рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдФрд░ рдЧрд┐рдпрд░ рдкрд░ рдЬрд╛рдПрдВ -> рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВред



рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рд╕реЗ рдПрдХ рдореЗрдиреВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рддрддреНрд╡реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рд╕реНрдЯрдо -> рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП INFO рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рд╕реЗрдЯ рдХрд░реЗрдВред react.atlaskit.tutorial.servlet рдкреИрдХреЗрдЬред



рдЕрдм рдореИрдиреЗрдЬ рдРрдкреНрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдлреЙрд░реНрдо рдореЗрдиреВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╣рдо рдбреЗрдЯрд╛ рдПрдВрдЯреНрд░реА рдлреЙрд░реНрдо рджреЗрдЦреЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдлреЙрд░реНрдо рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ :



рд╕рднреА рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рднрд░реЗрдВ рдФрд░ рд╕рдмрдорд┐рдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:



рдЕрдм, рдпрджрд┐ рдЖрдк рдПрдЯреНрд▓рд╛рд╕реНрд╕рд┐рдпрди-рдЬреАрд░рд╛.рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

2020-05-10 08:44:29,701+0300 http-nio-2990-exec-4 INFO admin 524x12509x1 15awhw2 0:0:0:0:0:0:0:1 /plugins/servlet/form [r.a.tutorial.servlet.FormServlet] Post Data: {"firstname":"Alexey","lastname":"Matveev","description":"No description","comments":"and no comments"}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рдмрдорд┐рдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ, рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕ рдлреЙрд░реНрдо рдХреЛ рд╕рд░реНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд▓реЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рд╕рд░реНрд╡рд▓реЗрдЯ рдиреЗ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд░реНрдЬ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
рдЕрдм рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрдмрд▓ рдореЗрдиреНрдпреВ рдЪреБрдиреЗрдВред рдЖрдк рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрдмрд▓ рдПрд▓рд┐рдореЗрдВрдЯ рджреЗрдЦреЗрдВрдЧреЗ :



рдпрд╣ рд╣рдорд╛рд░рд╛ рд╕рднреА рдкреНрд▓рдЧрдЗрди рд╣реИред рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрдВрджрд░


рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:



рдмреИрдХрдПрдВрдб рдореЗрдВ рдПрдЯрд▓рд╕рд┐рдпрди рдЬреАрд░рд╛ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рдПрдЯрд▓рд╕рд┐рдпрди рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдлреНрд░рдВрдЯ рдореЗрдВ рдпреВрдЖрдИ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
pom.xml pom рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдореЙрдбреНрдпреВрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:

    <modules>  
        <module>frontend</module>
        <module>backend</module>
    </modules>

рдЕрдм рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдлреЛрд▓реНрдбрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред

рдлрд╝реНрд░рдВрдЯ рдПрдВрдб


рдлреНрд░рдВрдЯрдПрдВрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрди рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ: рдореИрдВ



рдореБрдЦреНрдп рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ ред

package.json рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рд╣реИ NPM рдХрд┐ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ:

  • рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреИрдХреЗрдЬреЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред
  • рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгред

рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдПрдЯрд▓рд╛рд╕реНрдХрд┐рдЯ, рдмреИрдмреЗрд▓ рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

.babel.rc - рдмреИрдмрд▓ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ ред Babel рдХрд╛ рдЙрдкрдпреЛрдЧ ECMAScript 2015+ рдХреЛрдб рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдирд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЬреАрд░рд╛ рдкреНрд▓рдЧрдЗрди рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗред

webpack.config.js - webpack рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ ред рд╡реЗрдмрдкреИрдХ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрдВрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд░рд╛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдореЗрдиреВ рдЖрдЗрдЯрдо рдлреЙрд░реНрдо рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯреЗрдмрд▓ рд╣реИрдВред

рдпрд╣рд╛рдБ webpack.config.js рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

const WrmPlugin = require('atlassian-webresource-webpack-plugin');
var path = require('path');module.exports = {
    module: {
        rules: [
          {
            test: /\.(js|jsx)$/,
            exclude: /node_modules/,
            use: {
                loader: "babel-loader"
            }
          }
        ]
    },
    entry: {
            'form': './src/form.js',
            'dynamictable': './src/dynamictable.js'
    },

    plugins: [
        new WrmPlugin({
            pluginKey: 'ru.matveev.alexey.atlas.jira.jira-react-atlaskit',
            locationPrefix: 'frontend/',
            xmlDescriptors: path.resolve('../backend/src/main/resources', 'META-INF', 'plugin-descriptors', 'wr-defs.xml')
        }),
    ],
    output: {
        filename: 'bundled.[name].js',
        path: path.resolve("./dist")
    }
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо atlassian-webresource-webpack-plugin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЕрдкрдиреЗ рдЖрдк рдПрдХ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рдПрдЧреА:

plugins: [
        new WrmPlugin({
            pluginKey: 'ru.matveev.alexey.atlas.jira.jira-react-atlaskit',
            locationPrefix: 'frontend/',
            xmlDescriptors: path.resolve('../backend/src/main/resources', 'META-INF', 'plugin-descriptors', 'wr-defs.xml')
        }),
    ],

рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлреНрд░рдВрдЯрдПрдВрдб рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдмреИрдХ-рд╕реЗрдХ / рд╕рдВрд╕рд╛рдзрди / META-INF / рдкреНрд▓рдЧрдЗрди-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ wr-defs.xml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред

LocationPrefix рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ Jira рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╛рдЗрд▓реЗрдВ рдмреИрдХрдПрдВрдб / src / Resources / frontend рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреАред рд╣рдо рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рдмреИрдХрдПрдВрдб рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХреЛ wr-defs.xml <рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдХрд╛рд░ = "рдбрд╛рдЙрдирд▓реЛрдб" рдирд╛рдо = "bundled.dynamictable.js" рд╕реНрдерд╛рди = " рдлреНрд░рдВрдЯреЗрдВрдб / рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред bundled.dynamictable.js ┬╗ />ред

рдпрд╣рд╛рдБ wr-defs.xml рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЧрдИ рдереА:

<bundles>
  <web-resource key="entrypoint-form">
    <transformation extension="js">
      <transformer key="jsI18n"/>
    </transformation>
    <context>form</context>
    <dependency>com.atlassian.plugins.atlassian-plugins-webresource-plugin:context-path</dependency>
    <resource type="download" name="bundled.form.js" location="frontend/bundled.form.js"/>
  </web-resource>
  <web-resource key="entrypoint-dynamictable">
    <transformation extension="js">
      <transformer key="jsI18n"/>
    </transformation>
    <context>dynamictable</context>
    <dependency>com.atlassian.plugins.atlassian-plugins-webresource-plugin:context-path</dependency>
    <resource type="download" name="bundled.dynamictable.js" location="frontend/bundled.dynamictable.js"/>
  </web-resource>
  <web-resource key="assets-632cdd38-e80f-4a5a-ba4c-07ba7cb36e60">
    <transformation extension="js">
      <transformer key="jsI18n"/>
    </transformation>
    <transformation extension="soy">
      <transformer key="soyTransformer"/>
      <transformer key="jsI18n"/>
    </transformation>
    <transformation extension="less">
      <transformer key="lessTransformer"/>
    </transformation>
  </web-resource>
</bundles>

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЦрдВрдб рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡реЗрдмрдкреИрдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рдЬреАрд░рд╛ рдХреЛ рдмрддрд╛рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдмреИрдХрдПрдВрдб / src / рд╕рдВрд╕рд╛рдзрдиреЛрдВ / рдореЗрдЯрд╛-рдЗрди / рдкреНрд▓рдЧрдЗрди-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдмреИрдХрдПрдВрдб / pom.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП:

<plugin>
                <groupId>com.atlassian.maven.plugins</groupId>
                <artifactId>jira-maven-plugin</artifactId>
                <version>${amps.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <productVersion>${jira.version}</productVersion>
                    <productDataVersion>${jira.version}</productDataVersion>
                    <compressResources>false</compressResources>
                    <enableQuickReload>true</enableQuickReload>
                    <instructions>
                        <Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
                        <Export-Package></Export-Package>
                        <Import-Package>org.springframework.osgi.*;resolution:="optional", org.eclipse.gemini.blueprint.*;resolution:="optional", *</Import-Package>
                        <!-- Ensure plugin is spring powered -->
                        <Spring-Context>*</Spring-Context>
                        <Atlassian-Scan-Folders>META-INF/plugin-descriptors</Atlassian-Scan-Folders>
                    </instructions>
                </configuration>
            </plugin>

рд╣рдордиреЗ <Atlassian-Scan-Folders> META-INF / plugin-descriptionptors </ Atlassian-Scan-Folders> рдЬреЛрдбрд╝рд╛ рд╣реИред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреАрд░рд╛ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдореЗрдЯрд╛-рдЗрди / рдкреНрд▓рдЧрдЗрди-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реЗрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╣рдордиреЗ рдЕрдкрдиреА JavaScript рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд┐рдирд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <compressResource> false </ compressResources> рдХреЛ рднреА рдЬреЛрдбрд╝рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЦрдирди рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред
рд╣рдордиреЗ webpack.config.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рджреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рд╣реИрдВ:

 entry: {
            'form': './src/form.js',
            'dynamictable': './src/dynamictable.js'
    },

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗрдмрдкреИрдХ ./src/form.js рдФрд░ ./src/dynamictable.js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдЧрд╛ рдФрд░ рджреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИред рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдлреНрд░рдВрдЯрдПрдВрдб / рдбрд┐рд╕реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдВрдЧреАред

./src/form.js рдФрд░ ./src/dynamictable.js рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд▓рд┐рдпрд╛ред

рдпрд╣рд╛рдБ form.js рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

import Form from "./js/components/Form";

рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдХреНрд╖рд╛ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддреА рд╣реИ ред/js/compords/Form.js

рдпрд╣рд╛рдБ ./js/compenders/Form.js рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

import React, { Component } from 'react';
import ReactDOM from "react-dom";
import Button from '@atlaskit/button';
import TextArea from '@atlaskit/textarea';
import TextField from '@atlaskit/textfield';
import axios from 'axios';

import Form, { Field, FormFooter } from '@atlaskit/form';

export default class MyForm extends Component {
  render() {
  return (
  <div
    style={{
      display: 'flex',
      width: '400px',
      margin: '0 auto',
      flexDirection: 'column',
    }}
  >
    <Form onSubmit={data => axios.post(document.getElementById("contextPath").value + "/plugins/servlet/form", data)}>
      {({ formProps }) => (
        <form {...formProps} name="text-fields">
          <Field name="firstname" defaultValue="" label="First name" isRequired>
            {({ fieldProps }) => <TextField {...fieldProps} />}
          </Field>

          <Field name="lastname" defaultValue="" label="Last name" isRequired>
            {({ fieldProps: { isRequired, isDisabled, ...others } }) => (
              <TextField
                disabled={isDisabled}
                required={isRequired}
                {...others}
              />
            )}
          </Field>
          <Field
            name="description"
            defaultValue=""
            label="Description"
          >
            {({ fieldProps }) => <TextArea {...fieldProps} />}
          </Field>

          <Field
            name="comments"
            defaultValue=""
            label="Additional comments"
          >
            {({ fieldProps }) => <TextArea {...fieldProps} />}
          </Field>
          <FormFooter>
            <Button type="submit" appearance="primary">
              Submit
            </Button>
          </FormFooter>
        </form>
      )}
    </Form>
  </div>
);
}
}
window.addEventListener('load', function() {
    const wrapper = document.getElementById("container");
    wrapper ? ReactDOM.render(<MyForm />, wrapper) : false;
});</code></pre>
<!-- /wp:code -->       :<!-- wp:code -->
<pre class="wp-block-code"><code>window.addEventListener('load', function() {
    const wrapper = document.getElementById("container");
    wrapper ? ReactDOM.render(<MyForm />, wrapper) : false;
});

рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдбрд┐рд╡ рдХрдВрдЯреЗрдирд░ рдореЗрдВ MyForm рдШрдЯрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВред рдпрд╣ рдХрдВрдЯреЗрдирд░ рд╕реЛрдпрд╛ рдЬреАрд░рд╛ рдкреНрд▓рдЧрдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВ:

onSubmit={data => axios.post(document.getElementById("contextPath").value + "/plugins/servlet/form", data)}

document.getElementById ("referencePath")ред рдорд╛рди id рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬреАрд░рд╛ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рд╕реЛрдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рди рдЙрд╕ рд╕рд░реНрд╡рд▓реЗрдЯ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдореЗрдиреВ рдЖрдЗрдЯрдо рдмрд╛рдзреНрдп рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрджрд░реНрднрдкрд╛рда рдореЗрдВ рдореВрд▓реНрдп / рдЬреАрд░рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрдм рд╕реЗ рдПрдЯрд▓рд╕рд┐рдпрди рдПрд╕рдбреАрдХреЗ рд╕реЗ рдЬреАрд░рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрджрд░реНрдн рдкрде рд╕реЗрдЯ рд╣реИред

рдФрд░ рдпрд╣ рд╕рдм рджреГрд╢реНрдпрдкрдЯрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдлреНрд░рдВрдЯреЗрдВрдб рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдмреИрдХрдПрдВрдб / src / рд╕рдВрд╕рд╛рдзрдиреЛрдВ / рдореЗрдЯрд╛-рдЗрди / рдкреНрд▓рдЧрдЗрди-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡реЗрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдлреНрд░рдВрдЯреЗрдВрдб / рдбрд┐рд╕реНрдЯ рдФрд░ xml рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВред

рдЕрдм рдЪрд▓реЛ рдмреИрдХрдПрдВрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдмреИрдХрдПрдВрдб


рдореИрдВрдиреЗ рдЗрди рдкреНрд▓рдЧ рдЗрди рдХреЛ рдмреИрдХрдПрдВрдб / pom.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛:

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0.0</version>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>write-project-properties</goal>
                        </goals>
                        <configuration>
                            <outputFile>${project.build.outputDirectory}/maven.properties</outputFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>copy frontend files to resources</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>src/main/resources/frontend</outputDirectory>
                            <overwrite>true</overwrite>
                            <resources>
                                <resource>
                                    <directory>../frontend/dist</directory>
                                    <includes>
                                        <include>*.*</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

properties-maven-plugin рдПрдХ maven.properties рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА Maven рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рд╕реЗ рд╡реЗрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП atlassian.plugin.key рдкреНрд░реЙрдкрд░реНрдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВред

maven-resource-plugin, рдлреНрд░рдВрдЯрдПрдВрдб / рдбрд┐рд╕реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмреИрдХрдПрдВрдб / рд░рд┐рд╕реЛрд░реНрд╕ / рдлреНрд░рдВрдЯреЗрдВрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рдореИрдВрдиреЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рдмрдирд╛рдП рдФрд░ рдЗрди рдореЗрдиреВ рдЖрдЗрдЯрдо рд╕реЗ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ред

рдпрд╣рд╛рдБ рдПрдЯрд▓рд╕рд┐рдпрди- plugin.xml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:

<servlet name="Form Servlet" i18n-name-key="form-servlet.name" key="form-servlet" class="react.atlaskit.tutorial.servlet.FormServlet"> 
    <description key="form-servlet.description">The Form Servlet Plugin</description>  
    <url-pattern>/form</url-pattern>
  </servlet>  
  <servlet name="Dynamic Table Servlet" i18n-name-key="dynamic-table-servlet.name" key="dynamic-table-servlet" class="react.atlaskit.tutorial.servlet.DynamicTableServlet"> 
    <description key="dynamic-table-servlet.description">The Dynamic Table Servlet Plugin</description>  
    <url-pattern>/dynamictable</url-pattern>
  </servlet>
  <web-section name="React Plugin" i18n-name-key="react.name" key="react" location="admin_plugins_menu" weight="1000">
    <description key="react.description">React Plugin</description>
    <label key="react.label"/>
  </web-section>
  <web-item name="from web item" i18n-name-key="form.name" key="form" section="admin_plugins_menu/react" weight="1000">
    <description key="form.description">Form</description>
    <label key="form.label"/>
    <link linkId="configuration-link">/plugins/servlet/form</link>
  </web-item>
  <web-item name="dynamic table web item" i18n-name-key="dynamictable.name" key="dynamictable" section="admin_plugins_menu/react" weight="1000">
    <description key="dynamictable.description">Dynamic Table</description>
    <label key="dynamictable.label"/>
    <link linkId="configuration-link">/plugins/servlet/dynamictable</link>
  </web-item>

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЗрдиреВ рдФрд░ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рд╣реИрдВ рдЬреЛ рдЗрди рдореЗрдиреВ рдЖрдЗрдЯрдореЛрдВ рд╕реЗ рдмреБрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдм рдЖрдЗрдпреЗ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рдкрд░ рдирдЬрд╝рд░

рдбрд╛рд▓рддреЗ рд╣реИрдВ: FormServlet.java:

public class FormServlet extends HttpServlet{
    private static final Logger log = LoggerFactory.getLogger(FormServlet.class);
    private final ResourceService resourceService;
    private final SoyTemplateRenderer soyTemplateRenderer;

    public FormServlet(@ComponentImport  SoyTemplateRenderer soyTemplateRenderer, ResourceService resourceService) {
        this.resourceService = resourceService;
        this.soyTemplateRenderer = soyTemplateRenderer;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        String pluginKey = this.resourceService.getProperty("atlassian.plugin.key");
        Map<String, Object> map = new HashMap<>();
        map.put("contextPath", req.getContextPath());

        String html = soyTemplateRenderer.render(pluginKey + ":jira-react-atlaskit-resources", "servlet.ui.form", map);

        resp.setContentType("text/html");
        resp.getWriter().write(html);
        resp.getWriter().close();    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = req.getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);
        } catch (Exception e) { /*report an error*/ }
        log.info(String.format("Post Data: %s", jb.toString()));

        String pluginKey = this.resourceService.getProperty("atlassian.plugin.key");
        Map<String, Object> map = new HashMap<>();
        map.put("contextPath", req.getContextPath());

        String html = soyTemplateRenderer.render(pluginKey + ":jira-react-atlaskit-resources", "servlet.ui.form", map);

        resp.setContentType("text/html");
        resp.getWriter().write(html);
        resp.getWriter().close();
    }}

рдореИрдВ рджреЛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд░рд┐рд╕реЛрд░реНрд╕ рд╕рд░реНрд╡рд┐рд╕ рдФрд░ рд╕реЛрдпрд╛рдЯреЗрдкреНрд▓реЗрдиреНрдбрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реВрдВред рд░рд┐рд╕реЛрд░реНрд╕ рд╕рд░реНрд╡рд┐рд╕ - рдПрдХ рд╕реЗрдо рдЬреЛ maven.properties рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЧреБрдг рдкрдврд╝рддрд╛ рд╣реИред рд╕реЛрдпрд╛рдЯреЗрдореНрдкреНрд▓реЗрдВрдбрд░рд░ - рдЬреАрд░рд╛ рдмреАрди рдЬрд┐рд╕реЗ рд╕реЛрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
DoGet рдкрджреНрдзрддрд┐ рдореЗрдВ, рдореБрдЭреЗ atlassian.plugin.key рд╕рдВрдкрддреНрддрд┐ рдФрд░ рд╕рдВрджрд░реНрдн рдкрде рдХрд╛ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИред рддрдм рдореИрдВ рд╕рдВрджрд░реНрдн рдкрде рдХреЛ рд╕реЛрдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реЛрдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ servlet.ui.form рдирд╛рдо рд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реВрдВред

рдпрд╣рд╛рдБ рд╕реЛрдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рджреА рдЧрдИ рд╣реИ:

{namespace servlet.ui}
/**
 * This template is needed to draw the form page.
 */
{template .form}
    {@param contextPath: string}
    {webResourceManager_requireResourcesForContext('form')}
    <html>
    <head>
        <meta charset="utf-8"/>
        <meta name="decorator" content="atl.admin">
        <meta name="admin.active.section" content="admin_plugins_menu/react">
        <title>Form Page</title>
    </head>
    <body>
    <div class="field-group hidden">
        <input class="text" type="text" id="contextPath" name="contextPath" value="{$contextPath}">
    </div>
    <div id="maincontainer">
        <div id="container">
        </div>
    </div>
    </body>
    </html>
{/template}
/**
 * This template is needed to draw the dynamic table page.
 */
{template .dynamictable}
    {webResourceManager_requireResourcesForContext('dynamictable')}
    <html>
    <head>
        <meta charset="utf-8"/>
        <meta name="decorator" content="atl.admin">
        <meta name="admin.active.section" content="admin_plugins_menu/react">
        <title>Dynamic Table Page</title>
    </head>
    <body>
    <div id="maincontainer">
        <div id="container">
        </div>
    </div>
    </body>
    </html>
{/template}

рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдореИрдВ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рд╡реЗрдм рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдХрдВрдЯреЗрдирд░ рдбрд┐рд╡ рдмрдирд╛рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдПрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ рд╕реЛрд╢рд▓ рдлрд╛рдЗрд▓ рдХреЛ atlassian-plugin.xml рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛:

<web-resource key="jira-react-atlaskit-resources" name="jira-react-atlaskit Web Resources"> 
    ...
    <resource type="soy" name="soyui" location="/templates/servlets.soy"/>
    ...
    <context>jira-react-atlaskit</context> 
  </web-resource> 

рдЖрдкрдХреЛ рдПрдЯрд▓рд╕рд┐рдпрди рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

All Articles