Skip to content

Commit b288d5f

Browse files
committed
feat: Add position argument to renderer methods.
1 parent 0e2d4bc commit b288d5f

File tree

6 files changed

+64
-38
lines changed

6 files changed

+64
-38
lines changed

e2e/basic.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,18 @@ test('escape key', async ({ page }) => {
160160
expect(await a1.locator('.gs-cell-rendered').textContent()).toBe('Change1');
161161
expect(await largeEditor.inputValue()).toBe('Change1');
162162
});
163+
164+
test('rendered cell', async ({ page }) => {
165+
const largeEditor = page.locator('.gs-formula-bar textarea');
166+
await page.goto('http://localhost:5233/iframe.html?id=basic--render-to-kanji&viewMode=story');
167+
const c5 = page.locator("[data-address='C5']");
168+
await c5.click();
169+
expect(await c5.locator('.gs-cell-rendered').textContent()).toBe('五〇〇');
170+
expect(await largeEditor.inputValue()).toBe('500');
171+
172+
// undefined renderer
173+
const a9 = page.locator("[data-address='A9']");
174+
await a9.click();
175+
expect(await a9.locator('.gs-cell-rendered').textContent()).toBe('A9');
176+
expect(await largeEditor.inputValue()).toBe('');
177+
});

packages/react-core/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ export type {
3030
HeadersType,
3131
HistoryType,
3232
StoreType,
33+
PointType,
34+
AreaType,
35+
ZoneType,
3336
} from './types';
3437

3538
export type { Dispatcher } from './store';

packages/react-core/renderers/core.ts

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ type Props = {
1818
};
1919

2020
export interface RendererMixinType {
21-
render?(value: any, table: UserTable, writer?: WriterType): any;
21+
render?(value: any, table: UserTable, writer?: WriterType, position?: PointType): any;
2222
stringify?(cell: CellType): string;
23-
string?(value: string, table: UserTable, writer?: WriterType): any;
24-
bool?(value: boolean, writer?: WriterType): any;
25-
number?(value: number, writer?: WriterType): any;
26-
date?(value: Date, writer?: WriterType): any;
27-
timedelta?(value: TimeDelta, writer?: WriterType): any;
28-
array?(value: any[], writer?: WriterType): any;
29-
object?(value: any, writer?: WriterType): any;
30-
null?(value: null, writer?: WriterType): any;
31-
undefined?(value: undefined, writer?: WriterType): any;
23+
string?(value: string, table: UserTable, writer?: WriterType, position?: PointType): any;
24+
bool?(value: boolean, writer?: WriterType, position?: PointType): any;
25+
number?(value: number, writer?: WriterType, position?: PointType): any;
26+
date?(value: Date, writer?: WriterType, position?: PointType): any;
27+
timedelta?(value: TimeDelta, writer?: WriterType, position?: PointType): any;
28+
array?(value: any[], writer?: WriterType, position?: PointType): any;
29+
object?(value: any, writer?: WriterType, position?: PointType): any;
30+
null?(value: null, writer?: WriterType, position?: PointType): any;
31+
undefined?(value: undefined, writer?: WriterType, position?: PointType): any;
3232
}
3333

3434
export class Renderer implements RendererMixinType {
@@ -64,50 +64,50 @@ export class Renderer implements RendererMixinType {
6464
const address = p2a(point);
6565
const cache = table.getSolvedCache(address);
6666
const value = cache || table.getByPoint(point)?.value;
67-
return this.render(value, table, writer);
67+
return this.render(value, table, writer, point);
6868
}
6969

70-
public render(value: any, table: Table, writer?: WriterType): any {
70+
public render(value: any, table: Table, writer?: WriterType, position?: PointType): any {
7171
if (this.condition && !this.condition(value)) {
7272
return this.complement ? this.complement(value) : this.stringify({ value });
7373
}
7474

7575
switch (typeof value) {
7676
case 'object':
7777
if (value instanceof Date) {
78-
return this.date(value, writer);
78+
return this.date(value, writer, position);
7979
}
8080
if (value instanceof TimeDelta) {
81-
return this.timedelta(value, writer);
81+
return this.timedelta(value, writer, position);
8282
}
8383
if (value == null) {
84-
return this.null(value, writer);
84+
return this.null(value, writer, position);
8585
}
8686
if (value instanceof Table) {
87-
return this.render(value.getByPoint({ y: value.top, x: value.left })?.value, table, writer);
87+
return this.render(value.getByPoint({ y: value.top, x: value.left })?.value, table, writer, position);
8888
}
8989
if (Array.isArray(value)) {
90-
return this.array(value, writer);
90+
return this.array(value, writer, position);
9191
}
9292
if (value instanceof FormulaError) {
9393
throw value;
9494
}
95-
return this.object(value, writer);
95+
return this.object(value, writer, position);
9696
case 'string':
97-
return this.string(value, table, writer);
97+
return this.string(value, table, writer, position);
9898
case 'number':
99-
return this.number(value, writer);
99+
return this.number(value, writer, position);
100100
case 'boolean':
101-
return this.bool(value, writer);
101+
return this.bool(value, writer, position);
102102
case 'undefined':
103-
return this.undefined(value, writer);
103+
return this.undefined(value, writer, position);
104104
case 'function':
105105
return value() as string;
106106
}
107107
return '';
108108
}
109109

110-
stringify(cell: CellType): string {
110+
stringify(cell: CellType, position?: PointType): string {
111111
const { value } = cell;
112112
if (value instanceof Date) {
113113
return this.date(value);
@@ -122,7 +122,7 @@ export class Renderer implements RendererMixinType {
122122
return value.toString();
123123
}
124124

125-
string(value: string, table: Table, writer?: WriterType): any {
125+
string(value: string, table: Table, writer?: WriterType, position?: PointType): any {
126126
if (value[0] === "'") {
127127
return value.substring(1);
128128
}
@@ -145,41 +145,41 @@ export class Renderer implements RendererMixinType {
145145
return value;
146146
}
147147

148-
bool(value: boolean, writer?: WriterType): any {
148+
bool(value: boolean, writer?: WriterType, position?: PointType): any {
149149
return value ? 'TRUE' : 'FALSE';
150150
}
151151

152-
number(value: number, writer?: WriterType): any {
152+
number(value: number, writer?: WriterType, position?: PointType): any {
153153
if (isNaN(value)) {
154154
return 'NaN';
155155
}
156156
return value;
157157
}
158158

159-
date(value: Date, writer?: WriterType): any {
159+
date(value: Date, writer?: WriterType, position?: PointType): any {
160160
if (value.getHours() + value.getMinutes() + value.getSeconds() === 0) {
161161
return dayjs(value).format(this.dateFormat);
162162
}
163163
return dayjs(value).format(this.datetimeFormat);
164164
}
165165

166-
timedelta(value: TimeDelta, writer?: WriterType): any {
166+
timedelta(value: TimeDelta, writer?: WriterType, position?: PointType): any {
167167
return value.stringify(this.timeDeltaFormat);
168168
}
169169

170-
array(value: any[], writer?: WriterType): any {
170+
array(value: any[], writer?: WriterType, position?: PointType): any {
171171
return value.map((v) => this.stringify({ value: v })).join(',');
172172
}
173173

174-
object(value: any, writer?: WriterType): any {
174+
object(value: any, writer?: WriterType, position?: PointType): any {
175175
return JSON.stringify(value);
176176
}
177177

178-
null(value: any, writer?: WriterType): any {
178+
null(value: any, writer?: WriterType, position?: PointType): any {
179179
return '';
180180
}
181181

182-
undefined(value: undefined, writer?: WriterType): any {
182+
undefined(value: undefined, writer?: WriterType, position?: PointType): any {
183183
return '';
184184
}
185185
}

packages/react-right-menu/right-menu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export const SideMenuItems = () => {
3636
const { largeEditorRef, mainRef } = store;
3737

3838
return (
39-
<div
40-
className={`gs-rightmenu-main`}
39+
<div
40+
className={`gs-rightmenu-main`}
4141
data-mode={store.mode}
4242
style={{
4343
maxHeight: (largeEditorRef.current?.clientHeight ?? 0) + (mainRef.current?.clientHeight ?? 0) + 2,

packages/storybook/stories/basic/renderer.stories.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
Renderer,
66
RendererMixinType,
77
CheckboxRendererMixin,
8+
PointType,
9+
p2a,
810
} from '@gridsheet/react-core';
911

1012
export default {
@@ -25,6 +27,15 @@ const kanjiMap: { [s: string]: string } = {
2527
'.': '.',
2628
};
2729

30+
const NullMixin: RendererMixinType = {
31+
null(value: null, writer?: any, position?: PointType) {
32+
return <span style={{ opacity: 0.3 }}>{p2a(position)}</span>;
33+
},
34+
undefined(value: null, writer?: any, position?: PointType) {
35+
return <span style={{ opacity: 0.3 }}>{p2a(position)}</span>;
36+
},
37+
};
38+
2839
const KanjiRendererMixin: RendererMixinType = {
2940
number(value: number): string {
3041
const minus = value < 0;
@@ -68,7 +79,7 @@ export const RenderToKanji = () => {
6879
options={{
6980
renderers: {
7081
kanji: new Renderer({
71-
mixins: [KanjiRendererMixin, CheckboxRendererMixin],
82+
mixins: [KanjiRendererMixin, CheckboxRendererMixin, NullMixin],
7283
}),
7384
},
7485
}}

packages/storybook/stories/plugin/menu.stories.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ const Sheet = ({ numRows, numCols, defaultWidth, initialCells }: Props) => {
3333
</RightMenuComponent>
3434
<br />
3535

36-
3736
<RightMenuComponent>
3837
<GridSheet
3938
options={{
@@ -67,8 +66,6 @@ const Sheet = ({ numRows, numCols, defaultWidth, initialCells }: Props) => {
6766
/>
6867
</RightMenuComponent>
6968
<br />
70-
71-
7269
</div>
7370
);
7471
};

0 commit comments

Comments
 (0)