From f1879a404d0d9f73eedc76713e069d9a8a961cb1 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:12:54 +0530 Subject: [PATCH 1/2] dev: updated migrations for 0.13-dev (#2305) * chore: epoch migration batch size changed * chore: reoredered the migration files * dev: updated migrations for 0.13-dev * chore: added epoch field * dev: merged the migration files --- ..._alter_analyticview_created_by_and_more.py | 5 +- .../db/migrations/0045_auto_20230915_0655.py | 42 ---------- ...ch_workspacemember_issue_props_and_more.py | 79 +++++++++++++++++++ .../db/migrations/0046_auto_20230926_1015.py | 26 ------ .../db/migrations/0047_auto_20230926_1029.py | 44 ----------- ...er_workspacemember_issue_props_and_more.py | 24 ------ 6 files changed, 81 insertions(+), 139 deletions(-) delete mode 100644 apiserver/plane/db/migrations/0045_auto_20230915_0655.py create mode 100644 apiserver/plane/db/migrations/0045_issueactivity_epoch_workspacemember_issue_props_and_more.py delete mode 100644 apiserver/plane/db/migrations/0046_auto_20230926_1015.py delete mode 100644 apiserver/plane/db/migrations/0047_auto_20230926_1029.py delete mode 100644 apiserver/plane/db/migrations/0048_globalview_sort_order_workspacemember_issue_props_and_more.py diff --git a/apiserver/plane/db/migrations/0043_alter_analyticview_created_by_and_more.py b/apiserver/plane/db/migrations/0043_alter_analyticview_created_by_and_more.py index 950189c55..5a806c704 100644 --- a/apiserver/plane/db/migrations/0043_alter_analyticview_created_by_and_more.py +++ b/apiserver/plane/db/migrations/0043_alter_analyticview_created_by_and_more.py @@ -33,9 +33,8 @@ def create_issue_relation(apps, schema_editor): def update_issue_priority_choice(apps, schema_editor): IssueModel = apps.get_model("db", "Issue") updated_issues = [] - for obj in IssueModel.objects.all(): - if obj.priority is None: - obj.priority = "none" + for obj in IssueModel.objects.filter(priority=None): + obj.priority = "none" updated_issues.append(obj) IssueModel.objects.bulk_update(updated_issues, ["priority"], batch_size=100) diff --git a/apiserver/plane/db/migrations/0045_auto_20230915_0655.py b/apiserver/plane/db/migrations/0045_auto_20230915_0655.py deleted file mode 100644 index cd9aa6902..000000000 --- a/apiserver/plane/db/migrations/0045_auto_20230915_0655.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 4.2.3 on 2023-09-15 06:55 - -from django.db import migrations, models -from django.conf import settings -import django.db.models.deletion -import uuid - - -class Migration(migrations.Migration): - dependencies = [ - ("db", "0044_auto_20230913_0709"), - ] - - operations = [ - migrations.CreateModel( - name="GlobalView", - fields=[ - ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At"),), - ("updated_at", models.DateTimeField(auto_now=True, verbose_name="Last Modified At"),), - ("id", models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True,),), - ("name", models.CharField(max_length=255, verbose_name="View Name")), - ("description", models.TextField(blank=True, verbose_name="View Description"),), - ("query", models.JSONField(verbose_name="View Query")), - ("access", models.PositiveSmallIntegerField(choices=[(0, "Private"), (1, "Public")], default=1),), - ("query_data", models.JSONField(default=dict)), - ("created_by", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="%(class)s_created_by", to=settings.AUTH_USER_MODEL, verbose_name="Created By",),), - ("updated_by", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="%(class)s_updated_by", to=settings.AUTH_USER_MODEL, verbose_name="Last Modified By",),), - ("workspace", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="global_views", to="db.workspace",),), - ], - options={ - "verbose_name": "Global View", - "verbose_name_plural": "Global Views", - "db_table": "global_views", - "ordering": ("-created_at",), - }, - ), - migrations.AddField( - model_name="issueactivity", - name="epoch", - field=models.FloatField(null=True), - ), - ] diff --git a/apiserver/plane/db/migrations/0045_issueactivity_epoch_workspacemember_issue_props_and_more.py b/apiserver/plane/db/migrations/0045_issueactivity_epoch_workspacemember_issue_props_and_more.py new file mode 100644 index 000000000..4b9c1b1eb --- /dev/null +++ b/apiserver/plane/db/migrations/0045_issueactivity_epoch_workspacemember_issue_props_and_more.py @@ -0,0 +1,79 @@ +# Generated by Django 4.2.5 on 2023-09-29 10:14 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import plane.db.models.workspace +import uuid + + +def update_issue_activity_priority(apps, schema_editor): + IssueActivity = apps.get_model("db", "IssueActivity") + updated_issue_activity = [] + for obj in IssueActivity.objects.filter(field="priority"): + # Set the old and new value to none if it is empty for Priority + obj.new_value = obj.new_value or "none" + obj.old_value = obj.old_value or "none" + updated_issue_activity.append(obj) + IssueActivity.objects.bulk_update( + updated_issue_activity, + ["new_value", "old_value"], + batch_size=2000, + ) + +def update_issue_activity_blocked(apps, schema_editor): + IssueActivity = apps.get_model("db", "IssueActivity") + updated_issue_activity = [] + for obj in IssueActivity.objects.filter(field="blocks"): + # Set the field to blocked_by + obj.field = "blocked_by" + updated_issue_activity.append(obj) + IssueActivity.objects.bulk_update( + updated_issue_activity, + ["field"], + batch_size=1000, + ) + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0044_auto_20230913_0709'), + ] + + operations = [ + migrations.CreateModel( + name='GlobalView', + fields=[ + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Modified At')), + ('id', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('name', models.CharField(max_length=255, verbose_name='View Name')), + ('description', models.TextField(blank=True, verbose_name='View Description')), + ('query', models.JSONField(verbose_name='View Query')), + ('access', models.PositiveSmallIntegerField(choices=[(0, 'Private'), (1, 'Public')], default=1)), + ('query_data', models.JSONField(default=dict)), + ('sort_order', models.FloatField(default=65535)), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created_by', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), + ('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Last Modified By')), + ('workspace', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='global_views', to='db.workspace')), + ], + options={ + 'verbose_name': 'Global View', + 'verbose_name_plural': 'Global Views', + 'db_table': 'global_views', + 'ordering': ('-created_at',), + }, + ), + migrations.AddField( + model_name='workspacemember', + name='issue_props', + field=models.JSONField(default=plane.db.models.workspace.get_issue_props), + ), + migrations.AddField( + model_name='issueactivity', + name='epoch', + field=models.FloatField(null=True), + ), + migrations.RunPython(update_issue_activity_priority), + migrations.RunPython(update_issue_activity_blocked), + ] diff --git a/apiserver/plane/db/migrations/0046_auto_20230926_1015.py b/apiserver/plane/db/migrations/0046_auto_20230926_1015.py deleted file mode 100644 index 8bce37d95..000000000 --- a/apiserver/plane/db/migrations/0046_auto_20230926_1015.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-26 10:15 - -from django.db import migrations - - -def update_issue_activity(apps, schema_editor): - IssueActivity = apps.get_model("db", "IssueActivity") - updated_issue_activity = [] - for obj in IssueActivity.objects.all(): - obj.epoch = int(obj.created_at.timestamp()) - updated_issue_activity.append(obj) - IssueActivity.objects.bulk_update( - updated_issue_activity, - ["epoch"], - batch_size=5000, - ) - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0045_auto_20230915_0655'), - ] - - operations = [ - migrations.RunPython(update_issue_activity), - ] diff --git a/apiserver/plane/db/migrations/0047_auto_20230926_1029.py b/apiserver/plane/db/migrations/0047_auto_20230926_1029.py deleted file mode 100644 index da64e11c8..000000000 --- a/apiserver/plane/db/migrations/0047_auto_20230926_1029.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-26 10:29 - -from django.db import migrations - - -def update_issue_activity_priority(apps, schema_editor): - IssueActivity = apps.get_model("db", "IssueActivity") - updated_issue_activity = [] - for obj in IssueActivity.objects.filter(field="priority"): - # Set the old and new value to none if it is empty for Priority - obj.new_value = obj.new_value or "none" - obj.old_value = obj.old_value or "none" - updated_issue_activity.append(obj) - IssueActivity.objects.bulk_update( - updated_issue_activity, - ["new_value", "old_value"], - batch_size=1000, - ) - -def update_issue_activity_blocked(apps, schema_editor): - IssueActivity = apps.get_model("db", "IssueActivity") - updated_issue_activity = [] - for obj in IssueActivity.objects.filter(field="blocks"): - # Set the field to blocked_by - obj.field = "blocked_by" - updated_issue_activity.append(obj) - IssueActivity.objects.bulk_update( - updated_issue_activity, - ["field"], - batch_size=1000, - ) - - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0046_auto_20230926_1015'), - ] - - operations = [ - migrations.RunPython(update_issue_activity_priority), - migrations.RunPython(update_issue_activity_blocked), - ] diff --git a/apiserver/plane/db/migrations/0048_globalview_sort_order_workspacemember_issue_props_and_more.py b/apiserver/plane/db/migrations/0048_globalview_sort_order_workspacemember_issue_props_and_more.py deleted file mode 100644 index 3084ef637..000000000 --- a/apiserver/plane/db/migrations/0048_globalview_sort_order_workspacemember_issue_props_and_more.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-27 11:18 - -from django.db import migrations, models -import plane.db.models.workspace - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0047_auto_20230926_1029'), - ] - - operations = [ - migrations.AddField( - model_name='globalview', - name='sort_order', - field=models.FloatField(default=65535), - ), - migrations.AddField( - model_name='workspacemember', - name='issue_props', - field=models.JSONField(default=plane.db.models.workspace.get_issue_props), - ), - ] From 4cab00ec79b393ace63d435a52621b5d5c9d65af Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:40:02 +0530 Subject: [PATCH 2/2] fix: workspace view filters count fix (#2307) --- .../core/filters/workspace-filters-list.tsx | 2 - web/components/views/single-view-item.tsx | 64 +++++----- .../views/single-workspace-view-item.tsx | 110 ++++++++++++++++++ .../projects/[projectId]/views/index.tsx | 1 - .../[workspaceSlug]/workspace-views/index.tsx | 5 +- 5 files changed, 138 insertions(+), 44 deletions(-) create mode 100644 web/components/workspace/views/single-workspace-view-item.tsx diff --git a/web/components/core/filters/workspace-filters-list.tsx b/web/components/core/filters/workspace-filters-list.tsx index dafab6e9d..0b31ae7f5 100644 --- a/web/components/core/filters/workspace-filters-list.tsx +++ b/web/components/core/filters/workspace-filters-list.tsx @@ -299,8 +299,6 @@ export const WorkspaceFiltersList: React.FC = ({ : key === "project" ? filters.project?.map((projectId) => { const currentProject = project?.find((p) => p.id === projectId); - console.log("currentProject", currentProject); - console.log("currentProject", projectId); return (

void; handleDeleteView: () => void; }; -export const SingleViewItem: React.FC = ({ - view, - viewType, - handleEditView, - handleDeleteView, -}) => { +export const SingleViewItem: React.FC = ({ view, handleEditView, handleDeleteView }) => { const router = useRouter(); const { workspaceSlug, projectId } = router.query; @@ -88,10 +81,7 @@ export const SingleViewItem: React.FC = ({ }); }; - const viewRedirectionUrl = - viewType === "project" - ? `/${workspaceSlug}/projects/${projectId}/views/${view.id}` - : `/${workspaceSlug}/workspace-views/issues?globalViewId=${view.id}`; + const viewRedirectionUrl = `/${workspaceSlug}/projects/${projectId}/views/${view.id}`; return (

@@ -126,31 +116,29 @@ export const SingleViewItem: React.FC = ({ filters

- {viewType === "project" ? ( - view.is_favorite ? ( - - ) : ( - - ) - ) : null} + {view.is_favorite ? ( + + ) : ( + + )} { diff --git a/web/components/workspace/views/single-workspace-view-item.tsx b/web/components/workspace/views/single-workspace-view-item.tsx new file mode 100644 index 000000000..fd153bdfc --- /dev/null +++ b/web/components/workspace/views/single-workspace-view-item.tsx @@ -0,0 +1,110 @@ +import React from "react"; + +import Link from "next/link"; +import { useRouter } from "next/router"; + +// icons +import { TrashIcon, PencilIcon } from "@heroicons/react/24/outline"; +import { PhotoFilterOutlined } from "@mui/icons-material"; +//components +import { CustomMenu } from "components/ui"; +import { IWorkspaceView } from "types/workspace-views"; +// helpers +import { truncateText } from "helpers/string.helper"; + +type Props = { + view: IWorkspaceView; + handleEditView: () => void; + handleDeleteView: () => void; +}; + +export const SingleWorkspaceViewItem: React.FC = ({ + view, + handleEditView, + handleDeleteView, +}) => { + const router = useRouter(); + const { workspaceSlug } = router.query; + + const viewRedirectionUrl = `/${workspaceSlug}/workspace-views/issues?globalViewId=${view.id}`; + + return ( +
+ + +
+
+
+ +
+
+

+ {truncateText(view.name, 75)} +

+ {view?.description && ( +

{view.description}

+ )} +
+
+
+
+

+ {view.query_data.filters && Object.keys(view.query_data.filters).length > 0 + ? `${Object.keys(view.query_data.filters) + .map((key: string) => + view.query_data.filters[key as keyof typeof view.query_data.filters] !== + null + ? isNaN( + ( + view.query_data.filters[ + key as keyof typeof view.query_data.filters + ] as any + ).length + ) + ? 0 + : ( + view.query_data.filters[ + key as keyof typeof view.query_data.filters + ] as any + ).length + : 0 + ) + .reduce((curr, prev) => curr + prev, 0)} filters` + : "0 filters"} +

+ + { + e.preventDefault(); + e.stopPropagation(); + handleEditView(); + }} + > + + + Edit View + + + { + e.preventDefault(); + e.stopPropagation(); + handleDeleteView(); + }} + > + + + Delete View + + + +
+
+
+
+ +
+ ); +}; diff --git a/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx b/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx index c75cdd320..9a5511037 100644 --- a/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx +++ b/web/pages/[workspaceSlug]/projects/[projectId]/views/index.tsx @@ -107,7 +107,6 @@ const ProjectViews: NextPage = () => { handleEditView(view)} handleDeleteView={() => handleDeleteView(view)} /> diff --git a/web/pages/[workspaceSlug]/workspace-views/index.tsx b/web/pages/[workspaceSlug]/workspace-views/index.tsx index a03393e1d..5e1ef61a8 100644 --- a/web/pages/[workspaceSlug]/workspace-views/index.tsx +++ b/web/pages/[workspaceSlug]/workspace-views/index.tsx @@ -11,7 +11,7 @@ import workspaceService from "services/workspace.service"; // layouts import { WorkspaceAuthorizationLayout } from "layouts/auth-layout"; // components -import { SingleViewItem } from "components/views"; +import { SingleWorkspaceViewItem } from "components/workspace/views/single-workspace-view-item"; import { WorkspaceIssuesViewOptions } from "components/issues/workspace-views/workspace-issue-view-option"; import { CreateUpdateWorkspaceViewModal } from "components/workspace/views/modal"; import { DeleteWorkspaceViewModal } from "components/workspace/views/delete-workspace-view-modal"; @@ -169,10 +169,9 @@ const WorkspaceViews: NextPage = () => { filteredOptions.length > 0 ? (
{filteredOptions.map((view) => ( - handleEditView(view)} handleDeleteView={() => handleDeleteView(view)} />