@@ -17,6 +17,30 @@ document.addEventListener("turbolinks:load", () => {
1717 /*****************************************
1818 ********* submit_forecasts start ********
1919 *****************************************/
20+ const checkStorageForForecast = ( ) => {
21+ let member = document . querySelector ( "#forecast-form #member-emails" )
22+ let forecastForm = document . getElementById ( "forecast-form" )
23+ if ( forecastForm && member ) {
24+ let inputs = forecastForm . elements
25+ let storedValues = JSON . parse ( localStorage . getItem ( `${ member . value } ;${ forecastForm . dataset . date } ` ) )
26+ if ( storedValues ) {
27+ for ( let i = 0 ; i < inputs . length ; i ++ ) {
28+ if ( inputs [ i ] . name &&
29+ inputs [ i ] . name . toLowerCase ( ) != "authenticity_token" &&
30+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[team_monthly_forecast_id]" &&
31+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[member_id]" ) {
32+ if ( storedValues [ inputs [ i ] . name ] ) {
33+ inputs [ i ] . value = storedValues [ inputs [ i ] . name ]
34+ }
35+ }
36+ }
37+ return true
38+ } else {
39+ return false
40+ }
41+ }
42+ }
43+
2044 // Handle changing form content based on selected team
2145 const userDetailsForm = document . getElementById ( "forecast-user-details-form" )
2246 const userDetailsFormTeamField = document . querySelector ( "#forecast-user-details-form #user-details-team-id" )
@@ -32,8 +56,8 @@ document.addEventListener("turbolinks:load", () => {
3256 if ( userDetailsForm ) {
3357 userDetailsForm . addEventListener ( "ajax:success" , ( ) => {
3458 bindMemberChangeHandler ( )
59+ checkStorageForForecast ( )
3560 countHours ( )
36-
3761 } )
3862 userDetailsForm . addEventListener ( "ajax:error" , ( ) => {
3963 location . reload ( )
@@ -59,6 +83,24 @@ document.addEventListener("turbolinks:load", () => {
5983 if ( formButton ) {
6084 formButton . disabled = false
6185 }
86+ // if false, clear inputs because member changed
87+ if ( ! checkStorageForForecast ( ) ) {
88+ let forecastForm = document . getElementById ( "forecast-form" )
89+ let inputs = forecastForm . elements
90+ for ( let i = 0 ; i < inputs . length ; i ++ ) {
91+ if ( inputs [ i ] . name &&
92+ inputs [ i ] . name . toLowerCase ( ) != "authenticity_token" &&
93+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[team_monthly_forecast_id]" &&
94+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[member_id]" ) {
95+ // don't clear holiday
96+ if ( inputs [ i ] . dataset . holiday ) {
97+ inputs [ i ] . value = inputs [ i ] . dataset . holiday
98+ } else if ( inputs [ i ] . name ) {
99+ inputs [ i ] . value = ""
100+ }
101+ }
102+ }
103+ }
62104 } )
63105 }
64106 }
@@ -94,8 +136,62 @@ document.addEventListener("turbolinks:load", () => {
94136 currentHours . classList . remove ( "text-green-600" , "font-bold" )
95137 }
96138 }
139+ const submitForecastButton = document . querySelector ( "#forecast-form #forecast-submit" )
140+
141+ // Store the submission locally
142+ if ( submitForecastButton ) {
143+ submitForecastButton . addEventListener ( 'click' , ( e ) => {
144+ let forecastForm = document . getElementById ( "forecast-form" )
145+ if ( forecastForm ) {
146+ let inputs = forecastForm . elements
147+ let memberId = document . querySelector ( "#forecast-form #member-emails" ) . value
148+ let submission = { }
149+ for ( let i = 0 ; i < inputs . length ; i ++ ) {
150+ if ( inputs [ i ] . name &&
151+ inputs [ i ] . name . toLowerCase ( ) != "authenticity_token" &&
152+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[team_monthly_forecast_id]" &&
153+ inputs [ i ] . name . toLowerCase ( ) != "member_forecast[member_id]" ) {
154+ submission [ inputs [ i ] . name ] = inputs [ i ] . value
155+ }
156+ }
157+ try {
158+ localStorage . setItem ( `${ memberId } ;${ forecastForm . dataset . date } ` , JSON . stringify ( submission ) ) ;
159+ } catch ( e ) {
160+ if ( (
161+ // everything except Firefox
162+ e . code === 22 ||
163+ // Firefox
164+ e . code === 1014 ||
165+ // test name field too, because code might not be present
166+ // everything except Firefox
167+ e . name === 'QuotaExceededError' ||
168+ // Firefox
169+ e . name === 'NS_ERROR_DOM_QUOTA_REACHED' ) &&
170+ // acknowledge QuotaExceededError only if there's something already stored
171+ ( storage && storage . length !== 0 ) ) {
172+ let keys = [ ]
173+ for ( let i = 0 ; i < localStorage . length ; ++ i ) {
174+ keys . append ( localStorage . key ( i ) ) ;
175+ }
176+ // remove last 4 submissions and store again
177+ let sorted = keys . sort ( )
178+ for ( let i = 0 ; sorted [ i ] && i < 4 ; i ++ ) {
179+ localStorage . removeItem ( sorted [ i ] )
180+ }
181+ localStorage . setItem ( `${ memberId } ;${ forecastForm . dataset . date } ` , JSON . stringify ( submission ) ) ;
182+ }
183+ }
184+ }
185+ } )
186+ }
187+
188+ // Whenver form present and page reloads, check storage
189+ let forecastForm = document . getElementById ( "forecast-form" )
190+ if ( forecastForm ) {
191+ checkStorageForForecast ( )
192+ countHours ( )
193+ }
97194
98- countHours ( )
99195 /***************************************
100196 ********* submit_forecasts end ********
101197 ***************************************/
0 commit comments