@@ -82,23 +82,31 @@ class AvailabilityPage extends Component {
82
82
} ) ;
83
83
}
84
84
85
+ // Add this new method
86
+ updateDataState ( newProps ) {
87
+ this . setState ( {
88
+ conflicts : newProps . conflicts ,
89
+ availabilitylist : newProps . availabilityList ,
90
+ busyslots : newProps . busySlotsForAvailabilities ,
91
+ maxslots : newProps . maxSlotsForAvailabilities ,
92
+ slotbuckets : newProps . slotBuckets ,
93
+ availabilitylistslices : writeSlotCalculationIntoAvailability (
94
+ newProps . availabilityList ,
95
+ newProps . maxSlotsForAvailabilities ,
96
+ newProps . busySlotsForAvailabilities
97
+ ) ,
98
+ stateChanged : false
99
+ } ) ;
100
+ }
101
+
102
+ // Modify refreshData to use the new method
85
103
refreshData ( ) {
86
104
const currentDate = formatTimestampDate ( this . props . timestamp )
87
105
const url = `${ this . props . links . includeurl } /scope/${ this . props . scope . id } /availability/day/${ currentDate } /conflicts/`
88
106
$ . ajax ( url , {
89
107
method : 'GET'
90
108
} ) . done ( data => {
91
- const newProps = {
92
- conflicts : data . conflicts ,
93
- availabilitylist : data . availabilityList ,
94
- busyslots : data . busySlotsForAvailabilities ,
95
- maxslots : data . maxSlotsForAvailabilities ,
96
- slotbuckets : data . slotBuckets ,
97
- }
98
- this . setState ( Object . assign ( { } , getStateFromProps ( Object . assign ( { } , this . props , newProps ) ) , {
99
- stateChanged : false
100
- } ) )
101
-
109
+ this . updateDataState ( data ) ;
102
110
} ) . fail ( err => {
103
111
console . log ( 'refreshData error' , err )
104
112
} )
@@ -108,9 +116,7 @@ class AvailabilityPage extends Component {
108
116
const ok = confirm ( 'Möchten Sie wirklich die Änderungen aller Öffnungszeiten speichern?' ) ;
109
117
if ( ok ) {
110
118
showSpinner ( ) ;
111
-
112
119
const selectedDate = formatTimestampDate ( this . props . timestamp ) ;
113
-
114
120
const sendData = this . state . availabilitylist
115
121
. filter ( ( availability ) => {
116
122
return (
@@ -124,7 +130,6 @@ class AvailabilityPage extends Component {
124
130
if ( availability . tempId ) {
125
131
delete sendAvailability . tempId ;
126
132
}
127
- console . log ( availability . kind ) ;
128
133
return {
129
134
...sendAvailability ,
130
135
kind : availability . kind || 'default' ,
@@ -137,58 +142,42 @@ class AvailabilityPage extends Component {
137
142
selectedDate : selectedDate
138
143
} ;
139
144
140
- console . log ( 'Saving updates' , payload ) ;
141
-
142
145
$ . ajax ( `${ this . props . links . includeurl } /availability/` , {
143
146
method : 'POST' ,
144
147
data : JSON . stringify ( payload ) ,
145
148
contentType : 'application/json'
146
149
} ) . done ( ( success ) => {
147
- console . log ( 'save success:' , success ) ;
150
+ // Update data immediately
148
151
this . refreshData ( ) ;
149
- this . setState ( {
150
- lastSave : new Date ( ) . getTime ( ) ,
151
- saveSuccess : true ,
152
- } , ( ) => {
153
- // Attempt to scroll immediately after state update, before the 6-second timer expires
154
- if ( this . successElement ) {
155
- this . successElement . scrollIntoView ( ) ;
156
- } else {
157
- // Fallback to bottom scroll if the element isn't available
158
- this . handleScrollToBottom ( ) ;
159
- }
160
- } ) ;
152
+ this . getValidationList ( ) ;
153
+
154
+ // Set SaveBar state with new method
155
+ this . updateSaveBarState ( 'save' , true ) ;
156
+
157
+ if ( this . successElement ) {
158
+ this . successElement . scrollIntoView ( ) ;
159
+ }
161
160
hideSpinner ( ) ;
162
- this . handleScrollToBottom ( ) ;
163
161
} ) . fail ( ( err ) => {
164
162
let isException = err . responseText . toLowerCase ( ) . includes ( 'exception' ) ;
165
163
if ( err . status >= 500 && isException ) {
166
164
new ExceptionHandler ( $ ( '.opened' ) , {
167
165
code : err . status ,
168
166
message : err . responseText
169
167
} ) ;
170
- } else if ( err . status === 404 ) {
171
- console . log ( '404 error, ignored' ) ;
172
168
} else {
173
169
console . log ( 'save all error' , err ) ;
174
170
}
175
- this . setState ( {
176
- lastSave : new Date ( ) . getTime ( ) ,
177
- saveSuccess : true ,
178
- } , ( ) => {
179
- if ( this . successElement ) {
180
- this . successElement . scrollIntoView ( ) ;
181
- }
182
- } ) ;
171
+ this . updateSaveBarState ( 'save' , false ) ;
183
172
this . getValidationList ( ) ;
184
173
hideSpinner ( ) ;
185
- this . handleScrollToBottom ( ) ;
186
174
} ) ;
187
175
} else {
188
176
hideSpinner ( ) ;
189
177
}
190
178
}
191
179
180
+
192
181
onRevertUpdates ( ) {
193
182
this . isCreatingExclusion = false
194
183
this . setState ( Object . assign ( { } , getInitialState ( this . props ) , {
@@ -207,7 +196,6 @@ class AvailabilityPage extends Component {
207
196
208
197
if ( ok ) {
209
198
const selectedDate = formatTimestampDate ( this . props . timestamp ) ;
210
-
211
199
const sendAvailability = Object . assign ( { } , availability ) ;
212
200
213
201
if ( sendAvailability . tempId ) {
@@ -224,23 +212,22 @@ class AvailabilityPage extends Component {
224
212
selectedDate : selectedDate
225
213
} ;
226
214
227
- console . log ( 'Updating single availability' , payload ) ;
228
-
229
215
$ . ajax ( `${ this . props . links . includeurl } /availability/save/${ id } /` , {
230
216
method : 'POST' ,
231
217
data : JSON . stringify ( payload ) ,
232
218
contentType : 'application/json'
233
219
} ) . done ( ( data ) => {
234
- console . log ( 'Single update success:' , data ) ;
220
+ // Update data immediately
235
221
this . refreshData ( ) ;
236
- this . setState ( {
237
- lastSave : new Date ( ) . getTime ( ) ,
238
- saveSuccess : true ,
239
- } , ( ) => {
222
+ this . getValidationList ( ) ;
223
+
224
+ // Set SaveBar state with new method
225
+ this . updateSaveBarState ( 'save' , true ) ;
226
+
227
+ if ( this . successElement ) {
240
228
this . successElement . scrollIntoView ( ) ;
241
- } ) ;
229
+ }
242
230
hideSpinner ( ) ;
243
- this . handleScrollToBottom ( ) ;
244
231
} ) . fail ( err => {
245
232
const isException = err . responseText . toLowerCase ( ) . includes ( 'exception' ) ;
246
233
if ( isException ) {
@@ -251,20 +238,23 @@ class AvailabilityPage extends Component {
251
238
} else {
252
239
console . log ( 'Update error:' , err ) ;
253
240
}
254
- this . setState ( {
255
- lastSave : new Date ( ) . getTime ( ) ,
256
- saveSuccess : false ,
257
- } ) ;
258
-
241
+ this . updateSaveBarState ( 'save' , false ) ;
259
242
this . getValidationList ( ) ;
260
243
hideSpinner ( ) ;
261
- this . handleScrollToBottom ( ) ;
262
244
} ) ;
263
245
} else {
264
246
hideSpinner ( ) ;
265
247
}
266
248
}
267
249
250
+ updateSaveBarState ( type , success ) {
251
+ this . setState ( {
252
+ lastSave : new Date ( ) . getTime ( ) ,
253
+ saveSuccess : success ,
254
+ saveType : type
255
+ } ) ;
256
+ }
257
+
268
258
onDeleteAvailability ( availability ) {
269
259
showSpinner ( ) ;
270
260
const ok = confirm ( 'Soll diese Öffnungszeit wirklich gelöscht werden?' )
@@ -273,13 +263,21 @@ class AvailabilityPage extends Component {
273
263
$ . ajax ( `${ this . props . links . includeurl } /availability/delete/${ id } /` , {
274
264
method : 'GET'
275
265
} ) . done ( ( ) => {
276
- this . setState ( Object . assign ( { } , deleteAvailabilityInState ( this . state , availability ) , {
277
- selectedAvailability : null
278
- } ) , ( ) => {
279
- this . refreshData ( )
280
- this . getConflictList ( ) ,
281
- this . getValidationList ( )
282
- } ) ;
266
+ const newState = deleteAvailabilityInState ( this . state , availability ) ;
267
+
268
+ // Update data immediately
269
+ this . refreshData ( ) ;
270
+ if ( newState . availabilitylist . length > 0 ) {
271
+ this . getConflictList ( ) ;
272
+ }
273
+ this . getValidationList ( ) ;
274
+
275
+ // Set SaveBar state with new method
276
+ this . updateSaveBarState ( 'delete' , true ) ;
277
+
278
+ if ( this . successElement ) {
279
+ this . successElement . scrollIntoView ( ) ;
280
+ }
283
281
hideSpinner ( ) ;
284
282
} ) . fail ( err => {
285
283
console . log ( 'delete error' , err ) ;
@@ -292,6 +290,7 @@ class AvailabilityPage extends Component {
292
290
} else {
293
291
console . log ( 'delete error' , err ) ;
294
292
}
293
+ this . updateSaveBarState ( 'delete' , false ) ;
295
294
hideSpinner ( ) ;
296
295
} )
297
296
} else {
@@ -459,23 +458,23 @@ class AvailabilityPage extends Component {
459
458
let state = { } ;
460
459
const newAvailability = getNewAvailability ( this . props . timestamp , tempId ( ) , this . props . scope , this . state . availabilitylist ) ;
461
460
newAvailability . type = "appointment" ;
462
-
461
+
463
462
state = Object . assign (
464
463
state ,
465
464
updateAvailabilityInState ( this . state , newAvailability )
466
465
) ;
467
-
466
+
468
467
state . selectedAvailability = newAvailability ;
469
468
state . stateChanged = false ;
470
-
469
+
471
470
this . setState ( state , ( ) => {
472
471
Promise . all ( [
473
472
this . getValidationList ( ) ,
474
473
this . getConflictList ( )
475
474
] )
476
- . then ( ( ) => {
477
- $ ( 'body' ) . scrollTop ( 0 ) ;
478
- } )
475
+ . then ( ( ) => {
476
+ $ ( 'body' ) . scrollTop ( 0 ) ;
477
+ } )
479
478
} ) ;
480
479
}
481
480
@@ -541,24 +540,24 @@ class AvailabilityPage extends Component {
541
540
}
542
541
return [ ] ;
543
542
} ;
544
-
543
+
545
544
try {
546
545
const list = this . state . availabilitylist
547
546
. map ( validateData )
548
547
. flat ( ) ;
549
-
548
+
550
549
console . log ( "Validations fetched successfully:" , list ) ;
551
-
550
+
552
551
this . setState (
553
552
{
554
553
errorList : list . length ? list : [ ] ,
555
554
} ,
556
555
( ) => {
557
556
if ( list . length > 0 ) {
558
- const nonPastTimeErrors = list . filter ( error =>
557
+ const nonPastTimeErrors = list . filter ( error =>
559
558
! error . itemList ?. flat ( 2 ) . some ( item => item ?. type === 'endTimePast' )
560
559
) ;
561
-
560
+
562
561
if ( nonPastTimeErrors . length > 0 ) {
563
562
console . warn ( "Validation failed with errors:" , nonPastTimeErrors ) ;
564
563
this . errorElement ?. scrollIntoView ( ) ;
@@ -590,9 +589,9 @@ class AvailabilityPage extends Component {
590
589
selectedDate : formatTimestampDate ( timestamp )
591
590
} ) ,
592
591
} ;
593
-
592
+
594
593
const url = `${ this . props . links . includeurl } /availability/conflicts/` ;
595
-
594
+
596
595
fetch ( url , requestOptions )
597
596
. then ( ( res ) => res . json ( ) )
598
597
. then (
@@ -876,6 +875,7 @@ class AvailabilityPage extends Component {
876
875
lastSave = { this . state . lastSave }
877
876
success = { this . state . saveSuccess }
878
877
setSuccessRef = { this . setSuccessRef }
878
+ type = { this . state . saveType }
879
879
/>
880
880
)
881
881
}
0 commit comments