mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) move client code to core
Summary: This moves all client code to core, and makes minimal fix-ups to get grist and grist-core to compile correctly. The client works in core, but I'm leaving clean-up around the build and bundles to follow-up. Test Plan: existing tests pass; server-dev bundle looks sane Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D2627
This commit is contained in:
32
app/client/lib/fromKoSave.ts
Normal file
32
app/client/lib/fromKoSave.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* Replicates some of grainjs's fromKo, except that the returned observables have a set() method
|
||||
* which calls koObs.saveOnly(val) rather than koObs(val).
|
||||
*/
|
||||
import {IKnockoutObservable, KoWrapObs, Observable} from 'grainjs';
|
||||
|
||||
const wrappers: WeakMap<IKnockoutObservable<any>, Observable<any>> = new WeakMap();
|
||||
|
||||
/**
|
||||
* Returns a Grain.js observable which mirrors a Knockout observable.
|
||||
*
|
||||
* Do not dispose this wrapper, as it is shared by all code using koObs, and its lifetime is tied
|
||||
* to the lifetime of koObs. If unused, it consumes minimal resources, and should get garbage
|
||||
* collected along with koObs.
|
||||
*/
|
||||
export function fromKoSave<T>(koObs: IKnockoutObservable<T>): Observable<T> {
|
||||
return wrappers.get(koObs) || wrappers.set(koObs, new KoSaveWrapObs(koObs)).get(koObs)!;
|
||||
}
|
||||
|
||||
export class KoSaveWrapObs<T> extends KoWrapObs<T> {
|
||||
constructor(_koObs: IKnockoutObservable<T>) {
|
||||
if (!('saveOnly' in _koObs)) {
|
||||
throw new Error('fromKoSave needs a saveable observable');
|
||||
}
|
||||
super(_koObs);
|
||||
}
|
||||
|
||||
public set(value: T): void {
|
||||
// Hacky cast to get a private member. TODO: should make it protected instead.
|
||||
(this as any)._koObs.saveOnly(value);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user