Просмотр исходного кода

Merge pull request #2265 from visuddhinanda/development

Development
visuddhinanda 1 год назад
Родитель
Сommit
ed597a5d94

+ 2 - 0
api-v8/app/Http/Api/Mq.php

@@ -6,6 +6,7 @@ use PhpAmqpLib\Connection\AMQPStreamConnection;
 use PhpAmqpLib\Message\AMQPMessage;
 use PhpAmqpLib\Exchange\AMQPExchangeType;
 use PhpAmqpLib\Exception\AMQPTimeoutException;
+use PhpAmqpLib\Exception\AMQPProtocolChannelException;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Str;
 
@@ -216,6 +217,7 @@ class Mq
             try {
                 $channel->wait(null, false, $timeout);
             } catch (AMQPTimeoutException $e) {
+            } catch (AMQPProtocolChannelException $e) {
             }
         }
     }

+ 109 - 93
api-v8/app/Http/Api/ShareApi.php

@@ -1,13 +1,18 @@
 <?php
+
 namespace App\Http\Api;
+
 use App\Models\GroupMember;
 use App\Models\Share;
 use App\Models\Article;
 use App\Models\Channel;
 use App\Models\Collection;
+use App\Models\Project;
+
 use App\Http\Api\ChannelApi;
 
-class ShareApi{
+class ShareApi
+{
 
     /**
      * 获取某用户的可见的协作资源
@@ -21,92 +26,99 @@ class ShareApi{
      * power 权限 10: 只读  20:编辑 30: 拥有者
      */
 
-    public static function getResList($user_uid,$res_type=-1){
+    public static function getResList($user_uid, $res_type = -1)
+    {
         # 找我加入的群
-        $my_group = GroupMember::where("user_id",$user_uid)->select('group_id')->get();
+        $my_group = GroupMember::where("user_id", $user_uid)->select('group_id')->get();
         $userList[] = $user_uid;
         foreach ($my_group as $key => $value) {
             # code...
-            $userList[]=$value["group_id"];
+            $userList[] = $value["group_id"];
         }
 
-        if($res_type==-1){
+        if ($res_type == -1) {
             #所有类型资源
-            $Fetch =Share::whereIn("cooperator_id",$userList)->select(['res_id','res_type','power'])->get();
-        }
-        else{
+            $Fetch = Share::whereIn("cooperator_id", $userList)->select(['res_id', 'res_type', 'power'])->get();
+        } else {
             #指定类型资源
-            $Fetch =Share::whereIn("cooperator_id",$userList)
-                        ->where('res_type',$res_type)
-                        ->select(['res_id','res_type','power'])->get();
+            $Fetch = Share::whereIn("cooperator_id", $userList)
+                ->where('res_type', $res_type)
+                ->select(['res_id', 'res_type', 'power'])->get();
         }
 
         $resOutput = array();
         foreach ($Fetch as $key => $value) {
             # 查重
-            if(isset($resOutput[$value["res_id"]])){
-                if($value["power"]>$resOutput[$value["res_id"]]["power"]){
+            if (isset($resOutput[$value["res_id"]])) {
+                if ($value["power"] > $resOutput[$value["res_id"]]["power"]) {
                     $resOutput[$value["res_id"]]["power"] = $value["power"];
                 }
-            }
-            else{
-                $resOutput[$value["res_id"]]= array("power"=> $value["power"],"type" => $value["res_type"]);
+            } else {
+                $resOutput[$value["res_id"]] = array("power" => $value["power"], "type" => $value["res_type"]);
             }
         }
-        $resList=array();
+        $resList = array();
         foreach ($resOutput as $key => $value) {
             # code...
-            $resList[]=array("res_id"=>$key,"res_type"=>(int)$value["type"],"power"=>(int)$value["power"]);
+            $resList[] = array("res_id" => $key, "res_type" => (int)$value["type"], "power" => (int)$value["power"]);
         }
 
         foreach ($resList as $key => $res) {
             # 获取资源标题 和所有者
-            $resList[$key]["res_title"]="_unknown_";
-            $resList[$key]["res_owner_id"]="_unknown_";
-            $resList[$key]["type"]="_unknown_";
-            $resList[$key]["status"]="0";
-            $resList[$key]["lang"]="_unknown_";
+            $resList[$key]["res_title"] = "_unknown_";
+            $resList[$key]["res_owner_id"] = "_unknown_";
+            $resList[$key]["type"] = "_unknown_";
+            $resList[$key]["status"] = "0";
+            $resList[$key]["lang"] = "_unknown_";
 
             switch ($res["res_type"]) {
                 case 1:
                     # pcs 文档
-                    $resList[$key]["res_title"]="title";
+                    $resList[$key]["res_title"] = "title";
                     break;
                 case 2:
                     # channel
-                    $channelInfo = Channel::where('uid',$res["res_id"])->first();
-                    if($channelInfo){
-                        $resList[$key]["res_title"]=$channelInfo["name"];
-                        $resList[$key]["res_owner_id"]=$channelInfo["owner_uid"];
-                        $resList[$key]["type"]=$channelInfo["type"];
-                        $resList[$key]["status"]=$channelInfo["status"];
-                        $resList[$key]["lang"]=$channelInfo["lang"];
+                    $channelInfo = Channel::where('uid', $res["res_id"])->first();
+                    if ($channelInfo) {
+                        $resList[$key]["res_title"] = $channelInfo["name"];
+                        $resList[$key]["res_owner_id"] = $channelInfo["owner_uid"];
+                        $resList[$key]["type"] = $channelInfo["type"];
+                        $resList[$key]["status"] = $channelInfo["status"];
+                        $resList[$key]["lang"] = $channelInfo["lang"];
                     }
                     break;
                 case 3:
                     # 3 Article 文章
-                    $aInfo = Article::where('uid',$res["res_id"])->first();
-                    if($aInfo){
-                        $resList[$key]["res_title"]=$aInfo["title"];
-                        $resList[$key]["res_owner_id"]=$aInfo["owner"];
-                        $resList[$key]["status"]=$aInfo["status"];
-                        $resList[$key]["lang"]='';
+                    $aInfo = Article::where('uid', $res["res_id"])->first();
+                    if ($aInfo) {
+                        $resList[$key]["res_title"] = $aInfo["title"];
+                        $resList[$key]["res_owner_id"] = $aInfo["owner"];
+                        $resList[$key]["status"] = $aInfo["status"];
+                        $resList[$key]["lang"] = '';
                     }
                     break;
                 case 4:
                     # 4 Collection 文集
-                    $aInfo = Collection::where('uid',$res["res_id"])->first();
-                    if($aInfo){
-                        $resList[$key]["res_title"]=$aInfo["title"];
-                        $resList[$key]["res_owner_id"]=$aInfo["owner"];
-                        $resList[$key]["status"]=$aInfo["status"];
-                        $resList[$key]["lang"]=$aInfo["lang"];
+                    $aInfo = Collection::where('uid', $res["res_id"])->first();
+                    if ($aInfo) {
+                        $resList[$key]["res_title"] = $aInfo["title"];
+                        $resList[$key]["res_owner_id"] = $aInfo["owner"];
+                        $resList[$key]["status"] = $aInfo["status"];
+                        $resList[$key]["lang"] = $aInfo["lang"];
                     }
                     break;
                 case 5:
                     # code...
                     break;
-
+                case 6:
+                    $aInfo = Project::where('uid', $res["res_id"])->first();
+                    if ($aInfo) {
+                        $resList[$key]["res_title"] = $aInfo["title"];
+                        $resList[$key]["res_owner_id"] = $aInfo["owner_id"];
+                        $resList[$key]["status"] = $aInfo["status"];
+                        $resList[$key]["lang"] = '';
+                    }
+                    break;
                 default:
                     # code...
                     break;
@@ -114,63 +126,67 @@ class ShareApi{
         }
 
         return $resList;
-
     }
 
     /**
      * 获取对某个共享资源的权限
      */
-    public static function getResPower($user_uid,$res_id,$res_type=0){
-            if(empty($user_uid)){
-                #未登录用户 没有共享资源
-                return 0;
-            }
-            //查看是否为资源拥有者
-            if($res_type!=0){
-                switch ($res_type) {
-                    case 2:
-                        # channel
-                        $channel = ChannelApi::getById($res_id);
-                        if($channel){
-                            if($channel['studio_id'] === $user_uid){
-                                return 30;
-                            }
-                        }
-                        break;
-                    case 3:
-                        //Article
-                        $owner = Article::where('uid',$res_id)->value('owner');
-                        if($owner === $user_uid){
-                            return 30;
-                        }
-                        break;
-                    case 4:
-                        $owner = Collection::where('uid',$res_id)->value('owner');
-                        if($owner === $user_uid){
+    public static function getResPower($user_uid, $res_id, $res_type = 0)
+    {
+        if (empty($user_uid)) {
+            #未登录用户 没有共享资源
+            return 0;
+        }
+        //查看是否为资源拥有者
+        if ($res_type != 0) {
+            switch ($res_type) {
+                case 2:
+                    # channel
+                    $channel = ChannelApi::getById($res_id);
+                    if ($channel) {
+                        if ($channel['studio_id'] === $user_uid) {
                             return 30;
                         }
-                        //文集
-                        break;
-                }
-            }
-            # 找我加入的群
-            $my_group = GroupMember::where("user_id",$user_uid)->select('group_id')->get();
-            $userList[] = $user_uid;
-            foreach ($my_group as $key => $value) {
-                $userList[]=$value["group_id"];
+                    }
+                    break;
+                case 3:
+                    //Article
+                    $owner = Article::where('uid', $res_id)->value('owner');
+                    if ($owner === $user_uid) {
+                        return 30;
+                    }
+                    break;
+                case 4:
+                    $owner = Collection::where('uid', $res_id)->value('owner');
+                    if ($owner === $user_uid) {
+                        return 30;
+                    }
+                    //文集
+                    break;
+                case 6: //workflow
+                    $owner = Project::where('uid', $res_id)->value('owner_id');
+                    if ($owner === $user_uid) {
+                        return 30;
+                    }
+                    break;
             }
-            $Fetch =Share::whereIn("cooperator_id",$userList)
-                        ->where('res_id',$res_id)
-                        ->select(['power'])->get();
-            $power=0;
-            foreach ($Fetch as $key => $value) {
-                # code...
-                if((int)$value["power"]>$power){
-                    $power = $value["power"];
-                }
+        }
+        # 找我加入的群
+        $my_group = GroupMember::where("user_id", $user_uid)->select('group_id')->get();
+        $userList[] = $user_uid;
+        foreach ($my_group as $key => $value) {
+            $userList[] = $value["group_id"];
+        }
+        $Fetch = Share::whereIn("cooperator_id", $userList)
+            ->where('res_id', $res_id)
+            ->select(['power'])->get();
+        $power = 0;
+        foreach ($Fetch as $key => $value) {
+            # code...
+            if ((int)$value["power"] > $power) {
+                $power = $value["power"];
             }
-            return $power;
+        }
+        return $power;
     }
-
 }
-

+ 9 - 1
api-v8/app/Http/Controllers/AiAssistantController.php

@@ -6,6 +6,8 @@ use App\Models\AiModel;
 use Illuminate\Http\Request;
 use App\Http\Resources\AiAssistantResource;
 use App\Http\Api\AuthApi;
+use App\Http\Api\ShareApi;
+
 use Illuminate\Support\Facades\Log;
 
 class AiAssistantController extends Controller
@@ -23,8 +25,14 @@ class AiAssistantController extends Controller
             Log::error('notification auth failed {request}', ['request' => $request]);
             return $this->error(__('auth.failed'), 401, 401);
         }
+        $resList = ShareApi::getResList($user['user_uid'], 8);
+        $resId = [];
+        foreach ($resList as $res) {
+            $resId[] = $res['res_id'];
+        }
         $table = AiModel::where('owner_id', $user['user_uid'])
-            ->orWhere('privacy', 'public');
+            ->orWhere('privacy', 'public')
+            ->orWhereIn('uid', $resId);
         if ($request->has('keyword')) {
             $table = $table->where('name', 'like', '%' . $request->get('keyword') . '%');
         }

+ 10 - 0
api-v8/app/Http/Controllers/ProjectController.php

@@ -6,6 +6,8 @@ use App\Models\Project;
 use Illuminate\Http\Request;
 use App\Http\Api\AuthApi;
 use App\Http\Api\StudioApi;
+use App\Http\Api\ShareApi;
+
 use App\Http\Resources\ProjectResource;
 use Illuminate\Support\Str;
 use Illuminate\Support\Facades\Log;
@@ -40,6 +42,14 @@ class ProjectController extends Controller
                 $table = Project::where('uid', $request->get('project_id'))
                     ->orWhereJsonContains('path', $request->get('project_id'));
                 break;
+            case 'shared':
+                $resList = ShareApi::getResList($studioId, 6);
+                $resId = [];
+                foreach ($resList as $res) {
+                    $resId[] = $res['res_id'];
+                }
+                $table = Project::whereIn('uid', $resId);
+                break;
             case 'community':
                 $table = Project::where('owner_id', '<>', $studioId)
                     ->whereNull('parent_id')

+ 39 - 40
api-v8/app/Http/Controllers/ShareController.php

@@ -4,12 +4,11 @@ namespace App\Http\Controllers;
 
 use App\Models\Share;
 use App\Models\GroupInfo;
-use App\Models\Article;
-use App\Models\Collection;
 use Illuminate\Http\Request;
 use App\Http\Resources\ShareResource;
 use App\Http\Api\AuthApi;
 use App\Http\Api\ShareApi;
+use Illuminate\Support\Str;
 
 class ShareController extends Controller
 {
@@ -22,16 +21,16 @@ class ShareController extends Controller
     {
         //
         $user = AuthApi::current($request);
-        $result=false;
+        $result = false;
         $role = "member";
-		$indexCol = ['id','res_id','res_type','power','updated_at','created_at'];
-		switch ($request->get('view')) {
+        $indexCol = ['id', 'res_id', 'res_type', 'power', 'updated_at', 'created_at'];
+        switch ($request->get('view')) {
             case 'res':
-                if(!$user){
+                if (!$user) {
                     return $this->error(__('auth.failed'));
                 }
-                $table = Share::where('res_id',$request->get('id'));
-                $power = ShareApi::getResPower($user['user_uid'],$request->get('id'),$table->value('res_type'));
+                $table = Share::where('res_id', $request->get('id'));
+                $power = ShareApi::getResPower($user['user_uid'], $request->get('id'), $table->value('res_type'));
                 switch ($power) {
                     case 10:
                         $role = "member";
@@ -45,41 +44,39 @@ class ShareController extends Controller
                 }
                 break;
             case 'group':
-                if(!$user){
+                if (!$user) {
                     return $this->error(__('auth.failed'));
                 }
                 //TODO 判断当前用户是否有指定的 group 的权限
-                if(GroupInfo::where('uid',$request->get('id'))->where('owner',$user['user_uid'])->exists()){
+                if (GroupInfo::where('uid', $request->get('id'))->where('owner', $user['user_uid'])->exists()) {
                     $role = "owner";
                 }
                 $table = Share::where('cooperator_id', $request->get('id'));
-				break;
+                break;
         }
-        if(isset($_GET["search"])){
+        if (isset($_GET["search"])) {
             //TODO 搜索资源标题
-            $table = $table->where('title', 'like', $_GET["search"]."%");
+            $table = $table->where('title', 'like', $_GET["search"] . "%");
         }
         $count = $table->count();
-        if(isset($_GET["order"]) && isset($_GET["dir"])){
-            $table = $table->orderBy($_GET["order"],$_GET["dir"]);
-        }else{
-            $table = $table->orderBy('updated_at','desc');
+        if (isset($_GET["order"]) && isset($_GET["dir"])) {
+            $table = $table->orderBy($_GET["order"], $_GET["dir"]);
+        } else {
+            $table = $table->orderBy('updated_at', 'desc');
         }
 
-        $table->skip($request->get('offset',0))
-              ->take($request->get('limit',1000));
+        $table->skip($request->get('offset', 0))
+            ->take($request->get('limit', 1000));
 
         $result = $table->get();
         //TODO 获取当前用户的身份
 
 
-		if($result){
-			return $this->ok(["rows"=>ShareResource::collection($result),"count"=>$count,'role'=>$role]);
-		}else{
-			return $this->error("没有查询到数据");
-		}
-
-
+        if ($result) {
+            return $this->ok(["rows" => ShareResource::collection($result), "count" => $count, 'role' => $role]);
+        } else {
+            return $this->error("没有查询到数据");
+        }
     }
 
     /**
@@ -92,18 +89,20 @@ class ShareController extends Controller
     {
         //
         foreach ($request->get('user_id') as $key => $value) {
-            # code...
-            $row = Share::where('cooperator_id',$value)
-                        ->where('res_id',$request->get('res_id'))->first();
-            if(!$row){
+            if (!Str::isUuid($value)) {
+                continue;
+            }
+            $row = Share::where('cooperator_id', $value)
+                ->where('res_id', $request->get('res_id'))->first();
+            if (!$row) {
                 $row = new Share();
                 $row->id = app('snowflake')->id();
                 $row->cooperator_id = $value;
                 $row->res_id = $request->get('res_id');
                 $row->res_type = $request->get('res_type');
-                $row->create_time = time()*1000;
+                $row->create_time = time() * 1000;
             }
-            $c_type=['user'=>0,'group'=>1];
+            $c_type = ['user' => 0, 'group' => 1];
             $row->cooperator_type = $c_type[$request->get('user_type')];
             switch ($request->get('role')) {
                 case 'manager':
@@ -114,7 +113,7 @@ class ShareController extends Controller
                     $row->power = 10;
                     break;
             }
-            $row->modify_time = time()*1000;
+            $row->modify_time = time() * 1000;
             $row->save();
         }
         return $this->ok(count($request->get('user_id')));
@@ -142,12 +141,12 @@ class ShareController extends Controller
     {
         //查询权限
         $currUser = AuthApi::current($request);
-        if(!$currUser){
+        if (!$currUser) {
             return $this->error(__('auth.failed'));
         }
 
-        $power = ShareApi::getResPower($currUser['user_uid'],$share->res_id,$share->res_type);
-        if(!$power || $power <= 20){
+        $power = ShareApi::getResPower($currUser['user_uid'], $share->res_id, $share->res_type);
+        if (!$power || $power <= 20) {
             //普通成员没有删除权限
             return $this->error(__('auth.failed'));
         }
@@ -160,7 +159,7 @@ class ShareController extends Controller
                 $share->power = 10;
                 break;
         }
-        $share->modify_time = time()*1000;
+        $share->modify_time = time() * 1000;
         $share->save();
         return $this->ok($share);
     }
@@ -176,12 +175,12 @@ class ShareController extends Controller
     {
         //查询权限
         $currUser = AuthApi::current($request);
-        if(!$currUser){
+        if (!$currUser) {
             return $this->error(__('auth.failed'));
         }
 
-        $power = ShareApi::getResPower($currUser['user_uid'],$share->res_id,$share->res_type);
-        if(!$power || $power <= 20){
+        $power = ShareApi::getResPower($currUser['user_uid'], $share->res_id, $share->res_type);
+        if (!$power || $power <= 20) {
             //普通成员没有删除权限
             return $this->error(__('auth.failed'));
         }

+ 26 - 18
api-v8/app/Http/Resources/ShareResource.php

@@ -6,6 +6,7 @@ use Illuminate\Http\Resources\Json\JsonResource;
 use App\Models\Channel;
 use App\Models\Article;
 use App\Models\Collection;
+use App\Models\Project;
 use App\Http\Api\StudioApi;
 use App\Http\Api\GroupApi;
 use App\Http\Api\UserApi;
@@ -21,32 +22,32 @@ class ShareResource extends JsonResource
     public function toArray($request)
     {
         //获取资源信息
-        $res_name="";
-        $owner="";
+        $res_name = "";
+        $owner = "";
         switch ($this->res_type) {
             case 1:
                 # PCS 文档
                 break;
             case 2:
                 # Channel 版本
-                $res = Channel::where('uid',$this->res_id)->first();
-                if($res){
+                $res = Channel::where('uid', $this->res_id)->first();
+                if ($res) {
                     $res_name = $res->name;
                     $owner = StudioApi::getById($res->owner_uid);
                 }
                 break;
             case 3:
                 # Article 文章
-                $res = Article::where('uid',$this->res_id)->first();
-                if($res){
+                $res = Article::where('uid', $this->res_id)->first();
+                if ($res) {
                     $res_name = $res->title;
                     $owner = StudioApi::getById($res->owner);
                 }
                 break;
             case 4:
                 # Collection 文集
-                $res = Collection::where('uid',$this->res_id)->first();
-                if($res){
+                $res = Collection::where('uid', $this->res_id)->first();
+                if ($res) {
                     $res_name = $res->title;
                     $owner = StudioApi::getById($res->owner);
                 }
@@ -54,20 +55,27 @@ class ShareResource extends JsonResource
             case 5:
                 # 版本片段 不支持
                 break;
+            case 6: //workflow
+                $res = Project::where('uid', $this->res_id)->first();
+                if ($res) {
+                    $res_name = $res->title;
+                    $owner = StudioApi::getById($res->owner_id);
+                }
+                break;
             default:
                 # code...
                 break;
         }
         $data = [
-            "id"=>$this->id,
-            "res_id"=> $this->res_id,
-            "res_type"=> $this->res_type,
-            "collaborator_type"=> $this->cooperator_type,
-            "power"=> $this->power,
-            'res_name'=>$res_name,
-            'owner'=>$owner,
-            "created_at"=> $this->created_at,
-            "updated_at"=> $this->updated_at,
+            "id" => $this->id,
+            "res_id" => $this->res_id,
+            "res_type" => $this->res_type,
+            "collaborator_type" => $this->cooperator_type,
+            "power" => $this->power,
+            'res_name' => $res_name,
+            'owner' => $owner,
+            "created_at" => $this->created_at,
+            "updated_at" => $this->updated_at,
         ];
         switch ($this->cooperator_type) {
             case 0:
@@ -78,7 +86,7 @@ class ShareResource extends JsonResource
                 # code...
                 $data['group'] = GroupApi::getById($this->cooperator_id);
                 break;
-            }
+        }
         return $data;
     }
 }

+ 21 - 3
dashboard-v4/dashboard/src/components/ai/AiModelList.tsx

@@ -8,6 +8,7 @@ import {
   Modal,
   message,
   Tag,
+  Space,
 } from "antd";
 import { ActionType, ProList } from "@ant-design/pro-components";
 import {
@@ -26,6 +27,8 @@ import { getSorterUrl } from "../../utils";
 import { IAiModel, IAiModelListResponse } from "../api/ai";
 import AiModelCreate from "./AiModelCreate";
 import PublicityIcon from "../studio/PublicityIcon";
+import ShareModal from "../share/ShareModal";
+import { EResType } from "../share/Share";
 
 const { Text } = Typography;
 
@@ -113,9 +116,24 @@ const AiModelList = ({ studioName }: IWidget) => {
           actions: {
             render(dom, entity, index, action, schema) {
               return (
-                <Link to={`/studio/${studioName}/ai/models/${entity.uid}/logs`}>
-                  logs
-                </Link>
+                <Space>
+                  <Link
+                    to={`/studio/${studioName}/ai/models/${entity.uid}/logs`}
+                  >
+                    logs
+                  </Link>
+                  <ShareModal
+                    trigger={
+                      <Button type="link" size="small">
+                        {intl.formatMessage({
+                          id: "buttons.share",
+                        })}
+                      </Button>
+                    }
+                    resId={entity.uid}
+                    resType={EResType.modal}
+                  />
+                </Space>
               );
             },
           },

+ 10 - 11
dashboard-v4/dashboard/src/components/share/CollaboratorAdd.tsx

@@ -43,19 +43,18 @@ const CollaboratorAddWidget = ({ resId, resType, onSuccess }: IWidget) => {
             res_id: resId,
             res_type: resType,
           };
-          console.log("create share", postData);
-          post<IShareRequest, IShareResponse>("/v2/share", postData).then(
-            (json) => {
-              console.log("add member", json);
-              if (json.ok) {
-                if (typeof onSuccess !== "undefined") {
-                  onSuccess();
-                }
-                formRef.current?.resetFields(["userId"]);
-                message.success(intl.formatMessage({ id: "flashes.success" }));
+          const url = "/v2/share";
+          console.info("share api request", url, postData);
+          post<IShareRequest, IShareResponse>(url, postData).then((json) => {
+            console.debug("share api response", json);
+            if (json.ok) {
+              if (typeof onSuccess !== "undefined") {
+                onSuccess();
               }
+              formRef.current?.resetFields(["userId"]);
+              message.success(intl.formatMessage({ id: "flashes.success" }));
             }
-          );
+          });
         }
       }}
     >

+ 2 - 0
dashboard-v4/dashboard/src/components/share/Share.tsx

@@ -16,6 +16,8 @@ export enum EResType {
   channel = 2,
   article = 3,
   collection = 4,
+  workflow = 6,
+  modal = 8,
 }
 interface IWidget {
   resId: string;

+ 14 - 1
dashboard-v4/dashboard/src/components/task/ProjectList.tsx

@@ -16,6 +16,8 @@ import ProjectCreate from "./ProjectCreate";
 import ProjectEditDrawer from "./ProjectEditDrawer";
 import User from "../auth/User";
 import TimeShow from "../general/TimeShow";
+import ShareModal from "../share/ShareModal";
+import { EResType } from "../share/Share";
 
 export interface IResNumberResponse {
   ok: boolean;
@@ -65,7 +67,7 @@ const ProjectListWidget = ({
         id: "buttons.no",
       }),
       onOk() {
-        const url = `/v2/channel/${id}`;
+        const url = `/v2/project/${id}`;
         console.log("delete api request", url);
         return delete_<IDeleteResponse>(url)
           .then((json) => {
@@ -141,6 +143,17 @@ const ProjectListWidget = ({
               <Button size="small" type="link" key="clone">
                 克隆
               </Button>,
+              <ShareModal
+                trigger={
+                  <Button type="link" size="small">
+                    {intl.formatMessage({
+                      id: "buttons.share",
+                    })}
+                  </Button>
+                }
+                resId={row.id}
+                resType={EResType.workflow}
+              />,
             ],
           },
         }}