mirror of
https://github.com/rowyio/rowy.git
synced 2025-12-29 00:16:39 +01:00
Merge branch 'develop' into rc
* develop: bump version number fix date filters crashing when value is null fix read only rule suggestion filter by value
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "rowy",
|
||||
"version": "2.6.0",
|
||||
"version": "2.6.1",
|
||||
"homepage": "https://rowy.io",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
} from "@src/assets/icons";
|
||||
import DeleteIcon from "@mui/icons-material/DeleteOutlined";
|
||||
import OpenIcon from "@mui/icons-material/OpenInNewOutlined";
|
||||
import FilterIcon from "@mui/icons-material/FilterList";
|
||||
|
||||
import ContextMenuItem, { IContextMenuItem } from "./ContextMenuItem";
|
||||
|
||||
@@ -32,6 +33,7 @@ import {
|
||||
addRowAtom,
|
||||
deleteRowAtom,
|
||||
updateFieldAtom,
|
||||
tableFiltersPopoverAtom,
|
||||
} from "@src/atoms/tableScope";
|
||||
import { FieldType } from "@src/constants/fields";
|
||||
|
||||
@@ -52,6 +54,10 @@ export default function MenuContents({ onClose }: IMenuContentsProps) {
|
||||
const addRow = useSetAtom(addRowAtom, tableScope);
|
||||
const deleteRow = useSetAtom(deleteRowAtom, tableScope);
|
||||
const updateField = useSetAtom(updateFieldAtom, tableScope);
|
||||
const openTableFiltersPopover = useSetAtom(
|
||||
tableFiltersPopoverAtom,
|
||||
tableScope
|
||||
);
|
||||
|
||||
if (!tableSchema.columns || !selectedCell) return null;
|
||||
|
||||
@@ -78,6 +84,7 @@ export default function MenuContents({ onClose }: IMenuContentsProps) {
|
||||
|
||||
// Cell actions
|
||||
// TODO: Add copy and paste here
|
||||
const cellValue = row?.[selectedCell.columnKey];
|
||||
const handleClearValue = () =>
|
||||
updateField({
|
||||
path: selectedCell.path,
|
||||
@@ -85,6 +92,17 @@ export default function MenuContents({ onClose }: IMenuContentsProps) {
|
||||
value: null,
|
||||
deleteField: true,
|
||||
});
|
||||
const columnFilters = getFieldProp("filter", selectedColumn.type);
|
||||
const handleFilterValue = () => {
|
||||
openTableFiltersPopover({
|
||||
defaultQuery: {
|
||||
key: selectedColumn.fieldName,
|
||||
operator: columnFilters!.operators[0]?.value || "==",
|
||||
value: cellValue,
|
||||
},
|
||||
});
|
||||
onClose();
|
||||
};
|
||||
const cellActions = [
|
||||
{
|
||||
label: altPress ? "Clear value" : "Clear value…",
|
||||
@@ -93,7 +111,7 @@ export default function MenuContents({ onClose }: IMenuContentsProps) {
|
||||
disabled:
|
||||
selectedColumn.editable === false ||
|
||||
!row ||
|
||||
row[selectedCell.columnKey] === undefined ||
|
||||
cellValue ||
|
||||
getFieldProp("group", selectedColumn.type) === "Auditing",
|
||||
onClick: altPress
|
||||
? handleClearValue
|
||||
@@ -108,6 +126,12 @@ export default function MenuContents({ onClose }: IMenuContentsProps) {
|
||||
onClose();
|
||||
},
|
||||
},
|
||||
{
|
||||
label: "Filter value",
|
||||
icon: <FilterIcon />,
|
||||
disabled: !columnFilters || cellValue === undefined,
|
||||
onClick: handleFilterValue,
|
||||
},
|
||||
];
|
||||
actionGroups.push(cellActions);
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ export default function SuggestedRules({
|
||||
name: ["collection", "roles", "readOnly"],
|
||||
} as any);
|
||||
const [collection, roles, readOnly] = Array.isArray(watched) ? watched : [];
|
||||
|
||||
const [customized, setCustomized] = useState<boolean>(false);
|
||||
const [customizations, setCustomizations] = useState<customizationOptions[]>(
|
||||
[]
|
||||
@@ -51,6 +50,12 @@ export default function SuggestedRules({
|
||||
allow read, write: if hasAnyRole(${
|
||||
readOnly ? `["ADMIN"]` : JSON.stringify(roles)
|
||||
});${
|
||||
readOnly && roles.filter((r: string) => r !== "ADMIN").length > 0
|
||||
? `\n allow read: if hasAnyRole(${JSON.stringify(
|
||||
roles.filter((r: string) => r !== "ADMIN")
|
||||
)});`
|
||||
: ""
|
||||
}${
|
||||
customizations.includes("allRead")
|
||||
? "\n allow read: if true;"
|
||||
: customizations.includes("authRead")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { useAtom } from "jotai";
|
||||
import useMemoValue from "use-memo-value";
|
||||
import { isEmpty } from "lodash-es";
|
||||
import { isEmpty, isDate } from "lodash-es";
|
||||
|
||||
import {
|
||||
Tab,
|
||||
@@ -42,9 +42,9 @@ import type { TableFilter } from "@src/types/table";
|
||||
|
||||
const shouldDisableApplyButton = (value: any) =>
|
||||
isEmpty(value) &&
|
||||
!isDate(value) &&
|
||||
typeof value !== "boolean" &&
|
||||
typeof value !== "number" &&
|
||||
typeof value !== "object";
|
||||
typeof value !== "number";
|
||||
|
||||
enum FilterType {
|
||||
yourFilter = "local_filter",
|
||||
|
||||
@@ -347,6 +347,7 @@ export const tableFiltersToFirestoreFilters = (filters: TableFilter[]) => {
|
||||
|
||||
for (const filter of filters) {
|
||||
if (filter.operator.startsWith("date-")) {
|
||||
if (!filter.value) continue;
|
||||
const filterDate =
|
||||
"toDate" in filter.value ? filter.value.toDate() : filter.value;
|
||||
const [startDate, endDate] = getDateRange(filterDate);
|
||||
|
||||
Reference in New Issue
Block a user