@@ -151,10 +151,8 @@ export default class ABFActorSheet extends ActorSheet {
151151 }
152152
153153 _setupDebouncedSheetUpdates ( html ) {
154- // Keep a flat object with pending updates: { "system.foo.bar": 123, ... }
155154 this . _pendingUpdate = this . _pendingUpdate ?? { } ;
156155
157- // Debounced flush (single update per burst)
158156 this . _flushPendingUpdate =
159157 this . _flushPendingUpdate ??
160158 foundry . utils . debounce ( async ( ) => {
@@ -165,31 +163,39 @@ export default class ABFActorSheet extends ActorSheet {
165163
166164 const [ actorChanges , itemChanges ] = splitAsActorAndItemChanges ( flat ) ;
167165
168- // Update items first (if any)
169166 await this . updateItems ( itemChanges ) ;
170167
171- // Then update actor (if any)
172168 if ( actorChanges && Object . keys ( actorChanges ) . length > 0 ) {
173169 await this . actor . update ( actorChanges ) ;
174170 }
175171 } , 150 ) ;
176172
177- // Listen to changes on any form control
178173 html . on ( 'change' , 'input, select, textarea' , ev => {
179174 const el = ev . currentTarget ;
180175 if ( ! el ?. name ) return ;
181176
182177 let value ;
183- if ( el . type === 'checkbox' ) value = el . checked ;
184- else value = el . value ;
185178
186- // Convert numbers
187- if ( el . type === 'number' ) value = Number ( value ) ;
179+ if ( el . type === 'checkbox' ) {
180+ value = el . checked ;
181+ } else {
182+ value = el . value ;
183+ }
188184
189- // Accumulate changes using the input name as the update path
190- // Example: "system.general.presence.base.value"
191- this . _pendingUpdate [ el . name ] = value ;
185+ // Respect Foundry-style dtype (works for <select> too)
186+ const dtype = el . dataset ?. dtype ;
187+
188+ if ( dtype === 'Number' ) {
189+ const n = Number ( value ) ;
190+ value = Number . isFinite ( n ) ? n : 0 ;
191+ } else if ( dtype === 'Boolean' ) {
192+ value = value === 'true' || value === true ;
193+ } else if ( el . type === 'number' ) {
194+ const n = Number ( value ) ;
195+ value = Number . isFinite ( n ) ? n : 0 ;
196+ }
192197
198+ this . _pendingUpdate [ el . name ] = value ;
193199 this . _flushPendingUpdate ( ) ;
194200 } ) ;
195201 }
@@ -367,13 +373,6 @@ export default class ABFActorSheet extends ActorSheet {
367373 protected ;
368374
369375 async _updateObject ( event , formData ) {
370- // We have to parse all qualities in order to convert from it selectable to integers to make calculations
371- Object . keys ( formData ) . forEach ( key => {
372- if ( key . includes ( 'quality' ) ) {
373- formData [ key ] = parseInt ( formData [ key ] , 10 ) ;
374- }
375- } ) ;
376-
377376 const [ actorChanges , itemChanges ] = splitAsActorAndItemChanges ( formData ) ;
378377
379378 await this . updateItems ( itemChanges ) ;
0 commit comments