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:
Sidney Alcantara
2022-06-18 14:17:12 +10:00
5 changed files with 36 additions and 6 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "rowy",
"version": "2.6.0",
"version": "2.6.1",
"homepage": "https://rowy.io",
"repository": {
"type": "git",

View File

@@ -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);

View File

@@ -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")

View File

@@ -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",

View File

@@ -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);