mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Form Publishing
Summary: Adds initial implementation of form publishing, built upon WYSIWYS shares. A simple UI for publishing and unpublishing forms is included. Test Plan: Browser tests. Reviewers: jarek Reviewed By: jarek Subscribers: paulfitz, jarek Differential Revision: https://phab.getgrist.com/D4154
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import {useBindable} from 'app/common/gutil';
|
||||
import {BindableValue, dom} from 'grainjs';
|
||||
import {BindableValue, Computed, dom, IDisposableOwner, Observable, UseCB} from 'grainjs';
|
||||
|
||||
/**
|
||||
* Version of makeTestId that can be appended conditionally.
|
||||
@@ -14,3 +14,53 @@ export function makeTestId(prefix: string) {
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export function autoFocus() {
|
||||
return (el: HTMLElement) => void setTimeout(() => el.focus(), 10);
|
||||
}
|
||||
|
||||
export function autoSelect() {
|
||||
return (el: HTMLElement) => void setTimeout(() => (el as any).select?.(), 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Async computed version of Computed.
|
||||
*/
|
||||
export const AsyncComputed = {
|
||||
create<T>(owner: IDisposableOwner, cb: (use: UseCB) => Promise<T>): AsyncComputed<T> {
|
||||
const backend: Observable<T|undefined> = Observable.create(owner, undefined);
|
||||
const dirty = Observable.create(owner, true);
|
||||
const computed: Computed<Promise<T>> = Computed.create(owner, cb as any);
|
||||
let ticket = 0;
|
||||
const listener = (prom: Promise<T>): void => {
|
||||
dirty.set(true);
|
||||
const myTicket = ++ticket;
|
||||
prom.then(v => {
|
||||
if (ticket !== myTicket) { return; }
|
||||
if (backend.isDisposed()) { return; }
|
||||
dirty.set(false);
|
||||
backend.set(v);
|
||||
}).catch(reportError);
|
||||
};
|
||||
owner?.autoDispose(computed.addListener(listener));
|
||||
listener(computed.get());
|
||||
return Object.assign(backend, {
|
||||
dirty
|
||||
});
|
||||
}
|
||||
};
|
||||
export interface AsyncComputed<T> extends Observable<T|undefined> {
|
||||
/**
|
||||
* Whether computed wasn't updated yet.
|
||||
*/
|
||||
dirty: Observable<boolean>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops propagation of the event, and prevents default action.
|
||||
*/
|
||||
export function stopEvent(ev: Event) {
|
||||
ev.stopPropagation();
|
||||
ev.preventDefault();
|
||||
ev.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user