рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдЯрд▓рд╕рд┐рдпрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛редрдкрд░рд┐рдЪрдп
рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдФрд░ рдбрд╛рдЯрд╛ рд╕реЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП 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>
<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) { }
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>
рдЖрдкрдХреЛ рдПрдЯрд▓рд╕рд┐рдпрди рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдФрд░ рдПрдЯрд▓рд╕реНрдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред