@zeniai/client-epic-state 5.0.3-betaND3 → 5.0.3-betaRD1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.d.ts +9 -1
  2. package/lib/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +16 -1
  3. package/lib/entity/task/taskPayload.d.ts +0 -1
  4. package/lib/entity/task/taskPayload.js +39 -46
  5. package/lib/entity/task/taskState.d.ts +0 -2
  6. package/lib/esm/entity/aiAccountantCustomer/aiAccountantCustomerPayload.js +16 -1
  7. package/lib/esm/entity/task/taskPayload.js +39 -46
  8. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +0 -4
  9. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -6
  10. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +2 -6
  11. package/lib/esm/view/taskManager/taskListView/taskListPayload.js +1 -5
  12. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +0 -11
  13. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +4 -27
  14. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  15. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +0 -2
  16. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +0 -4
  17. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -6
  18. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +2 -6
  19. package/lib/view/taskManager/taskListView/taskList.d.ts +0 -2
  20. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +1 -10
  21. package/lib/view/taskManager/taskListView/taskListPayload.js +0 -7
  22. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +1 -4
  23. package/lib/view/taskManager/taskListView/taskListReducer.js +0 -11
  24. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +1 -4
  25. package/lib/view/taskManager/taskListView/taskListSelector.js +4 -27
  26. package/package.json +1 -1
@@ -1,7 +1,15 @@
1
1
  import { AiAccountantCustomer, AiAccountantEnrollment, AiAccountantJob } from './aiAccountantCustomerState';
