figrecipe 0.6.0__py3-none-any.whl → 0.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- figrecipe/__init__.py +106 -973
- figrecipe/_api/__init__.py +48 -0
- figrecipe/_api/_extract.py +108 -0
- figrecipe/_api/_notebook.py +61 -0
- figrecipe/_api/_panel.py +46 -0
- figrecipe/_api/_save.py +191 -0
- figrecipe/_api/_seaborn_proxy.py +34 -0
- figrecipe/_api/_style_manager.py +153 -0
- figrecipe/_api/_subplots.py +333 -0
- figrecipe/_api/_validate.py +82 -0
- figrecipe/_dev/__init__.py +2 -93
- figrecipe/_dev/_plotters.py +76 -0
- figrecipe/_dev/_run_demos.py +56 -0
- figrecipe/_dev/demo_plotters/__init__.py +35 -166
- figrecipe/_dev/demo_plotters/_categories.py +81 -0
- figrecipe/_dev/demo_plotters/_figure_creators.py +119 -0
- figrecipe/_dev/demo_plotters/_helpers.py +31 -0
- figrecipe/_dev/demo_plotters/_registry.py +50 -0
- figrecipe/_dev/demo_plotters/bar_categorical/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/contour_surface/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/distribution/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/image_matrix/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/line_curve/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/{plot_plot.py → line_curve/plot_plot.py} +3 -2
- figrecipe/_dev/demo_plotters/scatter_points/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/special/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/{plot_pie.py → special/plot_pie.py} +5 -1
- figrecipe/_dev/demo_plotters/spectral_signal/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/vector_flow/__init__.py +4 -0
- figrecipe/_editor/__init__.py +57 -9
- figrecipe/_editor/_bbox/__init__.py +43 -0
- figrecipe/_editor/_bbox/_collections.py +177 -0
- figrecipe/_editor/_bbox/_elements.py +159 -0
- figrecipe/_editor/_bbox/_extract.py +256 -0
- figrecipe/_editor/_bbox/_extract_axes.py +370 -0
- figrecipe/_editor/_bbox/_extract_text.py +342 -0
- figrecipe/_editor/_bbox/_lines.py +173 -0
- figrecipe/_editor/_bbox/_transforms.py +146 -0
- figrecipe/_editor/_flask_app.py +68 -1039
- figrecipe/_editor/_helpers.py +242 -0
- figrecipe/_editor/_hitmap/__init__.py +76 -0
- figrecipe/_editor/_hitmap/_artists/__init__.py +21 -0
- figrecipe/_editor/_hitmap/_artists/_collections.py +345 -0
- figrecipe/_editor/_hitmap/_artists/_images.py +68 -0
- figrecipe/_editor/_hitmap/_artists/_lines.py +107 -0
- figrecipe/_editor/_hitmap/_artists/_patches.py +163 -0
- figrecipe/_editor/_hitmap/_artists/_text.py +190 -0
- figrecipe/_editor/_hitmap/_colors.py +181 -0
- figrecipe/_editor/_hitmap/_detect.py +137 -0
- figrecipe/_editor/_hitmap/_restore.py +154 -0
- figrecipe/_editor/_hitmap_main.py +182 -0
- figrecipe/_editor/_preferences.py +135 -0
- figrecipe/_editor/_render_overrides.py +480 -0
- figrecipe/_editor/_renderer.py +35 -185
- figrecipe/_editor/_routes_axis.py +453 -0
- figrecipe/_editor/_routes_core.py +284 -0
- figrecipe/_editor/_routes_element.py +317 -0
- figrecipe/_editor/_routes_style.py +223 -0
- figrecipe/_editor/_templates/__init__.py +78 -1
- figrecipe/_editor/_templates/_html.py +109 -13
- figrecipe/_editor/_templates/_scripts/__init__.py +120 -0
- figrecipe/_editor/_templates/_scripts/_api.py +228 -0
- figrecipe/_editor/_templates/_scripts/_colors.py +485 -0
- figrecipe/_editor/_templates/_scripts/_core.py +436 -0
- figrecipe/_editor/_templates/_scripts/_debug_snapshot.py +186 -0
- figrecipe/_editor/_templates/_scripts/_element_editor.py +310 -0
- figrecipe/_editor/_templates/_scripts/_files.py +195 -0
- figrecipe/_editor/_templates/_scripts/_hitmap.py +509 -0
- figrecipe/_editor/_templates/_scripts/_inspector.py +315 -0
- figrecipe/_editor/_templates/_scripts/_labels.py +464 -0
- figrecipe/_editor/_templates/_scripts/_legend_drag.py +265 -0
- figrecipe/_editor/_templates/_scripts/_modals.py +226 -0
- figrecipe/_editor/_templates/_scripts/_overlays.py +292 -0
- figrecipe/_editor/_templates/_scripts/_panel_drag.py +334 -0
- figrecipe/_editor/_templates/_scripts/_panel_position.py +279 -0
- figrecipe/_editor/_templates/_scripts/_selection.py +237 -0
- figrecipe/_editor/_templates/_scripts/_tabs.py +89 -0
- figrecipe/_editor/_templates/_scripts/_view_mode.py +107 -0
- figrecipe/_editor/_templates/_scripts/_zoom.py +179 -0
- figrecipe/_editor/_templates/_styles/__init__.py +69 -0
- figrecipe/_editor/_templates/_styles/_base.py +64 -0
- figrecipe/_editor/_templates/_styles/_buttons.py +206 -0
- figrecipe/_editor/_templates/_styles/_color_input.py +123 -0
- figrecipe/_editor/_templates/_styles/_controls.py +265 -0
- figrecipe/_editor/_templates/_styles/_dynamic_props.py +144 -0
- figrecipe/_editor/_templates/_styles/_forms.py +126 -0
- figrecipe/_editor/_templates/_styles/_hitmap.py +184 -0
- figrecipe/_editor/_templates/_styles/_inspector.py +90 -0
- figrecipe/_editor/_templates/_styles/_labels.py +118 -0
- figrecipe/_editor/_templates/_styles/_modals.py +98 -0
- figrecipe/_editor/_templates/_styles/_overlays.py +130 -0
- figrecipe/_editor/_templates/_styles/_preview.py +225 -0
- figrecipe/_editor/_templates/_styles/_selection.py +73 -0
- figrecipe/_params/_DECORATION_METHODS.py +6 -0
- figrecipe/_recorder.py +35 -106
- figrecipe/_recorder_utils.py +124 -0
- figrecipe/_reproducer/__init__.py +18 -0
- figrecipe/_reproducer/_core.py +498 -0
- figrecipe/_reproducer/_custom_plots.py +279 -0
- figrecipe/_reproducer/_seaborn.py +100 -0
- figrecipe/_reproducer/_violin.py +186 -0
- figrecipe/_signatures/_kwargs.py +273 -0
- figrecipe/_signatures/_loader.py +21 -423
- figrecipe/_signatures/_parsing.py +147 -0
- figrecipe/_wrappers/_axes.py +119 -910
- figrecipe/_wrappers/_axes_helpers.py +136 -0
- figrecipe/_wrappers/_axes_plots.py +418 -0
- figrecipe/_wrappers/_axes_seaborn.py +157 -0
- figrecipe/_wrappers/_figure.py +162 -0
- figrecipe/_wrappers/_panel_labels.py +127 -0
- figrecipe/_wrappers/_plot_helpers.py +143 -0
- figrecipe/_wrappers/_violin_helpers.py +180 -0
- figrecipe/styles/__init__.py +8 -6
- figrecipe/styles/_dotdict.py +72 -0
- figrecipe/styles/_finalize.py +134 -0
- figrecipe/styles/_fonts.py +77 -0
- figrecipe/styles/_kwargs_converter.py +178 -0
- figrecipe/styles/_plot_styles.py +209 -0
- figrecipe/styles/_style_applier.py +32 -478
- figrecipe/styles/_style_loader.py +16 -192
- figrecipe/styles/_themes.py +151 -0
- figrecipe/styles/presets/MATPLOTLIB.yaml +2 -1
- figrecipe/styles/presets/SCITEX.yaml +29 -24
- {figrecipe-0.6.0.dist-info → figrecipe-0.7.4.dist-info}/METADATA +37 -2
- figrecipe-0.7.4.dist-info/RECORD +188 -0
- figrecipe/_editor/_bbox.py +0 -978
- figrecipe/_editor/_hitmap.py +0 -937
- figrecipe/_editor/_templates/_scripts.py +0 -2778
- figrecipe/_editor/_templates/_styles.py +0 -1326
- figrecipe/_reproducer.py +0 -975
- figrecipe-0.6.0.dist-info/RECORD +0 -90
- /figrecipe/_dev/demo_plotters/{plot_bar.py → bar_categorical/plot_bar.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_barh.py → bar_categorical/plot_barh.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_contour.py → contour_surface/plot_contour.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_contourf.py → contour_surface/plot_contourf.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_tricontour.py → contour_surface/plot_tricontour.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_tricontourf.py → contour_surface/plot_tricontourf.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_tripcolor.py → contour_surface/plot_tripcolor.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_triplot.py → contour_surface/plot_triplot.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_boxplot.py → distribution/plot_boxplot.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_ecdf.py → distribution/plot_ecdf.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_hist.py → distribution/plot_hist.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_hist2d.py → distribution/plot_hist2d.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_violinplot.py → distribution/plot_violinplot.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_hexbin.py → image_matrix/plot_hexbin.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_imshow.py → image_matrix/plot_imshow.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_matshow.py → image_matrix/plot_matshow.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_pcolor.py → image_matrix/plot_pcolor.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_pcolormesh.py → image_matrix/plot_pcolormesh.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_spy.py → image_matrix/plot_spy.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_errorbar.py → line_curve/plot_errorbar.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_fill.py → line_curve/plot_fill.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_fill_between.py → line_curve/plot_fill_between.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_fill_betweenx.py → line_curve/plot_fill_betweenx.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_stackplot.py → line_curve/plot_stackplot.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_stairs.py → line_curve/plot_stairs.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_step.py → line_curve/plot_step.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_scatter.py → scatter_points/plot_scatter.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_eventplot.py → special/plot_eventplot.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_loglog.py → special/plot_loglog.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_semilogx.py → special/plot_semilogx.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_semilogy.py → special/plot_semilogy.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_stem.py → special/plot_stem.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_acorr.py → spectral_signal/plot_acorr.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_angle_spectrum.py → spectral_signal/plot_angle_spectrum.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_cohere.py → spectral_signal/plot_cohere.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_csd.py → spectral_signal/plot_csd.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_magnitude_spectrum.py → spectral_signal/plot_magnitude_spectrum.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_phase_spectrum.py → spectral_signal/plot_phase_spectrum.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_psd.py → spectral_signal/plot_psd.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_specgram.py → spectral_signal/plot_specgram.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_xcorr.py → spectral_signal/plot_xcorr.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_barbs.py → vector_flow/plot_barbs.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_quiver.py → vector_flow/plot_quiver.py} +0 -0
- /figrecipe/_dev/demo_plotters/{plot_streamplot.py → vector_flow/plot_streamplot.py} +0 -0
- {figrecipe-0.6.0.dist-info → figrecipe-0.7.4.dist-info}/WHEEL +0 -0
- {figrecipe-0.6.0.dist-info → figrecipe-0.7.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""API calls JavaScript for the figure editor.
|
|
4
|
+
|
|
5
|
+
This module contains the JavaScript code for:
|
|
6
|
+
- Preview update and refresh
|
|
7
|
+
- Form data collection
|
|
8
|
+
- Save/reset/restore operations
|
|
9
|
+
- Override status management
|
|
10
|
+
- Download functionality
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
SCRIPTS_API = """
|
|
14
|
+
// ===== API CALLS AND SERVER COMMUNICATION =====
|
|
15
|
+
|
|
16
|
+
// Schedule update with debounce
|
|
17
|
+
function scheduleUpdate() {
|
|
18
|
+
if (updateTimeout) {
|
|
19
|
+
clearTimeout(updateTimeout);
|
|
20
|
+
}
|
|
21
|
+
updateTimeout = setTimeout(updatePreview, UPDATE_DEBOUNCE);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Collect current overrides from form
|
|
25
|
+
function collectOverrides() {
|
|
26
|
+
const overrides = {};
|
|
27
|
+
|
|
28
|
+
const inputs = document.querySelectorAll('input, select');
|
|
29
|
+
inputs.forEach(input => {
|
|
30
|
+
if (input.id === 'dark-mode-toggle') return;
|
|
31
|
+
if (!input.id) return;
|
|
32
|
+
|
|
33
|
+
let value;
|
|
34
|
+
if (input.type === 'checkbox') {
|
|
35
|
+
value = input.checked;
|
|
36
|
+
} else if (input.type === 'number' || input.type === 'range') {
|
|
37
|
+
value = parseFloat(input.value);
|
|
38
|
+
if (isNaN(value)) return;
|
|
39
|
+
} else {
|
|
40
|
+
value = input.value;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
overrides[input.id] = value;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return overrides;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Update preview
|
|
50
|
+
async function updatePreview() {
|
|
51
|
+
const overrides = collectOverrides();
|
|
52
|
+
const darkMode = document.getElementById('dark-mode-toggle').checked;
|
|
53
|
+
|
|
54
|
+
document.body.classList.add('loading');
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch('/update', {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: { 'Content-Type': 'application/json' },
|
|
60
|
+
body: JSON.stringify({ overrides, dark_mode: darkMode })
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
|
|
65
|
+
// Update preview image
|
|
66
|
+
const img = document.getElementById('preview-image');
|
|
67
|
+
img.src = 'data:image/png;base64,' + data.image;
|
|
68
|
+
|
|
69
|
+
// Update dimensions for hitmap scaling
|
|
70
|
+
if (data.img_size) {
|
|
71
|
+
currentImgWidth = data.img_size.width;
|
|
72
|
+
currentImgHeight = data.img_size.height;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Update bboxes
|
|
76
|
+
currentBboxes = data.bboxes;
|
|
77
|
+
|
|
78
|
+
// Redraw selection if element still exists
|
|
79
|
+
if (selectedElement && currentBboxes[selectedElement.key]) {
|
|
80
|
+
drawSelection(selectedElement.key);
|
|
81
|
+
} else {
|
|
82
|
+
clearSelection();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Reload hitmap and redraw hit regions
|
|
86
|
+
loadHitmap();
|
|
87
|
+
updateHitRegions();
|
|
88
|
+
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error('Update failed:', error);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
document.body.classList.remove('loading');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Reset values to initial
|
|
97
|
+
function resetValues() {
|
|
98
|
+
initializeValues();
|
|
99
|
+
updatePreview();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Save overrides
|
|
103
|
+
async function saveOverrides() {
|
|
104
|
+
const overrides = collectOverrides();
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch('/save', {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers: { 'Content-Type': 'application/json' },
|
|
110
|
+
body: JSON.stringify({ overrides })
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
const data = await response.json();
|
|
114
|
+
if (data.success) {
|
|
115
|
+
if (data.has_overrides) {
|
|
116
|
+
showOverrideStatus(data.timestamp);
|
|
117
|
+
}
|
|
118
|
+
alert('Saved successfully!' + (data.path ? '\\nPath: ' + data.path : ''));
|
|
119
|
+
}
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.error('Save failed:', error);
|
|
122
|
+
alert('Save failed: ' + error.message);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Download figure
|
|
127
|
+
function downloadFigure(format) {
|
|
128
|
+
window.location.href = '/download/' + format;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Restore to original programmatic style (clear manual overrides)
|
|
132
|
+
async function restoreOriginal() {
|
|
133
|
+
if (!confirm('Restore to original programmatic style? This will clear all manual overrides.')) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
document.body.classList.add('loading');
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
const response = await fetch('/restore', {
|
|
141
|
+
method: 'POST',
|
|
142
|
+
headers: { 'Content-Type': 'application/json' }
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const data = await response.json();
|
|
146
|
+
|
|
147
|
+
if (data.success) {
|
|
148
|
+
const img = document.getElementById('preview-image');
|
|
149
|
+
img.src = 'data:image/png;base64,' + data.image;
|
|
150
|
+
|
|
151
|
+
currentBboxes = data.bboxes;
|
|
152
|
+
|
|
153
|
+
// Reset form values to original style
|
|
154
|
+
if (data.original_style) {
|
|
155
|
+
for (const [key, value] of Object.entries(data.original_style)) {
|
|
156
|
+
const element = document.getElementById(key);
|
|
157
|
+
if (element) {
|
|
158
|
+
if (element.type === 'checkbox') {
|
|
159
|
+
element.checked = Boolean(value);
|
|
160
|
+
} else if (element.type === 'range') {
|
|
161
|
+
element.value = value;
|
|
162
|
+
const valueSpan = document.getElementById(key + '_value');
|
|
163
|
+
if (valueSpan) valueSpan.textContent = value;
|
|
164
|
+
} else {
|
|
165
|
+
element.value = value;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
clearSelection();
|
|
172
|
+
hideOverrideStatus();
|
|
173
|
+
loadHitmap();
|
|
174
|
+
}
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error('Restore failed:', error);
|
|
177
|
+
alert('Restore failed: ' + error.message);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
document.body.classList.remove('loading');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check and display override status
|
|
184
|
+
async function checkOverrideStatus() {
|
|
185
|
+
try {
|
|
186
|
+
const response = await fetch('/style');
|
|
187
|
+
const data = await response.json();
|
|
188
|
+
|
|
189
|
+
if (data.has_overrides) {
|
|
190
|
+
showOverrideStatus(data.manual_timestamp);
|
|
191
|
+
} else {
|
|
192
|
+
hideOverrideStatus();
|
|
193
|
+
}
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error('Failed to check override status:', error);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Show override status indicator
|
|
200
|
+
function showOverrideStatus(timestamp) {
|
|
201
|
+
const statusEl = document.getElementById('override-status');
|
|
202
|
+
const timestampEl = document.getElementById('override-timestamp');
|
|
203
|
+
|
|
204
|
+
if (statusEl) statusEl.style.display = 'flex';
|
|
205
|
+
|
|
206
|
+
if (timestampEl && timestamp) {
|
|
207
|
+
const date = new Date(timestamp);
|
|
208
|
+
timestampEl.textContent = 'Last modified: ' + date.toLocaleString();
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Hide override status indicator
|
|
213
|
+
function hideOverrideStatus() {
|
|
214
|
+
const statusEl = document.getElementById('override-status');
|
|
215
|
+
if (statusEl) statusEl.style.display = 'none';
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Update override status after save
|
|
219
|
+
async function updateOverrideStatusAfterSave(data) {
|
|
220
|
+
if (data.has_overrides) {
|
|
221
|
+
showOverrideStatus(data.timestamp);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
__all__ = ["SCRIPTS_API"]
|
|
227
|
+
|
|
228
|
+
# EOF
|