Save Load Adapter Example
The In-memory example of save_load_adapter for testing purposes.
save_load_adapter: {
    charts: [],
    studyTemplates: [],
    drawingTemplates: [],
    chartTemplates: [],
    getAllCharts: function() {
        return Promise.resolve(this.charts);
    },
    removeChart: function(id) {
        for (var i = 0; i < this.charts.length; ++i) {
            if (this.charts[i].id === id) {
                this.charts.splice(i, 1);
                return Promise.resolve();
            }
        }
        return Promise.reject();
    },
    saveChart: function(chartData) {
        if (!chartData.id) {
            chartData.id = Math.random().toString();
        } else {
            this.removeChart(chartData.id);
        }
        this.charts.push(chartData);
        return Promise.resolve(chartData.id);
    },
    getChartContent: function(id) {
        for (var i = 0; i < this.charts.length; ++i) {
            if (this.charts[i].id === id) {
                return Promise.resolve(this.charts[i].content);
            }
        }
        console.error('error');
        return Promise.reject();
    },
    removeStudyTemplate: function(studyTemplateData) {
        for (var i = 0; i < this.studyTemplates.length; ++i) {
            if (this.studyTemplates[i].name === studyTemplateData.name) {
                this.studyTemplates.splice(i, 1);
                return Promise.resolve();
            }
        }
        return Promise.reject();
    },
    getStudyTemplateContent: function(studyTemplateData) {
        for (var i = 0; i < this.studyTemplates.length; ++i) {
            if (this.studyTemplates[i].name === studyTemplateData.name) {
                return Promise.resolve(this.studyTemplates[i]);
            }
        }
        console.error('st: error');
        return Promise.reject();
    },
    saveStudyTemplate: function(studyTemplateData) {
        for (var i = 0; i < this.studyTemplates.length; ++i) {
            if (this.studyTemplates[i].name === studyTemplateData.name) {
                this.studyTemplates.splice(i, 1);
                break;
            }
        }
        this.studyTemplates.push(studyTemplateData);
        return Promise.resolve();
    },
    getAllStudyTemplates: function() {
        return Promise.resolve(this.studyTemplates);
    },
    removeDrawingTemplate: function (toolName, templateName) {
        for (var i = 0; i < this.drawingTemplates.length; ++i) {
            if (this.drawingTemplates[i].name === templateName) {
                this.drawingTemplates.splice(i, 1);
                return Promise.resolve();
            }
        }
        return Promise.reject();
    },
    loadDrawingTemplate: function (toolName, templateName) {
        for (var i = 0; i < this.drawingTemplates.length; ++i) {
            if (this.drawingTemplates[i].name === templateName) {
                return Promise.resolve(this.drawingTemplates[i].content);
            }
        }
        console.error('drawing: error');
        return Promise.reject();
    },
    saveDrawingTemplate: function (toolName, templateName, content) {
        for (var i = 0; i < this.drawingTemplates.length; ++i) {
            if (this.drawingTemplates[i].name === templateName) {
                this.drawingTemplates.splice(i, 1);
                break;
            }
        }
        this.drawingTemplates.push({ name: templateName, content: content });
        return Promise.resolve();
    },
    getDrawingTemplates: function () {
        return Promise.resolve(this.drawingTemplates.map(function(template) {
            return template.name;
        }));
    },
    async getAllChartTemplates() {
        return this.chartTemplates.map(x => x.name);
    }
    async saveChartTemplate(templateName, content) {
        const theme = this.chartTemplates.find(x => x.name === templateName);
        if (theme) {
            theme.content = content;
        } else {
            this.chartTemplates.push({ name: templateName, content });
        }
    }
    async removeChartTemplate(templateName) {
        this.chartTemplates = this.chartTemplates.filter(x => x.name !== templateName);
    }
    async getChartTemplateContent(templateName) {
        const theme = {};
        const content = this.chartTemplates.find(x => x.name === templateName)?.content;
        if (content) {
            theme.content = structuredClone(content);
        }
        return theme
    }
}