2
+ export interface AiAccountantModelAccuracyPayload {
3
+ accuracy: number;
4
+ model_id: string;
5
+ passed: boolean;
6
+ threshold: number;
7
+ training_status: string;
8
+ validated_at: string;
9
+ }
2
10
  export interface AiAccountantEnrollmentPayload {
3
11
  status: string;
4
- accuracy?: Record<string, number>;
12
+ accuracy?: Record<string, AiAccountantModelAccuracyPayload>;
5
13
  latest_training?: string;
6
14
  latest_transaction_sync?: string;
7
15
  offboarded_at?: string;
@@ -4,9 +4,24 @@ exports.toAiAccountantJob = exports.toAiAccountantCustomer = exports.toAiAccount
4
4
  const zeniDayJS_1 = require("../../zeniDayJS");
5
5
  const aiAccountantCustomerState_1 = require("./aiAccountantCustomerState");
6
6
  // ── Mapping functions (payload → state) ──
7
+ // Backend returns accuracy as a percent (0–100) inside a nested object; the UI
8
+ // layer treats it as a 0–1 fraction. Normalize here and drop malformed entries.
9
+ const toAccuracyByModel = (accuracyPayload) => {
10
+ if (accuracyPayload == null) {
11
+ return undefined;
12
+ }
13
+ const result = {};
14
+ Object.entries(accuracyPayload).forEach(([model, entry]) => {
15
+ const percent = entry?.accuracy;
16
+ if (typeof percent === 'number' && Number.isFinite(percent)) {
17
+ result[model] = percent / 100;
18
+ }
19
+ });
20
+ return result;
21
+ };
7
22
  const toAiAccountantEnrollment = (payload) => ({
8
23
  status: (0, aiAccountantCustomerState_1.toAiAccountantEnrollmentStatus)(payload.status),
9
- accuracy: payload.accuracy,
24
+ accuracy: toAccuracyByModel(payload.accuracy),
10
25
  latestTraining: payload.latest_training != null
11
26
  ? (0, zeniDayJS_1.date)(payload.latest_training)
12
27
  : undefined,
@@ -22,7 +22,6 @@ export interface TaskPayload {
22
22
  update_time: string | null;
23
23
  company_id?: string;
24
24
  group_assignees?: string[];
25
- parent_task_id?: string | null;
26
25
  sync_token?: string | null;
27
26
  task_group_ids?: string[] | null;
28
27
  }
@@ -5,50 +5,43 @@ const formatMinutesToFromHHMM_1 = require("../../commonStateTypes/fiscalYearHelp
5
5
  const recurringViewHelper_1 = require("../../view/common/recurringViewHelper");
6
6
  const zeniDayJS_1 = require("../../zeniDayJS");
7
7
  const taskState_1 = require("./taskState");
8
- const mapTaskPayloadToTask = (payload) => {
9
- const task = {
10
- id: payload.task_id,
11
- assignees: payload.assignees,
12
- createdBy: payload.created_by,
13
- description: payload.description,
14
- fileIds: payload.file_ids,
15
- isArchived: payload.is_archived,
16
- isDeleted: payload.is_deleted,
17
- name: payload.name,
18
- syncToken: payload.sync_token ?? '',
19
- priority: {
20
- code: (0, taskState_1.toPriorityCodeType)(payload.priority.code),
21
- name: payload.priority.name,
22
- },
23
- status: {
24
- code: (0, taskState_1.toTaskStatusCodeType)(payload.status.code),
25
- name: payload.status.name,
26
- },
27
- tagIds: payload.tags.map((tag) => tag.tag_id),
28
- type: { code: (0, taskState_1.toTaskCodeType)(payload.type.code), name: payload.type.name },
29
- recurringEndDate: payload.recurring_end_date != null
30
- ? (0, zeniDayJS_1.date)(payload.recurring_end_date)
31
- : undefined,
32
- recurringFrequency: payload.recurring_frequency != null
33
- ? (0, recurringViewHelper_1.toRecurringFrequencyStrict)(payload.recurring_frequency.code)
34
- : undefined,
35
- recurringStartDate: payload.recurring_start_date != null
36
- ? (0, zeniDayJS_1.date)(payload.recurring_start_date)
37
- : undefined,
38
- createTime: (0, zeniDayJS_1.date)(payload.create_time),
39
- dueDate: payload.due_date != null ? (0, zeniDayJS_1.date)(payload.due_date) : undefined,
40
- updateTime: payload.update_time != null ? (0, zeniDayJS_1.date)(payload.update_time) : undefined,
41
- companyId: payload.company_id,
42
- taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
43
- timeSpent: payload.time_spent != null
44
- ? (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(payload.time_spent)
45
- : (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(0),
46
- groupAssignees: payload.group_assignees ?? [],
47
- };
48
- const parentTaskId = payload.parent_task_id;
49
- if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
50
- task.parentTaskId = parentTaskId;
51
- }
52
- return task;
53
- };
8
+ const mapTaskPayloadToTask = (payload) => ({
9
+ id: payload.task_id,
10
+ assignees: payload.assignees,
11
+ createdBy: payload.created_by,
12
+ description: payload.description,
13
+ fileIds: payload.file_ids,
14
+ isArchived: payload.is_archived,
15
+ isDeleted: payload.is_deleted,
16
+ name: payload.name,
17
+ syncToken: payload.sync_token ?? '',
18
+ priority: {
19
+ code: (0, taskState_1.toPriorityCodeType)(payload.priority.code),
20
+ name: payload.priority.name,
21
+ },
22
+ status: {
23
+ code: (0, taskState_1.toTaskStatusCodeType)(payload.status.code),
24
+ name: payload.status.name,
25
+ },
26
+ tagIds: payload.tags.map((tag) => tag.tag_id),
27
+ type: { code: (0, taskState_1.toTaskCodeType)(payload.type.code), name: payload.type.name },
28
+ recurringEndDate: payload.recurring_end_date != null
29
+ ? (0, zeniDayJS_1.date)(payload.recurring_end_date)
30
+ : undefined,
31
+ recurringFrequency: payload.recurring_frequency != null
32
+ ? (0, recurringViewHelper_1.toRecurringFrequencyStrict)(payload.recurring_frequency.code)
33
+ : undefined,
34
+ recurringStartDate: payload.recurring_start_date != null
35
+ ? (0, zeniDayJS_1.date)(payload.recurring_start_date)
36
+ : undefined,
37
+ createTime: (0, zeniDayJS_1.date)(payload.create_time),
38
+ dueDate: payload.due_date != null ? (0, zeniDayJS_1.date)(payload.due_date) : undefined,
39
+ updateTime: payload.update_time != null ? (0, zeniDayJS_1.date)(payload.update_time) : undefined,
40
+ companyId: payload.company_id,
41
+ taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
42
+ timeSpent: payload.time_spent != null
43
+ ? (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(payload.time_spent)
44
+ : (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(0),
45
+ groupAssignees: payload.group_assignees ?? [],
46
+ });
54
47
  exports.mapTaskPayloadToTask = mapTaskPayloadToTask;
@@ -21,8 +21,6 @@ export interface Task {
21
21
  type: TaskType;
22
22
  companyId?: ID;
23
23
  dueDate?: ZeniDate;
24
- /** Present when this task is a subtask of another task. */
25
- parentTaskId?: ID;
26
24
  recurringEndDate?: ZeniDate;
27
25
  recurringFrequency?: RecurringFrequencyType;
28
26
  recurringStartDate?: ZeniDate;
@@ -1,9 +1,24 @@
1
1
  import { date } from '../../zeniDayJS';
2
2
  import { toAiAccountantEnrollmentStatus, toAiAccountantJobStatus, toAiAccountantOperationType, } from './aiAccountantCustomerState';
3
3
  // ── Mapping functions (payload → state) ──
4
+ // Backend returns accuracy as a percent (0–100) inside a nested object; the UI
5
+ // layer treats it as a 0–1 fraction. Normalize here and drop malformed entries.
6
+ const toAccuracyByModel = (accuracyPayload) => {
7
+ if (accuracyPayload == null) {
8
+ return undefined;
9
+ }
10
+ const result = {};
11
+ Object.entries(accuracyPayload).forEach(([model, entry]) => {
12
+ const percent = entry?.accuracy;
13
+ if (typeof percent === 'number' && Number.isFinite(percent)) {
14
+ result[model] = percent / 100;
15
+ }
16
+ });
17
+ return result;
18
+ };
4
19
  export const toAiAccountantEnrollment = (payload) => ({
5
20
  status: toAiAccountantEnrollmentStatus(payload.status),
6
- accuracy: payload.accuracy,
21
+ accuracy: toAccuracyByModel(payload.accuracy),
7
22
  latestTraining: payload.latest_training != null
8
23
  ? date(payload.latest_training)
9
24
  : undefined,
@@ -2,49 +2,42 @@ import { convertMinutesToHHMM } from '../../commonStateTypes/fiscalYearHelpers/f
2
2
  import { toRecurringFrequencyStrict } from '../../view/common/recurringViewHelper';
3
3
  import { date } from '../../zeniDayJS';
4
4
  import { toPriorityCodeType, toTaskCodeType, toTaskStatusCodeType, } from './taskState';
5
- export const mapTaskPayloadToTask = (payload) => {
6
- const task = {
7
- id: payload.task_id,
8
- assignees: payload.assignees,
9
- createdBy: payload.created_by,
10
- description: payload.description,
11
- fileIds: payload.file_ids,
12
- isArchived: payload.is_archived,
13
- isDeleted: payload.is_deleted,
14
- name: payload.name,
15
- syncToken: payload.sync_token ?? '',
16
- priority: {
17
- code: toPriorityCodeType(payload.priority.code),
18
- name: payload.priority.name,
19
- },
20
- status: {
21
- code: toTaskStatusCodeType(payload.status.code),
22
- name: payload.status.name,
23
- },
24
- tagIds: payload.tags.map((tag) => tag.tag_id),
25
- type: { code: toTaskCodeType(payload.type.code), name: payload.type.name },
26
- recurringEndDate: payload.recurring_end_date != null
27
- ? date(payload.recurring_end_date)
28
- : undefined,
29
- recurringFrequency: payload.recurring_frequency != null
30
- ? toRecurringFrequencyStrict(payload.recurring_frequency.code)
31
- : undefined,
32
- recurringStartDate: payload.recurring_start_date != null
33
- ? date(payload.recurring_start_date)
34
- : undefined,
35
- createTime: date(payload.create_time),
36
- dueDate: payload.due_date != null ? date(payload.due_date) : undefined,
37
- updateTime: payload.update_time != null ? date(payload.update_time) : undefined,
38
- companyId: payload.company_id,
39
- taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
40
- timeSpent: payload.time_spent != null
41
- ? convertMinutesToHHMM(payload.time_spent)
42
- : convertMinutesToHHMM(0),
43
- groupAssignees: payload.group_assignees ?? [],
44
- };
45
- const parentTaskId = payload.parent_task_id;
46
- if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
47
- task.parentTaskId = parentTaskId;
48
- }
49
- return task;
50
- };
5
+ export const mapTaskPayloadToTask = (payload) => ({
6
+ id: payload.task_id,
7
+ assignees: payload.assignees,
8
+ createdBy: payload.created_by,
9
+ description: payload.description,
10
+ fileIds: payload.file_ids,
11
+ isArchived: payload.is_archived,
12
+ isDeleted: payload.is_deleted,
13
+ name: payload.name,
14
+ syncToken: payload.sync_token ?? '',
15
+ priority: {
16
+ code: toPriorityCodeType(payload.priority.code),
17
+ name: payload.priority.name,
18
+ },
19
+ status: {
20
+ code: toTaskStatusCodeType(payload.status.code),
21
+ name: payload.status.name,
22
+ },
23
+ tagIds: payload.tags.map((tag) => tag.tag_id),
24
+ type: { code: toTaskCodeType(payload.type.code), name: payload.type.name },
25
+ recurringEndDate: payload.recurring_end_date != null
26
+ ? date(payload.recurring_end_date)
27
+ : undefined,
28
+ recurringFrequency: payload.recurring_frequency != null
29
+ ? toRecurringFrequencyStrict(payload.recurring_frequency.code)
30
+ : undefined,
31
+ recurringStartDate: payload.recurring_start_date != null
32
+ ? date(payload.recurring_start_date)
33
+ : undefined,
34
+ createTime: date(payload.create_time),
35
+ dueDate: payload.due_date != null ? date(payload.due_date) : undefined,
36
+ updateTime: payload.update_time != null ? date(payload.update_time) : undefined,
37
+ companyId: payload.company_id,
38
+ taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
39
+ timeSpent: payload.time_spent != null
40
+ ? convertMinutesToHHMM(payload.time_spent)
41
+ : convertMinutesToHHMM(0),
42
+ groupAssignees: payload.group_assignees ?? [],
43
+ });
@@ -87,9 +87,5 @@ const toTaskPayload = (state, task) => {
87
87
  task_group_ids: task.taskGroupIds,
88
88
  time_spent: convertHHMMStrToMinutes(task.timeSpent),
89
89
  };
90
- const parentTaskId = task.parentTaskId;
91
- if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
92
- taskPayload.parent_task_id = parentTaskId;
93
- }
94
90
  return taskPayload;
95
91
  };
@@ -3,19 +3,16 @@ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { updateTags } from '../../../../entity/tag/tagReducer';
4
4
  import { updateTasks } from '../../../../entity/task/taskReducer';
5
5
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
- import { flattenTasksAndSubtasksForEntity, } from '../taskListPayload';
7
6
  import { fetchTaskList, updateTaskList, updateTaskListFetchStatus, } from '../taskListReducer';
8
7
  export const fetchTaskListEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchTaskList.match), switchMap(() => {
9
8
  return zeniAPI
10
9
  .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks?query=${encodeURIComponent(`{"task_type": "all"}`)}`)
11
10
  .pipe(mergeMap((response) => {
12
11
  if (isSuccessResponse(response) && response.data != null) {
13
- const { tasks } = response.data;
14
- const tasksForEntity = flattenTasksAndSubtasksForEntity(tasks);
15
- return of(updateTasks(tasksForEntity), updateTaskList({
16
- data: tasks,
12
+ return of(updateTasks(response.data.tasks), updateTaskList({
13
+ data: response.data.tasks,
17
14
  updateType: 'replace',
18
- }), updateTags(tasksForEntity.map((task) => task.tags).flat()));
15
+ }), updateTags(response.data.tasks.map((task) => task.tags).flat()));
19
16
  }
20
17
  else {
21
18
  return of(updateTaskListFetchStatus({
@@ -6,13 +6,9 @@ import { updateTaskFromListView, updateTasksListOnUpdateTaskFailure, updateTasks
6
6
  import { getTaskPayload } from './bulkUpdateTaskListEpic';
7
7
  export const updateTaskFromListViewEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(updateTaskFromListView.match), switchMap((action) => {
8
8
  const state = state$.value;
9
- const { task, updates, parentTaskId } = action.payload;
9
+ const { task, updates } = action.payload;
10
10
  const taskId = task.id;
11
- const mergedUpdates = { ...updates };
12
- if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
13
- mergedUpdates.parentTaskId = parentTaskId;
14
- }
15
- const taskData = getTaskPayload(state, taskId, mergedUpdates);
11
+ const taskData = getTaskPayload(state, taskId, updates);
16
12
  return zeniAPI
17
13
  .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}`, { ...taskData })
18
14
  .pipe(mergeMap((response) => {
@@ -1,5 +1 @@
1
- /** Parent tasks and nested subtasks as flat `TaskPayload`s for `updateTasks`. */
2
- export const flattenTasksAndSubtasksForEntity = (tasks) => tasks.flatMap((task) => {
3
- const { subtasks, ...parent } = task;
4
- return [parent, ...(subtasks ?? [])];
5
- });
1
+ export {};
@@ -30,7 +30,6 @@ const initialTaskIdsByDueDate = {
30
30
  upcoming: [],
31
31
  };
32
32
  export const initialState = {
33
- subtaskIdsByParentTaskId: {},
34
33
  taskIds: [],
35
34
  taskIdsByGroupsIds: {},
36
35
  taskIdsByPriority: initialTaskIdsByPriority,
@@ -90,7 +89,6 @@ const taskList = createSlice({
90
89
  const { data } = action.payload;
91
90
  draft.fetchState = 'Completed';
92
91
  draft.error = undefined;
93
- draft.subtaskIdsByParentTaskId = buildSubtaskIdsByParentTaskId(data);
94
92
  const { taskIds, taskIdsGroupedByPriority, taskIdsByGroupIds, taskIdsGroupedByStatus, taskIdsByAssignees, taskIdsByDueDate, taskIdsByTags, } = getGroupedTaskIds(data);
95
93
  draft.taskIds = taskIds;
96
94
  draft.taskIdsByGroupsIds = taskIdsByGroupIds;
@@ -490,15 +488,6 @@ const getTagsGroupKey = (tags) => {
490
488
  tagIds.sort();
491
489
  return tagIds.join(',');
492
490
  };
493
- const buildSubtaskIdsByParentTaskId = (tasks) => {
494
- const subtaskIdsByParentTaskId = {};
495
- tasks.forEach((task) => {
496
- if (task.subtasks != null && task.subtasks.length > 0) {
497
- subtaskIdsByParentTaskId[task.task_id] = task.subtasks.map((s) => s.task_id);
498
- }
499
- });
500
- return subtaskIdsByParentTaskId;
501
- };
502
491
  const getGroupedTaskIds = (tasks) => {
503
492
  const taskIds = [];
504
493
  const taskIdsByGroupIds = {};
@@ -43,30 +43,6 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
43
43
  }, sortOrder);
44
44
  return tasksInOrder;
45
45
  };
46
- const taskToTaskWithUserDetails = (task, userState, userRoleState, addressState) => ({
47
- ...task,
48
- assigneeUsers: task.assignees
49
- .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
50
- .filter((value) => value != null),
51
- subtasks: [],
52
- });
53
- const attachSubtasksForTask = (taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState) => {
54
- const subtaskIds = taskListState.subtaskIdsByParentTaskId[taskWithAssignees.id] ?? [];
55
- if (subtaskIds.length === 0) {
56
- return { ...taskWithAssignees, subtasks: [] };
57
- }
58
- const subtasks = subtaskIds
59
- .map((subtaskId) => {
60
- const subtask = getTaskById(taskState, subtaskId);
61
- if (subtask == null) {
62
- return undefined;
63
- }
64
- const withAssignees = taskToTaskWithUserDetails(subtask, userState, userRoleState, addressState);
65
- return attachSubtasksForTask(withAssignees, taskListState, taskState, userState, userRoleState, addressState);
66
- })
67
- .filter((value) => value != null);
68
- return { ...taskWithAssignees, subtasks };
69
- };
70
46
  const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
71
47
  const { sortKey, searchText } = taskListState.uiState;
72
48
  const sortOrder = getSortOrder(taskListState.uiState.sortOrder);
@@ -74,8 +50,10 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
74
50
  .map((taskId) => {
75
51
  const task = getTaskById(taskState, taskId);
76
52
  if (task != null) {
77
- const taskWithAssignees = taskToTaskWithUserDetails(task, userState, userRoleState, addressState);
78
- return attachSubtasksForTask(taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState);
53
+ const assigneeUsers = task.assignees
54
+ .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
55
+ .filter((value) => value != null);
56
+ return { ...task, assigneeUsers };
79
57
  }
80
58
  return undefined;
81
59
  })
@@ -356,7 +334,6 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
356
334
  return {
357
335
  uiState: taskListState.uiState,
358
336
  filters: taskListState.filters,
359
- subtaskIdsByParentTaskId: taskListState.subtaskIdsByParentTaskId,
360
337
  taskGroupTemplates,
361
338
  fetchState: fetchState,
362
339
  userList: getUserList(userState, userRoleState, userListViewState, 'taskManagerCandidate'),