visuddhinanda hace 1 año
padre
commit
04cc4ca5b6

+ 2 - 19
api-v8/app/Http/Controllers/TaskAssigneeController.php

@@ -17,15 +17,6 @@ class TaskAssigneeController extends Controller
         //
     }
 
-    /**
-     * Show the form for creating a new resource.
-     *
-     * @return \Illuminate\Http\Response
-     */
-    public function create()
-    {
-        //
-    }
 
     /**
      * Store a newly created resource in storage.
@@ -49,16 +40,6 @@ class TaskAssigneeController extends Controller
         //
     }
 
-    /**
-     * Show the form for editing the specified resource.
-     *
-     * @param  \App\Models\TaskAssignee  $taskAssignee
-     * @return \Illuminate\Http\Response
-     */
-    public function edit(TaskAssignee $taskAssignee)
-    {
-        //
-    }
 
     /**
      * Update the specified resource in storage.
@@ -81,5 +62,7 @@ class TaskAssigneeController extends Controller
     public function destroy(TaskAssignee $taskAssignee)
     {
         //
+        $del = $taskAssignee->delete();
+        return $this->ok($del);
     }
 }

+ 7 - 3
dashboard-v4/dashboard/src/components/like/EditableAvatarGroup.tsx

@@ -6,11 +6,15 @@ import { IDataType, WatchAddButton } from "./WatchAdd";
 interface IWidget {
   users?: IUser[];
   onFinish?: ((formData: IDataType) => Promise<boolean | void>) | undefined;
+  onDelete?: ((user: IUser) => Promise<boolean | void>) | undefined;
 }
-const EditableAvatarGroup = ({ users, onFinish }: IWidget) => {
+const EditableAvatarGroup = ({ users, onFinish, onDelete }: IWidget) => {
   return (
     <Space>
-      <Popover trigger={"click"} content={<WatchList data={users} />}>
+      <Popover
+        trigger={"click"}
+        content={<WatchList data={users} onDelete={onDelete} />}
+      >
         <div>
           {users?.map((item, id) => {
             return (
@@ -24,7 +28,7 @@ const EditableAvatarGroup = ({ users, onFinish }: IWidget) => {
           })}
         </div>
       </Popover>
-      <WatchAddButton data={users} onFinish={onFinish} />
+      <WatchAddButton data={users} onFinish={onFinish} onDelete={onDelete} />
     </Space>
   );
 };

+ 5 - 4
dashboard-v4/dashboard/src/components/like/WatchAdd.tsx

@@ -22,19 +22,20 @@ export interface IDataType {
 interface IWidget {
   data?: IUser[];
   onFinish?: ((formData: IDataType) => Promise<boolean | void>) | undefined;
+  onDelete?: ((user: IUser) => Promise<boolean | void>) | undefined;
 }
 
-export const WatchAddButton = ({ data, onFinish }: IWidget) => {
+export const WatchAddButton = ({ data, onFinish, onDelete }: IWidget) => {
   return (
     <Popover
       trigger={"click"}
-      content={<WatchAdd data={data} onFinish={onFinish} />}
+      content={<WatchAdd data={data} onFinish={onFinish} onDelete={onDelete} />}
     >
       <Button type="text" icon={<PlusOutlined />} />
     </Popover>
   );
 };
-const WatchAdd = ({ data, onFinish }: IWidget) => {
+const WatchAdd = ({ data, onFinish, onDelete }: IWidget) => {
   const intl = useIntl();
   const formRef = useRef<ProFormInstance>();
   return (
@@ -65,7 +66,7 @@ const WatchAdd = ({ data, onFinish }: IWidget) => {
         </ProForm.Group>
       </ProForm>
       <Divider />
-      <WatchList data={data} />
+      <WatchList data={data} onDelete={onDelete} />
     </div>
   );
 };

+ 22 - 2
dashboard-v4/dashboard/src/components/like/WatchList.tsx

@@ -2,17 +2,37 @@ import { Button, List } from "antd";
 import { DeleteOutlined } from "@ant-design/icons";
 
 import User, { IUser } from "../auth/User";
+import { useState } from "react";
 
 interface IWidget {
   data?: IUser[];
+  onDelete?: ((user: IUser) => Promise<boolean | void>) | undefined;
 }
-const WatchList = ({ data }: IWidget) => {
+const WatchList = ({ data, onDelete }: IWidget) => {
+  const [del, setDel] = useState<string>();
   return (
     <List
       dataSource={data}
       renderItem={(item) => (
         <List.Item
-          extra={[<Button type="text" danger icon={<DeleteOutlined />} />]}
+          extra={[
+            <Button
+              type="text"
+              danger
+              loading={item.id === del}
+              icon={<DeleteOutlined />}
+              onClick={() => {
+                console.debug("delete", item);
+                if (typeof onDelete !== "undefined") {
+                  console.debug("delete", item);
+                  setDel(item.id);
+                  onDelete(item).finally(() => {
+                    setDel(undefined);
+                  });
+                }
+              }}
+            />,
+          ]}
         >
           <User {...item} />
         </List.Item>

+ 28 - 0
dashboard-v4/dashboard/src/components/task/Assignees.tsx

@@ -18,6 +18,34 @@ const Assignees = ({ task, onChange }: IWidget) => {
     <>
       <EditableAvatarGroup
         users={data ?? undefined}
+        onDelete={async (user: IUser) => {
+          if (!task) {
+            console.error("no task");
+            return;
+          }
+          let users: string[] = [];
+          if (task.assignees_id) {
+            users = task.assignees_id.filter((value) => value !== user.id);
+          }
+          let setting: ITaskUpdateRequest = {
+            id: task.id,
+            studio_name: "",
+            assignees_id: users,
+          };
+          const url = `/v2/task/${setting.id}`;
+          console.info("api request", url, setting);
+          patch<ITaskUpdateRequest, ITaskResponse>(url, setting).then(
+            (json) => {
+              console.info("api response", json);
+              if (json.ok) {
+                message.success("Success");
+                onChange && onChange([json.data]);
+              } else {
+                message.error(json.message);
+              }
+            }
+          );
+        }}
         onFinish={async (values: IDataType) => {
           if (!task) {
             console.error("no task");