import {AccessLevel} from "app/common/CustomWidget"; import {ViewSectionRec} from "app/client/models/entities/ViewSectionRec"; import {CustomView} from "app/client/components/CustomView"; import {GristDoc} from "app/client/components/GristDoc"; import {reportError} from 'app/client/models/errors'; //Abstract class for more future inheritances abstract class CustomAttachedView extends CustomView { public override create(gristDoc: GristDoc, viewSectionModel: ViewSectionRec) { super.create(gristDoc, viewSectionModel); if (viewSectionModel.customDef.access.peek() !== AccessLevel.full) { void viewSectionModel.customDef.access.setAndSave(AccessLevel.full).catch((err)=>{ if (err?.code === "ACL_DENY") { // do nothing, we might be in a readonly mode. return; } reportError(err); }); } const widgetsApi = this.gristDoc.app.topAppModel.api; widgetsApi.getWidgets().then(async result=>{ const widget = result.find(w=>w.name == this.getWidgetName()); if (widget && this.customDef.url.peek() !== widget.url) { await this.customDef.url.setAndSave(widget.url); } }).catch((err)=>{ if (err?.code !== "ACL_DENY") { // TODO: revisit it later. getWidgets() is async call, and non of the code // above is checking if we are still alive. console.error(err); } else { // do nothing, we might be in a readonly mode. } }); } protected abstract getWidgetName(): string; } export class CustomCalendarView extends CustomAttachedView { protected getWidgetName(): string { return "Calendar"; } }