blob: bee2be434af448fa002ec26fc349d6b8c33ea8ce [file] [log] [blame]
/**
* @module particles-config-sk
* @description <h2><code>particles-config-sk</code></h2>
*
* <p>
* A dialog for uploading a Particles JSON file.
*
* Just call show() which returns a Promise that resolves once
* the dialog is closed.
* </p>
*
*/
import 'elements-sk/styles/buttons';
import { define } from 'elements-sk/define';
import { errorMessage } from 'elements-sk/errorMessage';
import { html } from 'lit-html';
import { $$ } from 'common-sk/modules/dom';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
export interface ParticlesConfig {
body: any;
}
export class ParticlesConfigSk extends ElementSk {
private parsedParticleJSON: any | null = null;
private fileInput: HTMLInputElement | null = null;
private dialog: HTMLDialogElement | null = null;
private resolve: ((p: ParticlesConfig| undefined)=> void) | null = null;
constructor() {
super(ParticlesConfigSk.template);
}
private static template = (ele: ParticlesConfigSk) => html`
<dialog>
<label class=file>Particles file to upload
<input type=file id=file @change=${ele.onFileChange}/>
</label>
<div id=dialog-buttons>
<button @click=${ele.cancel}>Cancel</button>
<button class=action ?disabled=${!ele.parsedParticleJSON} @click=${ele.ok}>OK</button>
</div>
</dialog>
`;
/**
* show pops up the dialog and returns a Promise
* that resolves once the user has either clicked
* OK or Cancel.
*
* Upon OK the updated ParticlesConfig will be returned,
* and upon Cancel 'undefined' will be returned.
*/
show(config: ParticlesConfig): Promise<ParticlesConfig | undefined> {
return new Promise<ParticlesConfig | undefined>((resolve) => {
this.parsedParticleJSON = config.body;
this.resolve = resolve;
this._render();
this.dialog!.showModal();
});
}
connectedCallback(): void {
super.connectedCallback();
this._render();
this.fileInput = $$<HTMLInputElement>('#file', this);
this.dialog = $$<HTMLDialogElement>('dialog', this);
}
private onFileChange() {
const reader = new FileReader();
reader.addEventListener('load', () => {
const body = reader.result as string;
let parsed: any = {};
try {
parsed = JSON.parse(body) as any;
} catch (error) {
errorMessage(`Not a valid JSON file: ${error}`);
return;
}
this.parsedParticleJSON = parsed;
this._render();
});
reader.readAsText(this.fileInput!.files![0]);
}
private cancel() {
this.dialog!.close();
this.resolve!(undefined);
}
private ok() {
this.dialog!.close();
this.resolve!({
body: this.parsedParticleJSON,
});
}
}
define('particles-config-sk', ParticlesConfigSk);