@@ -4,87 +4,151 @@ const END_TIME = 24;
44const START_TIME = 8 ;
55const initialArea = { x : 0 , y : 0 , w : 0 , h : 0 } ;
66
7- export const generateSelectedArea = (
8- hasNotStartMove : boolean ,
9- currentClientY : number ,
10- startClientY : number ,
11- timetableArea : { x : number ; y : number ; w : number ; h : number } ,
12- startClientX : number ,
13- currentClientX : number
14- ) => {
7+ type ClientX = {
8+ startClientX : number ;
9+ currentClientX : number ;
10+ } ;
11+
12+ type ClientY = {
13+ startClientY : number ;
14+ currentClientY : number ;
15+ } ;
16+
17+ type Client = ClientX & ClientY ;
18+
19+ type Area = {
20+ x : number ;
21+ y : number ;
22+ w : number ;
23+ h : number ;
24+ } ;
25+
26+ type LimitClient = {
27+ minClientX : number ;
28+ maxClientX : number ;
29+ } ;
30+
31+ type GenerateSelectedAreaConfig = {
32+ hasNotStartMove : boolean ;
33+ client : Client ;
34+ timetableArea : Area ;
35+ limitClient : LimitClient ;
36+ } ;
37+ type GenerateSelectedArea = ( config : GenerateSelectedAreaConfig ) => Area ;
38+
39+ export const generateSelectedArea : GenerateSelectedArea = ( {
40+ hasNotStartMove,
41+ client,
42+ timetableArea,
43+ limitClient,
44+ } ) => {
45+ const { startClientX, startClientY, currentClientX, currentClientY } = client ;
46+ const clientX = { startClientX, currentClientX } ;
47+ const clientY = { startClientY, currentClientY } ;
48+
1549 if ( hasNotStartMove ) {
1650 return initialArea ;
1751 }
1852
19- if ( currentClientY <= startClientY && currentClientY !== 0 ) {
20- return generateSelectedAreaWhenUserMoveUp (
21- timetableArea ,
22- startClientX ,
23- currentClientY ,
24- startClientY ,
25- currentClientX
53+ const { x, w } = getXAndWidthOfSelectedArea ( {
54+ clientX,
55+ timetableWidth : timetableArea . w ,
56+ limitClient,
57+ } ) ;
58+ const { y, h } = getYAndHeightOfSelectedArea ( timetableArea , clientY ) ;
59+ return {
60+ x,
61+ y,
62+ w,
63+ h,
64+ } ;
65+ } ;
66+
67+ const getXAndWidthOfSelectedArea = ( {
68+ clientX,
69+ timetableWidth,
70+ limitClient,
71+ } : {
72+ clientX : ClientX ;
73+ timetableWidth : number ;
74+ limitClient : LimitClient ;
75+ } ) => {
76+ const { startClientX, currentClientX } = clientX ;
77+ const { minClientX, maxClientX } = limitClient ;
78+
79+ if ( currentClientX === 0 ) {
80+ const selectedAreaX = getSelectedAreaX ( timetableWidth , startClientX ) ;
81+ const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
82+ return {
83+ x : selectedAreaX ,
84+ w : timetableEachColumnArea ,
85+ } ;
86+ }
87+
88+ if ( currentClientX >= startClientX ) {
89+ const selectedAreaX = getSelectedAreaX ( timetableWidth , startClientX ) ;
90+ const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
91+ const columnCount = getColumnCount (
92+ Math . min ( currentClientX , maxClientX ) ,
93+ selectedAreaX ,
94+ timetableEachColumnArea
95+ ) ;
96+ const selectedAreaWidth = getSelectedAreaWidth (
97+ columnCount ,
98+ timetableEachColumnArea ,
99+ 1
26100 ) ;
101+ return {
102+ x : selectedAreaX ,
103+ w : selectedAreaWidth ,
104+ } ;
27105 }
28106
29- return generateSelectedAreaWhenUserMoveDown (
30- timetableArea ,
31- startClientY ,
32- currentClientY ,
33- startClientX ,
34- currentClientX
107+ const selectedAreaX = Math . max (
108+ getSelectedAreaX ( timetableWidth , currentClientX ) ,
109+ minClientX
35110 ) ;
36- } ;
37-
38- const generateSelectedAreaWhenUserMoveUp = (
39- timetableArea : { x : number ; y : number ; w : number ; h : number } ,
40- startClientX : number ,
41- currentClientY : number ,
42- startClientY : number ,
43- currentClientX : number
44- ) => {
45- const selectedAreaY =
46- currentClientY >= timetableArea . y ? currentClientY : timetableArea . y ;
47- const selectedAreaHeight = startClientY - selectedAreaY ;
48- const { selectedAreaX, selectedAreaWidth } = getSelectedAreaWidthAndX ( {
111+ const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
112+ const columnCount = getColumnCount (
49113 startClientX ,
50- currentClientX,
51- timetableWidth : timetableArea . w ,
52- } ) ;
53-
114+ selectedAreaX ,
115+ timetableEachColumnArea
116+ ) ;
117+ const selectedAreaWidth = getSelectedAreaWidth (
118+ columnCount ,
119+ timetableEachColumnArea ,
120+ 1
121+ ) ;
54122 return {
55123 x : selectedAreaX ,
56- y : selectedAreaY ,
57124 w : selectedAreaWidth ,
58- h : selectedAreaHeight ,
59125 } ;
60126} ;
61127
62- const generateSelectedAreaWhenUserMoveDown = (
63- timetableArea : { x : number ; y : number ; w : number ; h : number } ,
64- startClientY : number ,
65- currentClientY : number ,
66- startClientX : number ,
67- currentClientX : number
68- ) => {
128+ const getYAndHeightOfSelectedArea = ( timetableArea : Area , clientY : ClientY ) => {
129+ const { startClientY, currentClientY } = clientY ;
130+
131+ if ( currentClientY <= startClientY && currentClientY !== 0 ) {
132+ const selectedAreaY =
133+ currentClientY >= timetableArea . y ? currentClientY : timetableArea . y ;
134+ const selectedAreaHeight = startClientY - selectedAreaY ;
135+ return {
136+ y : selectedAreaY ,
137+ h : selectedAreaHeight ,
138+ } ;
139+ }
140+
69141 const minHeight =
70142 ( timetableArea . h - ( END_TIME - START_TIME - 1 ) ) /
71143 ( END_TIME - START_TIME ) /
72144 3 ;
73-
74145 const selectedAreaY = startClientY ;
75146 const selectedAreaHeight =
76147 currentClientY >= timetableArea . y + timetableArea . h
77148 ? timetableArea . y + timetableArea . h - selectedAreaY
78149 : currentClientY - startClientY ;
79- const { selectedAreaX, selectedAreaWidth } = getSelectedAreaWidthAndX ( {
80- startClientX,
81- currentClientX,
82- timetableWidth : timetableArea . w ,
83- } ) ;
84150 return {
85- x : selectedAreaX ,
86151 y : selectedAreaY ,
87- w : selectedAreaWidth ,
88152 h : Math . max ( selectedAreaHeight , minHeight ) ,
89153 } ;
90154} ;
@@ -124,58 +188,3 @@ const getSelectedAreaWidth = (
124188) => {
125189 return columnCount * columnWidth + ( columnCount - 1 ) * gapSize ;
126190} ;
127-
128- const getSelectedAreaWidthAndX = ( {
129- startClientX,
130- currentClientX,
131- timetableWidth,
132- } : {
133- startClientX : number ;
134- currentClientX : number ;
135- timetableWidth : number ;
136- } ) => {
137- if ( currentClientX === 0 ) {
138- const selectedAreaX = getSelectedAreaX ( timetableWidth , startClientX ) ;
139- const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
140- return {
141- selectedAreaX,
142- selectedAreaWidth : timetableEachColumnArea ,
143- } ;
144- }
145- if ( currentClientX >= startClientX ) {
146- const selectedAreaX = getSelectedAreaX ( timetableWidth , startClientX ) ;
147- const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
148- const columnCount = getColumnCount (
149- currentClientX ,
150- selectedAreaX ,
151- timetableEachColumnArea
152- ) ;
153- const selectedAreaWidth = getSelectedAreaWidth (
154- columnCount ,
155- timetableEachColumnArea ,
156- 1
157- ) ;
158-
159- return {
160- selectedAreaX,
161- selectedAreaWidth,
162- } ;
163- }
164-
165- const selectedAreaX = getSelectedAreaX ( timetableWidth , currentClientX ) ;
166- const timetableEachColumnArea = getTimetableColumnAreaWidth ( timetableWidth ) ;
167- const columnCount = getColumnCount (
168- startClientX ,
169- selectedAreaX ,
170- timetableEachColumnArea
171- ) ;
172- const selectedAreaWidth = getSelectedAreaWidth (
173- columnCount ,
174- timetableEachColumnArea ,
175- 1
176- ) ;
177- return {
178- selectedAreaX,
179- selectedAreaWidth,
180- } ;
181- } ;
0 commit comments