diff --git a/web/ce/components/views/access-controller.tsx b/web/ce/components/views/access-controller.tsx new file mode 100644 index 000000000..8eefff027 --- /dev/null +++ b/web/ce/components/views/access-controller.tsx @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const AccessController = (props: any) => <>; diff --git a/web/ce/components/views/filters/access-filter.tsx b/web/ce/components/views/filters/access-filter.tsx new file mode 100644 index 000000000..8c3232d47 --- /dev/null +++ b/web/ce/components/views/filters/access-filter.tsx @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const FilterByAccess = (props: any) => <>; diff --git a/web/core/components/common/access-field.tsx b/web/core/components/common/access-field.tsx new file mode 100644 index 000000000..dd7606a3a --- /dev/null +++ b/web/core/components/common/access-field.tsx @@ -0,0 +1,44 @@ +import { LucideIcon } from "lucide-react"; +import { cn } from "@plane/editor"; +import { Tooltip } from "@plane/ui"; + +type Props = { + onChange: (value: number) => void; + value: number; + accessSpecifiers: { + key: number; + label: string; + icon: LucideIcon; + }[]; + isMobile?: boolean; +}; + +export const AccessField = (props: Props) => { + const { onChange, value, accessSpecifiers, isMobile = false } = props; + + return ( +
+ {accessSpecifiers.map((access, index) => ( + + + + ))} +
+ ); +}; diff --git a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx index 71beecdc5..b8dfede35 100644 --- a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx +++ b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/global-view-root.tsx @@ -16,6 +16,7 @@ import { CreateUpdateWorkspaceViewModal } from "@/components/workspace"; // constants import { GLOBAL_VIEW_UPDATED } from "@/constants/event-tracker"; import { EIssueFilterType, EIssuesStoreType } from "@/constants/issue"; +import { EViewAccess } from "@/constants/views"; import { DEFAULT_GLOBAL_VIEWS_LIST, EUserWorkspaceRoles } from "@/constants/workspace"; // hooks import { useEventTracker, useGlobalView, useIssues, useLabel, useUser } from "@/hooks/store"; @@ -138,6 +139,7 @@ export const GlobalViewsAppliedFiltersRoot = observer((props: Props) => { preLoadedData={{ name: `${viewDetails?.name} 2`, description: viewDetails?.description, + access: viewDetails?.access ?? EViewAccess.PUBLIC, ...viewFilters, }} /> diff --git a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/project-view-root.tsx b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/project-view-root.tsx index 71928239a..cb35cae84 100644 --- a/web/core/components/issues/issue-layouts/filters/applied-filters/roots/project-view-root.tsx +++ b/web/core/components/issues/issue-layouts/filters/applied-filters/roots/project-view-root.tsx @@ -13,6 +13,7 @@ import { CreateUpdateProjectViewModal } from "@/components/views"; import { UpdateViewComponent } from "@/components/views/update-view-component"; // constants import { EIssueFilterType, EIssuesStoreType } from "@/constants/issue"; +import { EViewAccess } from "@/constants/views"; import { EUserWorkspaceRoles } from "@/constants/workspace"; // hooks import { useIssues, useLabel, useProjectState, useProjectView, useUser } from "@/hooks/store"; @@ -121,6 +122,7 @@ export const ProjectViewAppliedFiltersRoot: React.FC = observer(() => { name: `${viewDetails?.name} 2`, description: viewDetails?.description, logo_props: viewDetails?.logo_props, + access: viewDetails?.access ?? EViewAccess.PUBLIC, ...viewFilters, }} /> diff --git a/web/core/components/pages/modals/page-form.tsx b/web/core/components/pages/modals/page-form.tsx index f945945f5..594c85c1a 100644 --- a/web/core/components/pages/modals/page-form.tsx +++ b/web/core/components/pages/modals/page-form.tsx @@ -5,12 +5,12 @@ import { FormEvent, useState } from "react"; import { FileText } from "lucide-react"; import { TPage } from "@plane/types"; // ui -import { Button, EmojiIconPicker, EmojiIconPickerTypes, Input, Tooltip } from "@plane/ui"; +import { Button, EmojiIconPicker, EmojiIconPickerTypes, Input } from "@plane/ui"; import { Logo } from "@/components/common"; // constants -import { PAGE_ACCESS_SPECIFIERS } from "@/constants/page"; +import { AccessField } from "@/components/common/access-field"; +import { EPageAccess, PAGE_ACCESS_SPECIFIERS } from "@/constants/page"; // helpers -import { cn } from "@/helpers/common.helper"; import { convertHexEmojiToDecimal } from "@/helpers/emoji.helper"; // hooks import { usePlatformOS } from "@/hooks/use-platform-os"; @@ -111,29 +111,12 @@ export const PageForm: React.FC = (props) => {
-
- {PAGE_ACCESS_SPECIFIERS.map((access, index) => ( - - - - ))} -
+ handleFormData("access", access)} + value={formData?.access ?? EPageAccess.PUBLIC} + accessSpecifiers={PAGE_ACCESS_SPECIFIERS} + isMobile={isMobile} + />
{PAGE_ACCESS_SPECIFIERS.find((access) => access.key === formData.access)?.label}
diff --git a/web/core/components/views/filters/filter-selection.tsx b/web/core/components/views/filters/filter-selection.tsx index 9278ec410..89877ee9f 100644 --- a/web/core/components/views/filters/filter-selection.tsx +++ b/web/core/components/views/filters/filter-selection.tsx @@ -7,6 +7,7 @@ import { FilterCreatedBy, FilterCreatedDate } from "@/components/common/filters" import { FilterOption } from "@/components/issues"; // constants import { EViewAccess } from "@/constants/views"; +import { FilterByAccess } from "@/plane-web/components/views/filters/access-filter"; type Props = { filters: TViewFilters; @@ -77,6 +78,17 @@ export const ViewFiltersSelection: React.FC = observer((props) => { />
+ {/* access / view type */} + handleFilters("view_type", val)} + searchQuery={filtersSearchQuery} + accessFilters={[ + { key: EViewAccess.PRIVATE, value: "Private" }, + { key: EViewAccess.PUBLIC, value: "Public" }, + ]} + /> + {/* created date */}
= { name: "", description: "", + access: EViewAccess.PUBLIC, display_properties: getComputedDisplayProperties(), display_filters: getComputedDisplayFilters(), }; @@ -102,6 +105,7 @@ export const ProjectViewForm: React.FC = observer((props) => { filters: formData.filters, display_filters: formData.display_filters, display_properties: formData.display_properties, + access: formData.access, } as IProjectView); reset({ @@ -216,6 +220,7 @@ export const ProjectViewForm: React.FC = observer((props) => { />
+ ) => Promise; @@ -26,6 +28,7 @@ type Props = { const defaultValues: Partial = { name: "", description: "", + access: EViewAccess.PUBLIC, display_properties: getComputedDisplayProperties(), display_filters: getComputedDisplayFilters(), }; @@ -150,7 +153,8 @@ export const WorkspaceViewForm: React.FC = observer((props) => { )} />
-
+
+