Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support status in filter method for task #66

Merged
merged 3 commits into from Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/i18/en.ts
Expand Up @@ -39,12 +39,14 @@ export class En implements Local {
form_datasource_filter_type_none = "None";
form_datasource_filter_type_status_is = "Status Is";
form_datasource_filter_type_contains_any_tag = "Contains Any Tag";
form_datasource_filter_type_status_in = "Status In";

form_datasource_filter_task_none = "None";
form_datasource_filter_task_status_completed = "Completed";
form_datasource_filter_task_status_fully_completed = "Fully completed";
form_datasource_filter_task_status_any = "Any Status";
form_datasource_filter_task_status_incomplete = "Incomplete";
form_datasource_filter_task_status_canceled = "Canceled";
form_datasource_filter_contains_tag = "Contains Any Tag";
form_datasource_filter_contains_tag_input_placeholder = "Please input tag, such as #todo";
form_datasource_filter_customize = "Customize";
Expand Down
2 changes: 2 additions & 0 deletions src/i18/types.ts
Expand Up @@ -38,12 +38,14 @@ export interface Local {
form_datasource_filter_type_none: string;
form_datasource_filter_type_status_is: string;
form_datasource_filter_type_contains_any_tag: string;
form_datasource_filter_type_status_in: string;

form_datasource_filter_task_none: string;
form_datasource_filter_task_status_completed: string;
form_datasource_filter_task_status_fully_completed: string;
form_datasource_filter_task_status_any: string;
form_datasource_filter_task_status_incomplete: string;
form_datasource_filter_task_status_canceled: string;
form_datasource_filter_contains_tag: string;
form_datasource_filter_contains_tag_input_placeholder: string;

Expand Down
2 changes: 2 additions & 0 deletions src/i18/zh.ts
Expand Up @@ -38,10 +38,12 @@ export class Zh implements Local {
form_datasource_filter_type_none = "无";
form_datasource_filter_type_status_is = "状态等于";
form_datasource_filter_type_contains_any_tag = "包含任意标签";
form_datasource_filter_type_status_in = "包含任意一个状态";

form_datasource_filter_task_none = "无";
form_datasource_filter_task_status_completed = "已完成(不包含子任务)";
form_datasource_filter_task_status_fully_completed = "已完成(包含子任务)";
form_datasource_filter_task_status_canceled = "已取消";
form_datasource_filter_task_status_any = "任意状态";
form_datasource_filter_task_status_incomplete = "未完成";
form_datasource_filter_contains_tag = "包含任意一个标签";
Expand Down
31 changes: 29 additions & 2 deletions src/query/dataviewTaskDataSourceQuery.ts
Expand Up @@ -49,6 +49,8 @@ export class DataviewTaskDataSourceQuery extends BaseDataviewDataSourceQuery {
return true;
case "STATUS_IS":
return this.filterByStatusIs(filter, task);
case "STATUS_IN":
return this.filterByStatusIn(filter, task);
case "CONTAINS_ANY_TAG":
return this.filterByContainsAnyTag(filter, task);
default:
Expand All @@ -58,20 +60,45 @@ export class DataviewTaskDataSourceQuery extends BaseDataviewDataSourceQuery {
});
}

filterByStatusIn(
filter: DataFilter,
data: Record<string, Literal>
): boolean {
const statusArr = filter.value as string[];
return statusArr.some((value) => {
if (value == "COMPLETED") {
return data.completed as boolean;
} else if (value == "INCOMPLETE") {
return data.status == " ";
} else if (value == "CANCELED") {
return data.status == "-";
} else if (value == "ANY") {
return true;
} else if (value == "FULLY_COMPLETED") {
return data.fullyCompleted as boolean;
} else {
return data.status === value;
}
});
}

filterByStatusIs(
filter: DataFilter,
data: Record<string, Literal>
): boolean {
if (filter.value == "COMPLETED") {
return data.completed as boolean;
} else if (filter.value == "INCOMPLETE") {
return !(data.completed as boolean);
return data.status == " ";
} else if (filter.value == "CANCELED") {
return data.status == "-";
} else if (filter.value == "ANY") {
return true;
} else if (filter.value == "FULLY_COMPLETED") {
return data.fullyCompleted as boolean;
} else {
return data.status === filter.value;
}
return true;
}

filterByContainsAnyTag(
Expand Down
13 changes: 11 additions & 2 deletions src/query/types.ts
Expand Up @@ -2,7 +2,11 @@ import { DateTime } from "luxon";

export type DataSourceType = "PAGE" | "ALL_TASK" | "TASK_IN_SPECIFIC_PAGE";

export type DataSourceFilterType = "NONE" | "STATUS_IS" | "CONTAINS_ANY_TAG";
export type DataSourceFilterType =
| "NONE"
| "STATUS_IS"
| "CONTAINS_ANY_TAG"
| "STATUS_IN";

export class DataSource {
type: DataSourceType;
Expand Down Expand Up @@ -46,7 +50,12 @@ export type CountFieldType = "DEFAULT" | "PAGE_PROPERTY" | "TASK_PROPERTY";

export type PropertySource = "UNKNOWN" | "PAGE" | "TASK";

export type TaskStatus = "COMPLETED" | "INCOMPLETE" | "FULLY_COMPLETED" | "ANY";
export type TaskStatus =
| "COMPLETED"
| "INCOMPLETE"
| "FULLY_COMPLETED"
| "CANCELED"
| "ANY";

export class ConvertFailData {
source: string;
Expand Down
73 changes: 72 additions & 1 deletion src/view/form/DataSourceFormItem.tsx
Expand Up @@ -93,7 +93,7 @@ export function DataSourceFormItem(props: {
};

const getTagsFromDataSource = (filter: DataFilter): TagOption[] => {
if (filter.type != "CONTAINS_ANY_TAG") {
if (filter.type != "CONTAINS_ANY_TAG" && filter.type != 'STATUS_IN') {
return [];
}
if (!(filter.value instanceof Array)) {
Expand Down Expand Up @@ -251,6 +251,77 @@ export function DataSourceFormItem(props: {
/>
) : null}

{filter?.type == "STATUS_IN" ? (
<InputTags
tags={getTagsFromDataSource(filter)}
onChange={(values) => {
changeFilter(
filter.id,
"value",
values.map((t) => {
return t.value;
})
);
}}
onRemove={(tag) => {
if (
filter?.value instanceof
Array
) {
changeFilter(
filter.id,
"value",
filter?.value?.filter(
(t) => {
return (
t !=
tag.value
);
}
)
);
}
}}
getItems={(query) => {
return [
{
id: "CANCELED",
label: local.form_datasource_filter_task_status_canceled,
value: "CANCELED",
icon: Icons.CODE,
},
{
id: "COMPLETED",
label: local.form_datasource_filter_task_status_completed,
value: "COMPLETED",
icon: Icons.CODE,
},
{
id: "INCOMPLETE",
label: local.form_datasource_filter_task_status_incomplete,
value: "INCOMPLETE",
icon: Icons.CODE,
},
{
id: "ANY",
label: local.form_datasource_filter_task_status_any,
value: "ANY",
icon: Icons.CODE,
},
{
id: "FULLY_COMPLETED",
label: local.form_datasource_filter_task_status_fully_completed,
value: "FULLY_COMPLETED",
icon: Icons.CODE,
},
];
}}
inputPlaceholder={
local.form_datasource_filter_contains_tag_input_placeholder
}
/>
) : null}

<button
className="list-remove-button"
onClick={(e) => removeFilter(filter.id)}
Expand Down
8 changes: 8 additions & 0 deletions src/view/form/options.tsx
Expand Up @@ -125,6 +125,10 @@ export function getDataSourceFilterOptions(
label: Locals.get().form_datasource_filter_type_status_is,
value: "STATUS_IS",
},
{
label: Locals.get().form_datasource_filter_type_status_in,
value: "STATUS_IN",
},
{
label: Locals.get()
.form_datasource_filter_type_contains_any_tag,
Expand Down Expand Up @@ -206,6 +210,10 @@ export const taskStatusOptions: SelectOption<TaskStatus>[] = [
label: Locals.get().form_datasource_filter_task_status_incomplete,
value: "INCOMPLETE",
},
{
label: Locals.get().form_datasource_filter_task_status_canceled,
value: "CANCELED",
},
{
label: Locals.get().form_datasource_filter_task_status_any,
value: "ANY",
Expand Down
7 changes: 4 additions & 3 deletions src/view/suggest/SuggestTagInput.tsx
Expand Up @@ -75,6 +75,7 @@ export function InputTags(props: {
ref={inputRef}
className="input"
placeholder={props.inputPlaceholder}
onFocus={() => setShowSuggest(true)}
onKeyDown={(e) => handleInputKeyDown(e)}
onChange={(e) => {
setValue(e.target.value);
Expand All @@ -95,13 +96,13 @@ export function InputTags(props: {
return [];
}}
onSelected={(item, index) => {
if (showSuggest) {
setShowSuggest(false);
}
if (index >= 0) {
appendTag(item.value);
inputRef.current!.value = "";
}
if (showSuggest) {
setShowSuggest(false);
}
}}
onSelectChange={(item, index) => {
if (index >= 0) {
Expand Down