рдирдорд╕реНрддреЗ,
рдореЗрд░рд╛ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХрд┐рд╕реА рддрд░рд╣ рдореЙрдирд┐рдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рддреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдФрд░ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдЙрд╕ рдХреЗ рдЙрдардиреЗ рдкрд░ рднреА рд╡рд╣ рдордБрдбрд░рд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рджреЗ рд░рд╣рд╛ рд╣реИ:
рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рд╡рд╣ рдЗрд╕реЗ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдПрдХ рдмрд╛рд░ рджреЗрдЦрддрд╛ рд╣реИред
рдореИрдВ рдорд╛рдЙрд╕ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдЧрдП рдЯрдЪ рдмреИрдХрдПрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕рд╛рде рд╣реА рдХреБрдЫ рдЯреНрд╡реАрдХреНрд╕ рдХреЗ рд╕рд╛рдеред
рддреЛ рдЬреЗрдПрд╕ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдВрдЪ рдХреА рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЙрд▓рдмреИрдХ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА рдЬрдм рдбреНрд░реЙрдк рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рддрдм рдореЙрдирд┐рдЯрд░ / рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреА рдереАред
рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИ - рдореЗрд░реА рд╕реНрдерд┐рддрд┐ рдРрд╕реА рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдбреНрд░реЙрдк рдЯрд╛рд░рдЧреЗрдЯ рдФрд░ рдбреНрд░реИрдЧ рд╕реЛрд░реНрд╕ рджреЛрдиреЛрдВ рд╣реИред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмрд╛рд░ рдЦреАрдВрдЪ рдХрд░ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рддреАрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдШрдЯрдХ рдкрд░ рдХрдИ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ?
рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкрд╛рдпрд╛ред
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдбреНрд░рд╛рдкрдЯрд╛рд░реНрдЧ рдкрд░ рдЧрд┐рд░рд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рдХреА рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдбреНрд░реЙрдкрдЯрд╛рд░реНрдЧреЗрдЯ рдХреЛ рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдлрдВрдХреНрд╢рдирд▓рд┐рдЯреА рдХрд╛ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣рд┐рд╕реНрд╕рд╛ (рдпрд╣ рдЖрдЗрдЯрдореНрд╕ рдХреЗ рд▓рд┐рдП 'рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдШрдЯрдХ рд╣реИ) рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рд╕реНрд░реЛрдд рдХреА рд╕реВрдЪреА рдореЗрдВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдереА, рдЬреЛ рд╕рд┐рд░реНрдл рд░рдЦреЗ рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рд╕реЗ рдмрджрд▓рдХрд░ рд╡рд╛рдкрд╕ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рд╕реВрдЪреАред
рдЕрдм, рдпрд╣ рдЕрдкрд╡рд╛рдж рдХреЗрд╡рд▓ рддрдм рд╣реБрдЖ рдЬрдм рдореИрдВ рд╕рднреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдЗрдЯрдо рд░рдЦреВрдВрдЧрд╛ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ (рдирд╣реАрдВ рдЬрдм рд╕реВрдЪреА рдкреВрд░реА рдирд╣реАрдВ рдереА рдФрд░ рдореИрдВ рдПрдХ рдХреЛ рд╣рдЯрд╛ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛)ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢реВрдиреНрдп рдмрдЪреНрдЪреЗ рдХрднреА рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрднрд╡рддрдГ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рдерд╛)ред рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдкрд░ рдбреНрд░реИрдЧрд╕реЛрд░реНрд╕ рд╕реВрдЪреА рд╕реЗ рдЖрдЗрдЯрдо рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдЙрдирдХреА рд╢реИрд▓реА рдХреЛ display: none
рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдореИрдВ @PendragonDevelopment рдХреЗ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реА рд╕реВрдЪреА рдПрдХ рдЖрдЗрдЯрдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рджреВрд╕рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдХрднреА рднреА рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рднреА рд╣реИ
рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ
рдореБрдЭреЗ рдпрд╣рд╛рдБ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред
рдбреЗрдореЛ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЦрджрд╛рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЬрдм рдореИрдВ рдШрдЯрдХреЛрдВ рдХреЛ рд▓реВрдк рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдХреБрдВрдЬреА рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рджреЛрдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░реЗ рдХреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдбреЗрдореЛ рдореЗрдВ рд╡реЗ рдХреЗрд╡рд▓ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЙрд░реНрдЯреЗрдмрд▓ / рд╕рд┐рдВрдкрд▓ / рдХрдВрдЯреЗрдирд░.рдЬреЗрдПрд╕ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдВрдЬреА рддрдп рд╣реЛрддреА рд╣реИред
рдпрд╣ рдХрд┐рдпрд╛ рдФрд░ рдХрд╛рдо рдХрд┐рдпрд╛!
рдХреБрдВрдЬреА рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╕рд░рдгреА рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рдж рдШрдЯрдХ рдХрд╛ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ
рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд╛рдпрдирд╛рдорд┐рдХ рдШрдЯрдХ рд╣реИ рдФрд░ рдбреАрдПрдирдбреА рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд╢рд╛рдпрдж Date.now()
рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред
{this.state.rows.map(function(row, key) {
return (<RowComponent key={row.id} index={key} id={row.id} moveRow={that.moveRow} />);
})}
row.id рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ
рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди node-uuid's v4
рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреБрдВрдЬреА рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реЗ model.id рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рддрдп рдХрд┐рдпрд╛ред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЕрдм рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВред
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреБрдВрдЬреА рдиреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рдХреАред
рдпрд╣ рдореЗрд░рд╛ рдХреЛрдб рдерд╛
<ContentPatch>
{tasks.loading
? <div>...loading </div>
: this.state.containers.map((item, i) => {
return (
<TaskStage
key={item.id}
item={item}
tasklist={tasks.tasks}
onDropped={this.handleDropped}
onBeginningDrag={this.onBeginningDrag}
/>
);
})}
</ContentPatch>
рд╣рд░ рдЧрд┐рд░рд╛рдИ рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдореИрдкрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред
рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рджреА
...
{tasks.loading && tasks.tasks.length===0
? <div>...loading </div>
...
рдФрд░ рдпрд╣ рд╣рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдмрдврд╝рддреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реИред
рдореИрдВ рдЙрд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЗрдХрд░ рдЖрдпрд╛ рдерд╛ред
рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдерд╛:
DragSource
рдФрд░ DragTarget
рдШрдЯрдХendDrag
( DragSource
рдкрджреНрдзрддрд┐) рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж drop
( DropTarget
рдкрджреНрдзрддрд┐) рд╣реЛ рдЬрд╛рддреА рд╣реИред рдореИрдВ drop
рднреАрддрд░ рдорд╛рд░реНрдЧ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдореЙрдирд┐рдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рдерд╛ред
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП endDrag
рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рддрд░реНрдХ рджрд┐рдпрд╛ред рдпрджрд┐ monitor.didDrop()
рд╕рд╛рде рдбреНрд░реЙрдк рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЬрд╛рдБрдЪ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рдерд╛ред
рдореЗрд░рд╛ рдпрд╣ рдореБрджреНрджрд╛ рд╣реИ, рднреАред рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдбреНрд░реЙрдк рдЯрд╛рд░рдЧреЗрдЯ рдФрд░ рдбреНрд░реИрдЧ рд╕реЛрд░реНрд╕ рджреЛрдиреЛрдВ рд╣реИред рдореИрдВрдиреЗ рдПрдВрдбрдбреНрд░реИрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдкреИрдЪ рдмреИрдХреЗрдВрдб (https://gist.github.com/nickpresta/eb5cce69d650db4c2795) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдореЗрд░рд╛ рдШрдЯрдХ:
@DropTarget<HeadColOwnProps>(TaskDndTypes.headCol, headColTargetSpec, headColTargetCollector)
@DragSource<HeadColOwnProps>(TaskDndTypes.headCol, headColSourceSpec, headColSourceCollector)
class HeadColComponent extends React.Component<any, void> {
render() {
const props = this.props;
return this.props.dndConnectDropTarget(
this.props.dndConnectDragPreview(
<div>
<div className={block('panels-task__drag')({start: props.dndIsDragging})}>
<SortingIcon
label={props.label}
arrowIsVisible={props.sortingIsPossible}
direction={props.sortingDirection}
clickHandler={props.sortingHandler}
/>
{this.props.dndConnectDragSource(
<span className="panels-task__drag-control">
<SVGIcon width={10} height={10} url={'#icon-drag-and-drop-cell'} />
</span>
)}
</div>
</div>
)
);
}
}
рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
const renderHeadCellId = (): JSX.Element => {
return (
<TaskCellHead key="key-head-col-id" modifications={{ number: true }}>
<HeadColComponent
label="#"
key="key-dnd-head-col-id"
taskColType={TaskCols.id}
sortingIsPossible={false}
taskColsOrder={taskStore.orderCols}
updateDragProcess={(dp: TaskColDragProcess | null) => taskStore.updateDragProcess(dp)}
updateOrderCols={(order: TaskCols[]) => taskStore.updateOrderCols(order)}
dragProcess={taskStore.dragProcess}
/>
</TaskCellHead>
);
};
рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕:
const headColSourceSpec: DragSourceSpec<HeadColOwnProps> = {
beginDrag(props: HeadColOwnProps): DraggedItem {
return { sourceColType: props.taskColType };
},
canDrag(props: HeadColOwnProps): boolean {
return props.taskColsOrder.length > 1;
},
endDrag(props: HeadColOwnProps, monitor: DragSourceMonitor): void {
console.debug('endDrag');
if (!monitor.didDrop()) {
return;
}
console.debug('endDrag finish');
props.updateOrderCols((monitor.getDropResult() as DroppedResult).newOrderCols);
}
};
const headColTargetSpec: DropTargetSpec<HeadColOwnProps> = {
drop(props: HeadColOwnProps, monitor: DropTargetMonitor): DroppedResult {
console.debug('drop');
return {
newOrderCols: getNewOrder((monitor.getItem() as DraggedItem).sourceColType, props.taskColsOrder, props.dragProcess)
};
},
hover(props: HeadColOwnProps, monitor: DropTargetMonitor, component: HeadColComponent): Object | void {
if (!monitor.canDrop()) {
return;
}
// ...
props.updateDragProcess(currentDragProcess);
},
canDrop(props: HeadColOwnProps, monitor: DropTargetMonitor): boolean {
return props.taskColType !== (monitor.getItem() as DraggedItem).sourceColType;
}
};
const headColSourceCollector = (connect: DragSourceConnector, monitor: DragSourceMonitor) => ({
dndConnectDragSource: connect.dragSource(),
dndConnectDragPreview: connect.dragPreview(),
dndIsDragging: monitor.isDragging()
});
const headColTargetCollector = (connect: DropTargetConnector, monitor: DropTargetMonitor) => {
return {
dndConnectDropTarget: connect.dropTarget(),
dndIsOverCurrent: monitor.isOver({ shallow: true })
};
};
рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд╛рдж endDrag
рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди drop
рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
endDrag(props: HeadColOwnProps, monitor: DragSourceMonitor): void {
console.debug('endDrag');
if (!monitor.didDrop()) {
return;
}
console.debug('endDrag finish');
props.updateOrderCols((monitor.getDropResult() as DroppedResult).newOrderCols);
}
рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ? рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рдореИрдВрдиреЗ рдЯрдЪ рдмреИрдХрдПрдВрдб (https://github.com/yahoo/react-dnd-touch-backs) рд╕реЗ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдмреИрдХрдПрдВрдб рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЗрд╕рд╕реЗ рдореЗрд░рд╛ рдХрд╛рдо рдмрдирддрд╛ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рд┐рд░реНрдл рдбреНрд░реЙрдкрдмреИрдХ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓ рд░рд╣реА рдереАред рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдпрд╣ рд╕рднреА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛рдпрд╛, рджреВрд░ рд╣реЛрдиреЗ рдкрд░ рддреНрд░реБрдЯрд┐ред
Im рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-dnd-touch-backend рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ html5 рдЪрд▓рд╛рдКрдБрдЧрд╛ред рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдкрд░ рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬреЛ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВред
рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред рдореИрдВ рд╣рд░ рд░реЗрдВрдбрд░ рдкрд░ рдбреНрд░реИрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдШрдЯрдХреЛрдВ рдкрд░ рдПрдХ рдПрдЪрдУрд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рдерд╛ рддрд╛рдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереЗ рдЬреЛ рдЙрд▓рдЭрди рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреИрдВрдбред
@ рдард╛рдХреБрдирд┐рди рдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ (рдПрдХ рдЕрдиреНрдп рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореБрдЭреЗ рдХреЗрд╡рд▓ рдпрд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА)ред
рдЬрдм рд╕реЗ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╣реИ рдореИрдВрдиреЗ рд╕рднреА DnD рдХреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЬрдм рднреА рдореИрдВ рдШрд╕реАрдЯрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рддрдм рднреА рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИред рдЕрдм рдЬрдм рдореИрдВрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдПрдХ рдПрдХрд▓ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рджрд┐рдпрд╛, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреВрдВред рдЬрдм рдореИрдВ рдХрд░реВрдВрдЧрд╛ рддрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред (рдореИрдВ рдорд╛рдЙрд╕ рд╕реЗрдЯрд┐рдВрдЧ btw рдореЗрдВ TouchBackend рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ)
рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдШрд╕реАрдЯрддреЗ рд╕рдордп рдХреБрдЫ рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ - рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдЕрдкреНрд░рд╛рдкреНрдп рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рд╣реИ?
рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдШрд╕реАрдЯрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдЦрд╛рди рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИред
рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рдпрд╣ рдерд╛ рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рдЧрд┐рд░рд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдПрдВрдбрдЧреНрд░реИрдЧ (рдкреНрд░реЙрдкрд░, рдореЙрдирд┐рдЯрд░, рдХрдВрдкреЛрдиреЗрдВрдЯ) рдореЗрдВ рдШрдЯрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдерд╛ред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрд░реА рдореВрд▓ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг "рдбреНрд░реЙрдк рдХреЗ рдмрд╛рдж рдХреЙрд▓ рд╣реЙрд╡рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛" рд╕рдВрджреЗрд╢ рдХреЗ рдХрдВрд╕реЛрд▓ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдПред
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ: https://github.com/react-dnd/react-dnd/issues/431#issuecomment -317219509
рдЬрдм рдореИрдВ рдкрд╣рд▓реЗ рдЕрдиреНрдп рдЕрдирдЪреЗрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛, рддреЛ рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рд╛ред рдХреЛрдИ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рддрдм рд╣реБрдЖ рдЬрдм рдПрдВрдбрдбреНрд░реИрдЧ рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ / рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рддреЛ рдЖрдзрд╛рд░рднреВрдд рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рддреНрд░реБрдЯрд┐ dnd рдЕрдЯрдХ рдЧрдИред рдПрдВрдбрдбреНрд░реИрдЧ рдмреНрд▓реЙрдХ рдореЗрдВ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди / рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
endDrag: (props, monitor) => {
try {
handleEndDrag();
} catch(errror) { console.error(error)}
}
рдСрдирдбреНрд░реЙрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдбрд┐рдмрдЧрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рднреА рдореЗрд░реЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕реНрд░реЛрдд рдерд╛ред рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╣рд╛рд░реНрдб рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдбреАрдмрдЧрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ?
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╣рд┐рдд рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдереАред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИ - рдореЗрд░реА рд╕реНрдерд┐рддрд┐ рдРрд╕реА рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдбреНрд░реЙрдк рдЯрд╛рд░рдЧреЗрдЯ рдФрд░ рдбреНрд░реИрдЧ рд╕реЛрд░реНрд╕ рджреЛрдиреЛрдВ рд╣реИред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмрд╛рд░ рдЦреАрдВрдЪ рдХрд░ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рддреАрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдШрдЯрдХ рдкрд░ рдХрдИ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ?