Skip to content

Commit a0ddfae

Browse files
authored
Merge pull request #1405 from rowyio/develop
Develop
2 parents ad218be + 0099bd1 commit a0ddfae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1620
-727
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"dependencies": {
1111
"@emotion/react": "^11.10.5",
1212
"@emotion/styled": "^11.10.5",
13+
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
1314
"@json2csv/plainjs": "^7.0.1",
1415
"@mdi/js": "^6.6.96",
1516
"@monaco-editor/react": "^4.4.4",
@@ -40,7 +41,7 @@
4041
"match-sorter": "^6.3.1",
4142
"material-ui-popup-state": "^4.0.1",
4243
"mdi-material-ui": "^7.3.0",
43-
"monaco-editor-auto-typings": "^0.4.0",
44+
"monaco-editor-auto-typings": "^0.4.3",
4445
"notistack": "^2.0.4",
4546
"path-browserify": "^1.0.1",
4647
"pb-util": "^1.0.3",

src/atoms/tableScope/table.ts

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
BulkWriteFunction,
1717
} from "@src/types/table";
1818
import { updateRowData } from "@src/utils/table";
19+
import { Table } from "@tanstack/react-table";
1920

2021
/** Root atom from which others are derived */
2122
export const tableIdAtom = atom("");
@@ -47,6 +48,8 @@ export const tableColumnsOrderedAtom = atom<ColumnConfig[]>((get) => {
4748
["desc", "asc"]
4849
);
4950
});
51+
/** Store the table */
52+
export const reactTableAtom = atom<Table<TableRow> | null>(null);
5053
/** Reducer function to convert from array of columns to columns object */
5154
export const tableColumnsReducer = (
5255
a: Record<string, ColumnConfig>,
@@ -59,6 +62,8 @@ export const tableColumnsReducer = (
5962

6063
/** Filters applied to the local view */
6164
export const tableFiltersAtom = atom<TableFilter[]>([]);
65+
/** Join operator applied to mulitple filters */
66+
export const tableFiltersJoinAtom = atom<"AND" | "OR">("AND");
6267
/** Sorts applied to the local view */
6368
export const tableSortsAtom = atom<TableSort[]>([]);
6469

src/atoms/tableScope/ui.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const columnMenuAtom = atom<{
4141
* ```
4242
*/
4343
export const columnModalAtom = atomWithHash<{
44-
type: "new" | "name" | "type" | "config";
44+
type: "new" | "name" | "type" | "config" | "setColumnWidth";
4545
columnKey?: string;
4646
index?: number;
4747
} | null>("columnModal", null, { replaceState: true });

src/components/CodeEditor/CodeEditor.tsx

+16-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import FullScreenButton from "@src/components/FullScreenButton";
1414
import { spreadSx } from "@src/utils/ui";
1515
import githubLightTheme from "@src/components/CodeEditor/github-light-default.json";
1616
import githubDarkTheme from "@src/components/CodeEditor/github-dark-default.json";
17+
import { AutoTypings, LocalStorageCache } from "monaco-editor-auto-typings";
1718

1819
export interface ICodeEditorProps
1920
extends Partial<EditorProps>,
@@ -47,7 +48,7 @@ export default function CodeEditor({
4748
extraLibs,
4849
diagnosticsOptions,
4950
onUnmount,
50-
defaultLanguage = "javascript",
51+
defaultLanguage = "typescript",
5152
...props
5253
}: ICodeEditorProps) {
5354
const theme = useTheme();
@@ -131,11 +132,22 @@ export default function CodeEditor({
131132
});
132133
});
133134
}}
134-
onMount={(editor) => {
135+
{...props}
136+
onMount={async (editor, monaco) => {
137+
if (props.onMount) {
138+
props.onMount(editor, monaco);
139+
}
135140
if (onFocus) editor.onDidFocusEditorWidget(onFocus);
136141
if (onBlur) editor.onDidBlurEditorWidget(onBlur);
142+
const autoTypings = await AutoTypings.create(editor, {
143+
monaco: monaco,
144+
sourceCache: new LocalStorageCache(),
145+
debounceDuration: 500, // ms
146+
onError: (e) => {
147+
console.log("Auto typing error", e);
148+
},
149+
});
137150
}}
138-
{...props}
139151
onValidate={onValidate_}
140152
theme={`github-${theme.palette.mode}`}
141153
options={{
@@ -149,6 +161,7 @@ export default function CodeEditor({
149161
fixedOverflowWidgets: true,
150162
tabSize: 2,
151163
...props.options,
164+
language: "typescript",
152165
}}
153166
/>
154167

src/components/CodeEditor/useMonacoCustomizations.ts

+78-21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useEffect } from "react";
22
import { useAtom } from "jotai";
3+
import { matchSorter } from "match-sorter";
34

45
import {
56
tableScope,
@@ -64,26 +65,26 @@ export default function useMonacoCustomizations({
6465
if (!monaco) return;
6566

6667
try {
67-
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
68+
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
6869
moduleResolution:
6970
monaco.languages.typescript.ModuleResolutionKind.NodeJs,
71+
module: monaco.languages.typescript.ModuleKind.CommonJS,
7072
target: monaco.languages.typescript.ScriptTarget.ES2020,
7173
allowNonTsExtensions: true,
74+
typeRoots: ["node_modules/@types"],
7275
});
73-
monaco.languages.typescript.javascriptDefaults.addExtraLib(firestoreDefs);
74-
monaco.languages.typescript.javascriptDefaults.addExtraLib(
76+
monaco.languages.typescript.typescriptDefaults.addExtraLib(firestoreDefs);
77+
monaco.languages.typescript.typescriptDefaults.addExtraLib(
7578
firebaseAuthDefs
7679
);
77-
monaco.languages.typescript.javascriptDefaults.addExtraLib(
80+
monaco.languages.typescript.typescriptDefaults.addExtraLib(
7881
firebaseStorageDefs
7982
);
80-
monaco.languages.typescript.javascriptDefaults.addExtraLib(
83+
monaco.languages.typescript.typescriptDefaults.addExtraLib(
8184
utilsDefs,
8285
"ts:filename/utils.d.ts"
8386
);
84-
monaco.languages.typescript.javascriptDefaults.addExtraLib(rowyUtilsDefs);
85-
86-
setLoggingReplacementActions();
87+
monaco.languages.typescript.typescriptDefaults.addExtraLib(rowyUtilsDefs);
8788
} catch (error) {
8889
console.error(
8990
"An error occurred during initialization of Monaco: ",
@@ -97,7 +98,7 @@ export default function useMonacoCustomizations({
9798
if (!monaco) return;
9899
if (!extraLibs) return;
99100
try {
100-
monaco.languages.typescript.javascriptDefaults.addExtraLib(
101+
monaco.languages.typescript.typescriptDefaults.addExtraLib(
101102
extraLibs.join("\n"),
102103
"ts:filename/extraLibs.d.ts"
103104
);
@@ -112,7 +113,7 @@ export default function useMonacoCustomizations({
112113
if (!monaco) return;
113114

114115
try {
115-
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
116+
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
116117
...JSON.parse(stringifiedDiagnosticsOptions),
117118
diagnosticCodesToIgnore: [
118119
1323, // remove dynamic import error
@@ -124,13 +125,13 @@ export default function useMonacoCustomizations({
124125
}
125126
}, [monaco, stringifiedDiagnosticsOptions]);
126127

127-
const setLoggingReplacementActions = () => {
128+
const setReplacementActions = () => {
128129
if (!monaco) return;
129130
const { dispose } = monaco.languages.registerCodeActionProvider(
130131
"javascript",
131132
{
132133
provideCodeActions: (model, range, context, token) => {
133-
const actions = context.markers
134+
const consoleLogReplacements = context.markers
134135
.filter((error) => {
135136
return error.message.includes("Rowy Cloud Logging");
136137
})
@@ -156,8 +157,63 @@ export default function useMonacoCustomizations({
156157
isPreferred: true,
157158
};
158159
});
160+
const secretNameReplacements = context.markers
161+
.filter((error) => {
162+
return error.message.includes(
163+
"is not assignable to parameter of type 'SecretNames'"
164+
);
165+
})
166+
.map((error) => {
167+
const typoSecretName = model
168+
.getLineContent(error.startLineNumber)
169+
.slice(error.startColumn, error.endColumn - 2);
170+
const similarSecretNames =
171+
matchSorter(secretNames.secretNames ?? [], typoSecretName) ??
172+
[];
173+
const otherSecretNames =
174+
secretNames.secretNames?.filter(
175+
(secretName) => !similarSecretNames.includes(secretName)
176+
) ?? [];
177+
return [
178+
...similarSecretNames.map((secretName) => ({
179+
title: `Replace with "${secretName}"`,
180+
diagnostics: [error],
181+
kind: "quickfix",
182+
edit: {
183+
edits: [
184+
{
185+
resource: model.uri,
186+
edit: {
187+
range: error,
188+
text: `"${secretName}"`,
189+
},
190+
},
191+
],
192+
},
193+
isPreferred: true,
194+
})),
195+
...otherSecretNames.map((secretName) => ({
196+
title: `Replace with "${secretName}"`,
197+
diagnostics: [error],
198+
kind: "quickfix",
199+
edit: {
200+
edits: [
201+
{
202+
resource: model.uri,
203+
edit: {
204+
range: error,
205+
text: `"${secretName}"`,
206+
},
207+
},
208+
],
209+
},
210+
isPreferred: false,
211+
})),
212+
];
213+
})
214+
.flat();
159215
return {
160-
actions: actions,
216+
actions: [...consoleLogReplacements, ...secretNameReplacements],
161217
dispose: () => {},
162218
};
163219
},
@@ -169,7 +225,6 @@ export default function useMonacoCustomizations({
169225
dispose();
170226
});
171227
};
172-
173228
const addJsonFieldDefinition = async (
174229
columnKey: string,
175230
interfaceName: string
@@ -178,11 +233,11 @@ export default function useMonacoCustomizations({
178233
.map((row) => row[columnKey])
179234
.filter((entry) => entry !== undefined)
180235
.map((entry) => JSON.stringify(entry));
181-
monaco?.languages.typescript.javascriptDefaults.addExtraLib(
236+
monaco?.languages.typescript.typescriptDefaults.addExtraLib(
182237
`type ${interfaceName} = any;`
183238
);
184239
// if (!samples || samples.length === 0) {
185-
// monaco?.languages.typescript.javascriptDefaults.addExtraLib(
240+
// monaco?.languages.typescript.typescriptDefaults.addExtraLib(
186241
// `type ${interfaceName} = any;`
187242
// );
188243
// return;
@@ -200,7 +255,7 @@ export default function useMonacoCustomizations({
200255
// rendererOptions: { "just-types": "true" },
201256
// });
202257
// const newLib = result.lines.join("\n").replaceAll("export ", "");
203-
// monaco?.languages.typescript.javascriptDefaults.addExtraLib(newLib);
258+
// monaco?.languages.typescript.typescriptDefaults.addExtraLib(newLib);
204259
//}
205260
};
206261

@@ -223,13 +278,13 @@ export default function useMonacoCustomizations({
223278
.map((key) => `"${key}"`)
224279
.join("|\n");
225280

226-
monaco?.languages.typescript.javascriptDefaults.addExtraLib(
281+
monaco?.languages.typescript.typescriptDefaults.addExtraLib(
227282
["/**", " * extensions type configuration", " */", extensionsDefs].join(
228283
"\n"
229284
),
230285
"ts:filename/extensions.d.ts"
231286
);
232-
monaco?.languages.typescript.javascriptDefaults.addExtraLib(
287+
monaco?.languages.typescript.typescriptDefaults.addExtraLib(
233288
[
234289
"// basic types that are used in all places",
235290
"declare var require: any;",
@@ -261,14 +316,16 @@ export default function useMonacoCustomizations({
261316
if (!secretNames.secretNames) return;
262317
const secretsDef = `type SecretNames = ${secretNames.secretNames
263318
.map((secret: string) => `"${secret}"`)
264-
.join(" | ")}
319+
.join(" | ")} \n
265320
enum secrets {
266321
${secretNames.secretNames
267-
.map((secret: string) => `${secret} = "${secret}"`)
322+
.map((secret: string) => `"${secret}" = "${secret}"`)
268323
.join("\n")}
269324
}
270325
`;
271326
monaco?.languages.typescript.javascriptDefaults.addExtraLib(secretsDef);
327+
328+
setReplacementActions();
272329
}, [monaco, secretNames]);
273330

274331
let boxSx: SystemStyleObject<Theme> = {

src/components/ColumnMenu/ColumnMenu.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from "@src/assets/icons";
2525
import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
2626
import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward";
27+
import StraightenIcon from "@mui/icons-material/Straighten";
2728
import EditIcon from "@mui/icons-material/EditOutlined";
2829
import SettingsIcon from "@mui/icons-material/SettingsOutlined";
2930
import EvalIcon from "@mui/icons-material/PlayCircleOutline";
@@ -59,6 +60,7 @@ import { getFieldProp } from "@src/components/fields";
5960
import { analytics, logEvent } from "@src/analytics";
6061
import {
6162
formatSubTableName,
63+
generateId,
6264
getTableBuildFunctionPathname,
6365
getTableSchemaPath,
6466
} from "@src/utils/table";
@@ -251,6 +253,7 @@ export default function ColumnMenu({
251253
: column.type
252254
)!.operators[0]?.value || "==",
253255
value: "",
256+
id: generateId(),
254257
},
255258
});
256259
handleClose();
@@ -263,6 +266,16 @@ export default function ColumnMenu({
263266
: column.type
264267
),
265268
},
269+
{
270+
key: "setColumnWidth",
271+
label: "Set Column Width",
272+
icon: <StraightenIcon />,
273+
onClick: () => {
274+
openColumnModal({ type: "setColumnWidth", columnKey: column.key });
275+
handleClose();
276+
},
277+
disabled: column.resizable === false,
278+
},
266279
];
267280

268281
const configActions: IMenuContentsProps["menuItems"] = [

src/components/ColumnModals/ColumnModals.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import NewColumnModal from "./NewColumnModal";
55
import NameChangeModal from "./NameChangeModal";
66
import TypeChangeModal from "./TypeChangeModal";
77
import ColumnConfigModal from "./ColumnConfigModal";
8+
import SetColumnWidthModal from "./SetColumnWidthModal";
89

910
import {
1011
tableScope,
@@ -40,5 +41,8 @@ export default function ColumnModals() {
4041
if (columnModal.type === "config")
4142
return <ColumnConfigModal onClose={onClose} column={column} />;
4243

44+
if (columnModal.type === "setColumnWidth")
45+
return <SetColumnWidthModal onClose={onClose} column={column} />;
46+
4347
return null;
4448
}

0 commit comments

Comments
 (0)