Skip to content

Commit c621644

Browse files
committed
make it clear comparison value is a variable
1 parent 319785c commit c621644

File tree

4 files changed

+111
-2
lines changed

4 files changed

+111
-2
lines changed

src/messageTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export type LocalizedMessages = {
264264
comparisonTitleLabel: string;
265265
comparisonTitlePlaceholder: string;
266266
comparisonTitleHelp: string;
267+
comparisonValueHelp: string;
267268
comparisonFormatLabel: string;
268269
comparisonFormatHelp: string;
269270
};

src/notebooks/deepnote/converters/chartBigNumberBlockConverter.unit.test.ts

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,112 @@ suite('ChartBigNumberBlockConverter', () => {
267267
assert.doesNotHaveAnyKeys(block.metadata, [DEEPNOTE_VSCODE_RAW_CONTENT_KEY]);
268268
});
269269

270+
test('preserves comparison metadata when updating value', () => {
271+
const block: DeepnoteBlock = {
272+
blockGroup: 'test-group',
273+
content: 'old content',
274+
id: 'block-123',
275+
metadata: {
276+
deepnote_big_number_value: 'old_value',
277+
deepnote_big_number_title: 'My Number',
278+
deepnote_big_number_format: 'number',
279+
deepnote_big_number_comparison_enabled: true,
280+
deepnote_big_number_comparison_type: 'percentage-change',
281+
deepnote_big_number_comparison_value: 'baseline_value',
282+
deepnote_big_number_comparison_title: 'vs baseline',
283+
deepnote_big_number_comparison_format: 'percent'
284+
},
285+
sortingKey: 'a0',
286+
type: 'big-number'
287+
};
288+
const cell = new NotebookCellData(NotebookCellKind.Code, 'new_value', 'python');
289+
290+
converter.applyChangesToBlock(block, cell);
291+
292+
assert.strictEqual(block.content, '');
293+
assert.strictEqual(block.metadata?.deepnote_big_number_value, 'new_value');
294+
// Comparison metadata should be preserved
295+
assert.strictEqual(block.metadata?.deepnote_big_number_comparison_enabled, true);
296+
assert.strictEqual(block.metadata?.deepnote_big_number_comparison_type, 'percentage-change');
297+
assert.strictEqual(block.metadata?.deepnote_big_number_comparison_value, 'baseline_value');
298+
assert.strictEqual(block.metadata?.deepnote_big_number_comparison_title, 'vs baseline');
299+
assert.strictEqual(block.metadata?.deepnote_big_number_comparison_format, 'percent');
300+
});
301+
302+
test('round-trip: block with comparison → cell → block preserves comparison metadata', () => {
303+
// Start with a block that has comparison enabled
304+
const originalBlock: DeepnoteBlock = {
305+
blockGroup: 'test-group',
306+
content: '',
307+
id: 'block-123',
308+
metadata: {
309+
deepnote_big_number_value: 'revenue',
310+
deepnote_big_number_title: 'Revenue',
311+
deepnote_big_number_format: 'currency',
312+
deepnote_big_number_comparison_enabled: true,
313+
deepnote_big_number_comparison_type: 'percentage-change',
314+
deepnote_big_number_comparison_value: 'last_month_revenue',
315+
deepnote_big_number_comparison_title: 'vs last month',
316+
deepnote_big_number_comparison_format: 'percent'
317+
},
318+
sortingKey: 'a0',
319+
type: 'big-number'
320+
};
321+
322+
// Convert block to cell (simulating loading from file)
323+
const cell = converter.convertToCell(originalBlock);
324+
325+
// Manually add metadata like DeepnoteDataConverter does
326+
cell.metadata = {
327+
...originalBlock.metadata,
328+
id: originalBlock.id,
329+
type: originalBlock.type,
330+
sortingKey: originalBlock.sortingKey,
331+
blockGroup: originalBlock.blockGroup
332+
};
333+
334+
// Move pocket fields
335+
const pocket = {
336+
type: cell.metadata.type,
337+
sortingKey: cell.metadata.sortingKey,
338+
blockGroup: cell.metadata.blockGroup
339+
};
340+
delete cell.metadata.type;
341+
delete cell.metadata.sortingKey;
342+
delete cell.metadata.blockGroup;
343+
cell.metadata.__deepnotePocket = pocket;
344+
345+
// Now convert cell back to block (simulating execution)
346+
const reconstructedBlock: DeepnoteBlock = {
347+
blockGroup: pocket.blockGroup || 'default-group',
348+
content: cell.value,
349+
id: cell.metadata.id as string,
350+
metadata: { ...cell.metadata },
351+
sortingKey: pocket.sortingKey || 'a0',
352+
type: pocket.type || 'code'
353+
};
354+
355+
// Remove pocket and id from metadata
356+
if (reconstructedBlock.metadata) {
357+
delete reconstructedBlock.metadata.__deepnotePocket;
358+
delete reconstructedBlock.metadata.id;
359+
}
360+
361+
// Apply changes from cell (simulating user editing the value)
362+
converter.applyChangesToBlock(reconstructedBlock, cell);
363+
364+
// Verify all comparison metadata is preserved
365+
assert.ok(reconstructedBlock.metadata, 'Block metadata should exist');
366+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
367+
const metadata = reconstructedBlock.metadata!;
368+
assert.strictEqual(metadata.deepnote_big_number_value, 'revenue');
369+
assert.strictEqual(metadata.deepnote_big_number_comparison_enabled, true);
370+
assert.strictEqual(metadata.deepnote_big_number_comparison_type, 'percentage-change');
371+
assert.strictEqual(metadata.deepnote_big_number_comparison_value, 'last_month_revenue');
372+
assert.strictEqual(metadata.deepnote_big_number_comparison_title, 'vs last month');
373+
assert.strictEqual(metadata.deepnote_big_number_comparison_format, 'percent');
374+
});
375+
270376
test('handles empty content', () => {
271377
const block: DeepnoteBlock = {
272378
blockGroup: 'test-group',

src/platform/common/utils/localize.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,11 +926,12 @@ export namespace BigNumberComparison {
926926
export const comparisonTypeLabel = l10n.t('Comparison type');
927927
export const percentageChange = l10n.t('Percentage change');
928928
export const absoluteValue = l10n.t('Absolute value');
929-
export const comparisonValueLabel = l10n.t('Comparison value');
929+
export const comparisonValueLabel = l10n.t('Comparison value variable');
930930
export const comparisonValuePlaceholder = l10n.t('e.g., last_month_revenue');
931931
export const comparisonTitleLabel = l10n.t('Comparison title (optional)');
932932
export const comparisonTitlePlaceholder = l10n.t('e.g., vs last month');
933933
export const comparisonTitleHelp = l10n.t('You can use {{var}} syntax to reference variables');
934+
export const comparisonValueHelp = l10n.t('Enter a variable name (not a literal value)');
934935
export const comparisonFormatLabel = l10n.t('Comparison format (optional)');
935936
export const comparisonFormatHelp = l10n.t('Leave empty to use the same format as the main value');
936937
export const saveButton = l10n.t('Save');

src/webviews/webview-side/bigNumberComparisonSettings/BigNumberComparisonSettingsPanel.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export const BigNumberComparisonSettingsPanel: React.FC<IBigNumberComparisonSett
150150

151151
<div className="form-section">
152152
<label htmlFor="comparisonValue">
153-
{getLocString('comparisonValueLabel', 'Comparison value')}
153+
{getLocString('comparisonValueLabel', 'Comparison value variable')}
154154
</label>
155155
<input
156156
type="text"
@@ -159,6 +159,7 @@ export const BigNumberComparisonSettingsPanel: React.FC<IBigNumberComparisonSett
159159
onChange={handleComparisonValueChange}
160160
placeholder={getLocString('comparisonValuePlaceholder', 'e.g., last_month_revenue')}
161161
/>
162+
<div className="help-text">{getLocString('comparisonValueHelp', 'Enter a variable name')}</div>
162163
</div>
163164

164165
<div className="form-section">

0 commit comments

Comments
 (0)