Skip to content

Commit

Permalink
feat(API): example form takes options
Browse files Browse the repository at this point in the history
  • Loading branch information
danielo515 committed Dec 7, 2023
1 parent 22d1b23 commit d204786
Showing 1 changed file with 54 additions and 32 deletions.
86 changes: 54 additions & 32 deletions src/API.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ import { ModalFormError } from "./utils/ModalFormError";
import { FormModal } from "./FormModal";
import { log_error, log_notice } from "./utils/Log";

type pickOption = { pick: string[] }
type omitOption = { omit: string[] }
type limitOptions = { pick?: string[], omit?: string[] }
type pickOption = { pick: string[] };
type omitOption = { omit: string[] };
type limitOptions = { pick?: string[]; omit?: string[] };

function isPickOption(opts: limitOptions): opts is pickOption {
return 'pick' in opts && Array.isArray(opts.pick)
return "pick" in opts && Array.isArray(opts.pick);
}
function isOmitOption(opts: limitOptions): opts is omitOption {
return 'omit' in opts && Array.isArray(opts.omit)
return "omit" in opts && Array.isArray(opts.omit);
}

export class API {
Expand All @@ -26,37 +26,41 @@ export class API {
* @param {App} app - The application instance
* @param {typeof ModalFormPlugin} plugin - The plugin instance
*/
constructor(private app: App, private plugin: ModalFormPlugin) { }
constructor(
private app: App,
private plugin: ModalFormPlugin,
) { }

/**
* Opens a modal form with the provided form definition
* @param {FormDefinition} formDefinition - The form definition to use
* @returns {Promise<FormResult>} - A promise that resolves with the form result
*/
openModalForm(formDefinition: FormDefinition, options?: FormOptions): Promise<FormResult> {
openModalForm(
formDefinition: FormDefinition,
options?: FormOptions,
): Promise<FormResult> {
return new Promise((resolve) => {
new FormModal(
this.app,
formDefinition,
resolve,
options
).open();
new FormModal(this.app, formDefinition, resolve, options).open();
});
}
exampleForm(): Promise<FormResult> {
return this.openModalForm(exampleModalDefinition)
exampleForm(options?: FormOptions): Promise<FormResult> {
return this.openModalForm(exampleModalDefinition, options);
}

private getFormByName(name: string): FormDefinition | undefined {
const form = this.plugin.settings?.formDefinitions.find((form) => form.name === name);
const form = this.plugin.settings?.formDefinitions.find(
(form) => form.name === name,
);
if (form instanceof MigrationError) {
log_notice('🚫 The form you tried to load has an invalid format',
log_notice(
"🚫 The form you tried to load has an invalid format",
`The form "${name}" has an invalid format.` +
`We tried to automatically convert it but it failed, please fix it manually in the forms manager.
`)
`,
);
return undefined;
} else {

return form;
}
}
Expand All @@ -68,35 +72,51 @@ export class API {
* @throws {ModalFormError} - Throws an error if the form definition is not found
*/
public namedForm(name: string, options?: FormOptions): Promise<FormResult> {
const formDefinition = this.getFormByName(name)
const formDefinition = this.getFormByName(name);
if (formDefinition) {
return this.openModalForm(formDefinition, options);
} else {
const error = new ModalFormError(`Form definition ${name} not found`)
const error = new ModalFormError(
`Form definition ${name} not found`,
);
log_error(error);
return Promise.reject(error)
return Promise.reject(error);
}
}

public limitedForm(name: string, opts: limitOptions): Promise<FormResult> {
const formDefinition = this.getFormByName(name)
const formDefinition = this.getFormByName(name);
let newFormDefinition: FormDefinition;
if (formDefinition) {
if (isOmitOption(opts)) {
const omit = opts.omit
newFormDefinition = { ...formDefinition, fields: formDefinition.fields.filter((field) => !omit.includes(field.name)) }
const omit = opts.omit;
newFormDefinition = {
...formDefinition,
fields: formDefinition.fields.filter(
(field) => !omit.includes(field.name),
),
};
} else if (isPickOption(opts)) {
newFormDefinition = { ...formDefinition, fields: formDefinition.fields.filter((field) => opts.pick.includes(field.name)) }
newFormDefinition = {
...formDefinition,
fields: formDefinition.fields.filter((field) =>
opts.pick.includes(field.name),
),
};
} else {
throw new ModalFormError('Invalid options provided to limitedForm', `GOT: ${JSON.stringify(opts)}`)
throw new ModalFormError(
"Invalid options provided to limitedForm",
`GOT: ${JSON.stringify(opts)}`,
);
}
return this.openModalForm(newFormDefinition);
} else {
const error = new ModalFormError(`Form definition ${name} not found`)
const error = new ModalFormError(
`Form definition ${name} not found`,
);
log_error(error);
return Promise.reject(error)
return Promise.reject(error);
}

}

/**
Expand All @@ -105,12 +125,14 @@ export class API {
* @returns {Promise<FormResult>} - A promise that resolves with the form result
* @throws {ModalFormError} - Throws an error if the form reference is not found
*/
public openForm(formReference: string | FormDefinition, options?: FormOptions): Promise<FormResult> {
public openForm(
formReference: string | FormDefinition,
options?: FormOptions,
): Promise<FormResult> {
if (typeof formReference === "string") {
return this.namedForm(formReference, options);
} else {
return this.openModalForm(formReference, options);
}
}
}

0 comments on commit d204786

Please sign in to comment.