| @@ -920,7 +920,7 @@ func CounDataByDateAndReCount(wikiCountMap map[string]int, startTime time.Time, | |||||
| CountDate = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 1, 0, 0, currentTimeNow.Location()) | CountDate = time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 0, 1, 0, 0, currentTimeNow.Location()) | ||||
| } | } | ||||
| DataDate := startTime.Format("2006-01-02") | |||||
| DataDate := CountDate.Format("2006-01-02") | |||||
| CodeMergeCountMap := queryPullRequest(start_unix, end_unix) | CodeMergeCountMap := queryPullRequest(start_unix, end_unix) | ||||
| CommitCountMap := queryCommitAction(start_unix, end_unix, 5) | CommitCountMap := queryCommitAction(start_unix, end_unix, 5) | ||||
| IssueCountMap := queryCreateIssue(start_unix, end_unix) | IssueCountMap := queryCreateIssue(start_unix, end_unix) | ||||
| @@ -1103,6 +1103,7 @@ func updateNewUserAcitivity(currentUserActivity map[int64]map[int64]int64, userA | |||||
| ",activate_regist_user=" + fmt.Sprint(useMetrics.ActivateRegistUser) + | ",activate_regist_user=" + fmt.Sprint(useMetrics.ActivateRegistUser) + | ||||
| ",not_activate_regist_user=" + fmt.Sprint(useMetrics.CurrentDayRegistUser-useMetrics.ActivateRegistUser) + | ",not_activate_regist_user=" + fmt.Sprint(useMetrics.CurrentDayRegistUser-useMetrics.ActivateRegistUser) + | ||||
| ",current_day_regist_user=" + fmt.Sprint(useMetrics.CurrentDayRegistUser) + | ",current_day_regist_user=" + fmt.Sprint(useMetrics.CurrentDayRegistUser) + | ||||
| ",data_date='" + time.Unix(key, 0).Format("2006-01-02") + "'" + | |||||
| " where count_date=" + fmt.Sprint(key) | " where count_date=" + fmt.Sprint(key) | ||||
| statictisSess.Exec(updateSql) | statictisSess.Exec(updateSql) | ||||
| @@ -1007,7 +1007,7 @@ cloudbrain.time.starttime=Start run time | |||||
| cloudbrain.time.endtime=End run time | cloudbrain.time.endtime=End run time | ||||
| cloudbrain.datasetdownload=Dataset download url | cloudbrain.datasetdownload=Dataset download url | ||||
| model_manager = Model | model_manager = Model | ||||
| model_noright=No right | |||||
| model_noright=You have no right to do the operation. | |||||
| model_rename=Duplicate model name, please modify model name. | model_rename=Duplicate model name, please modify model name. | ||||
| date=Date | date=Date | ||||
| @@ -1225,7 +1225,7 @@ model.manage.create_new_convert_task=Create Model Transformation Task | |||||
| modelconvert.manage.create_error1=A model transformation task with the same name already exists. | modelconvert.manage.create_error1=A model transformation task with the same name already exists. | ||||
| modelconvert.manage.create_error2=Only one running model transformation task can be created. | modelconvert.manage.create_error2=Only one running model transformation task can be created. | ||||
| modelconvert.manage.model_not_exist=The model does not exist. | modelconvert.manage.model_not_exist=The model does not exist. | ||||
| modelconvert.manage.no_operate_right=No operation permission. | |||||
| modelconvert.manage.no_operate_right=You have no right to do the operation. | |||||
| grampus.train_job.ai_center = AI Center | grampus.train_job.ai_center = AI Center | ||||
| grampus.dataset_path_rule = The code is storaged in /cache/code;the dataset is storaged in /cache/dataset;and please put your model into /cache/output, then you can download it online。 | grampus.dataset_path_rule = The code is storaged in /cache/code;the dataset is storaged in /cache/dataset;and please put your model into /cache/output, then you can download it online。 | ||||
| @@ -1006,7 +1006,7 @@ datasets.desc=数据集功能 | |||||
| cloudbrain_helper=使用GPU/NPU资源,开启Notebook、模型训练任务等 | cloudbrain_helper=使用GPU/NPU资源,开启Notebook、模型训练任务等 | ||||
| model_manager = 模型 | model_manager = 模型 | ||||
| model_noright=无权限操作 | |||||
| model_noright=您没有操作权限。 | |||||
| model_rename=模型名称重复,请修改模型名称 | model_rename=模型名称重复,请修改模型名称 | ||||
| @@ -1237,7 +1237,7 @@ model.manage.create_new_convert_task=创建模型转换任务 | |||||
| modelconvert.manage.create_error1=相同的名称模型转换任务已经存在。 | modelconvert.manage.create_error1=相同的名称模型转换任务已经存在。 | ||||
| modelconvert.manage.create_error2=只能创建一个正在运行的模型转换任务。 | modelconvert.manage.create_error2=只能创建一个正在运行的模型转换任务。 | ||||
| modelconvert.manage.model_not_exist=选择的模型不存在。 | modelconvert.manage.model_not_exist=选择的模型不存在。 | ||||
| modelconvert.manage.no_operate_right=无操作权限。 | |||||
| modelconvert.manage.no_operate_right=您没有操作权限。 | |||||
| grampus.train_job.ai_center=智算中心 | grampus.train_job.ai_center=智算中心 | ||||
| grampus.dataset_path_rule = 训练脚本存储在/cache/code中,数据集存储在/cache/dataset中,训练输出请存储在/cache/output中以供后续下载。 | grampus.dataset_path_rule = 训练脚本存储在/cache/code中,数据集存储在/cache/dataset中,训练输出请存储在/cache/output中以供后续下载。 | ||||
| @@ -152,6 +152,10 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||||
| } | } | ||||
| func SaveNewNameModel(ctx *context.Context) { | func SaveNewNameModel(ctx *context.Context) { | ||||
| if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
| ctx.Error(403, ctx.Tr("repo.model_noright")) | |||||
| return | |||||
| } | |||||
| name := ctx.Query("Name") | name := ctx.Query("Name") | ||||
| if name == "" { | if name == "" { | ||||
| ctx.Error(500, fmt.Sprintf("name or version is null.")) | ctx.Error(500, fmt.Sprintf("name or version is null.")) | ||||
| @@ -169,6 +173,10 @@ func SaveNewNameModel(ctx *context.Context) { | |||||
| } | } | ||||
| func SaveModel(ctx *context.Context) { | func SaveModel(ctx *context.Context) { | ||||
| if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
| ctx.Error(403, ctx.Tr("repo.model_noright")) | |||||
| return | |||||
| } | |||||
| log.Info("save model start.") | log.Info("save model start.") | ||||
| JobId := ctx.Query("JobId") | JobId := ctx.Query("JobId") | ||||
| VersionName := ctx.Query("VersionName") | VersionName := ctx.Query("VersionName") | ||||
| @@ -177,16 +185,8 @@ func SaveModel(ctx *context.Context) { | |||||
| label := ctx.Query("Label") | label := ctx.Query("Label") | ||||
| description := ctx.Query("Description") | description := ctx.Query("Description") | ||||
| engine := ctx.QueryInt("Engine") | engine := ctx.QueryInt("Engine") | ||||
| trainTaskCreate := ctx.QueryBool("trainTaskCreate") | |||||
| modelSelectedFile := ctx.Query("modelSelectedFile") | modelSelectedFile := ctx.Query("modelSelectedFile") | ||||
| log.Info("engine=" + fmt.Sprint(engine) + " modelSelectedFile=" + modelSelectedFile) | log.Info("engine=" + fmt.Sprint(engine) + " modelSelectedFile=" + modelSelectedFile) | ||||
| if !trainTaskCreate { | |||||
| if !ctx.Repo.CanWrite(models.UnitTypeModelManage) { | |||||
| //ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| ctx.JSON(403, ctx.Tr("repo.model_noright")) | |||||
| return | |||||
| } | |||||
| } | |||||
| if JobId == "" || VersionName == "" { | if JobId == "" || VersionName == "" { | ||||
| ctx.Error(500, fmt.Sprintf("JobId or VersionName is null.")) | ctx.Error(500, fmt.Sprintf("JobId or VersionName is null.")) | ||||
| @@ -636,6 +636,7 @@ func CloudBrainTrainJobShow(ctx *context.Context) { | |||||
| func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.JobType) { | func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.JobType) { | ||||
| ctx.Data["PageIsCloudBrain"] = true | ctx.Data["PageIsCloudBrain"] = true | ||||
| debugListType := ctx.Query("debugListType") | debugListType := ctx.Query("debugListType") | ||||
| cloudbrain.InitSpecialPool() | |||||
| var task *models.Cloudbrain | var task *models.Cloudbrain | ||||
| var err error | var err error | ||||
| @@ -647,22 +648,22 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| if err != nil { | if err != nil { | ||||
| log.Info("error:" + err.Error()) | log.Info("error:" + err.Error()) | ||||
| ctx.Data["error"] = err.Error() | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| result, err := cloudbrain.GetJob(task.JobID) | result, err := cloudbrain.GetJob(task.JobID) | ||||
| if err != nil { | if err != nil { | ||||
| log.Info("error:" + err.Error()) | log.Info("error:" + err.Error()) | ||||
| ctx.Data["error"] = err.Error() | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| hasSpec := false | |||||
| if task.JobType == string(models.JobTypeTrain) { | if task.JobType == string(models.JobTypeTrain) { | ||||
| if cloudbrain.TrainResourceSpecs == nil { | if cloudbrain.TrainResourceSpecs == nil { | ||||
| json.Unmarshal([]byte(setting.TrainResourceSpecs), &cloudbrain.TrainResourceSpecs) | json.Unmarshal([]byte(setting.TrainResourceSpecs), &cloudbrain.TrainResourceSpecs) | ||||
| } | } | ||||
| hasSpec := false | |||||
| for _, tmp := range cloudbrain.TrainResourceSpecs.ResourceSpec { | for _, tmp := range cloudbrain.TrainResourceSpecs.ResourceSpec { | ||||
| if tmp.Id == task.ResourceSpecId { | if tmp.Id == task.ResourceSpecId { | ||||
| hasSpec = true | hasSpec = true | ||||
| @@ -670,24 +671,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| ctx.Data["CpuNum"] = tmp.CpuNum | ctx.Data["CpuNum"] = tmp.CpuNum | ||||
| ctx.Data["MemMiB"] = tmp.MemMiB | ctx.Data["MemMiB"] = tmp.MemMiB | ||||
| ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ||||
| } | |||||
| } | |||||
| if !hasSpec && cloudbrain.SpecialPools != nil { | |||||
| for _, specialPool := range cloudbrain.SpecialPools.Pools { | |||||
| if specialPool.ResourceSpec != nil { | |||||
| for _, spec := range specialPool.ResourceSpec { | |||||
| if task.ResourceSpecId == spec.Id { | |||||
| ctx.Data["GpuNum"] = spec.GpuNum | |||||
| ctx.Data["CpuNum"] = spec.CpuNum | |||||
| ctx.Data["MemMiB"] = spec.MemMiB | |||||
| ctx.Data["ShareMemMiB"] = spec.ShareMemMiB | |||||
| break | |||||
| } | |||||
| } | |||||
| } | |||||
| break | |||||
| } | } | ||||
| } | } | ||||
| @@ -697,10 +681,12 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| } | } | ||||
| for _, tmp := range cloudbrain.InferenceResourceSpecs.ResourceSpec { | for _, tmp := range cloudbrain.InferenceResourceSpecs.ResourceSpec { | ||||
| if tmp.Id == task.ResourceSpecId { | if tmp.Id == task.ResourceSpecId { | ||||
| hasSpec = true | |||||
| ctx.Data["GpuNum"] = tmp.GpuNum | ctx.Data["GpuNum"] = tmp.GpuNum | ||||
| ctx.Data["CpuNum"] = tmp.CpuNum | ctx.Data["CpuNum"] = tmp.CpuNum | ||||
| ctx.Data["MemMiB"] = tmp.MemMiB | ctx.Data["MemMiB"] = tmp.MemMiB | ||||
| ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ||||
| break | |||||
| } | } | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -709,10 +695,32 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| } | } | ||||
| for _, tmp := range cloudbrain.ResourceSpecs.ResourceSpec { | for _, tmp := range cloudbrain.ResourceSpecs.ResourceSpec { | ||||
| if tmp.Id == task.ResourceSpecId { | if tmp.Id == task.ResourceSpecId { | ||||
| hasSpec = true | |||||
| ctx.Data["GpuNum"] = tmp.GpuNum | ctx.Data["GpuNum"] = tmp.GpuNum | ||||
| ctx.Data["CpuNum"] = tmp.CpuNum | ctx.Data["CpuNum"] = tmp.CpuNum | ||||
| ctx.Data["MemMiB"] = tmp.MemMiB | ctx.Data["MemMiB"] = tmp.MemMiB | ||||
| ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ctx.Data["ShareMemMiB"] = tmp.ShareMemMiB | ||||
| break | |||||
| } | |||||
| } | |||||
| } | |||||
| if !hasSpec && cloudbrain.SpecialPools != nil { | |||||
| for _, specialPool := range cloudbrain.SpecialPools.Pools { | |||||
| if specialPool.ResourceSpec != nil { | |||||
| for _, spec := range specialPool.ResourceSpec { | |||||
| if task.ResourceSpecId == spec.Id { | |||||
| ctx.Data["GpuNum"] = spec.GpuNum | |||||
| ctx.Data["CpuNum"] = spec.CpuNum | |||||
| ctx.Data["MemMiB"] = spec.MemMiB | |||||
| ctx.Data["ShareMemMiB"] = spec.ShareMemMiB | |||||
| break | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -731,14 +739,6 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| ctx.Data["resource_type"] = resourceType.Value | ctx.Data["resource_type"] = resourceType.Value | ||||
| } | } | ||||
| } | } | ||||
| for _, specialPool := range cloudbrain.SpecialPools.Pools { | |||||
| for _, resourceType := range specialPool.Pool { | |||||
| if resourceType.Queue == jobRes.Config.GpuType { | |||||
| ctx.Data["resource_type"] = resourceType.Value | |||||
| } | |||||
| } | |||||
| } | |||||
| } else if task.JobType == string(models.JobTypeInference) { | } else if task.JobType == string(models.JobTypeInference) { | ||||
| if inferenceGpuInfos == nil { | if inferenceGpuInfos == nil { | ||||
| @@ -770,6 +770,16 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName, jobType models.Jo | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if cloudbrain.SpecialPools != nil { | |||||
| for _, specialPool := range cloudbrain.SpecialPools.Pools { | |||||
| for _, resourceType := range specialPool.Pool { | |||||
| if resourceType.Queue == jobRes.Config.GpuType { | |||||
| ctx.Data["resource_type"] = resourceType.Value | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| taskRoles := jobRes.TaskRoles | taskRoles := jobRes.TaskRoles | ||||
| taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) | taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) | ||||
| ctx.Data["taskRes"] = taskRes | ctx.Data["taskRes"] = taskRes | ||||
| @@ -895,6 +905,20 @@ func CloudBrainCommitImageShow(ctx *context.Context) { | |||||
| ctx.HTML(200, tplCloudBrainImageSubmit) | ctx.HTML(200, tplCloudBrainImageSubmit) | ||||
| } | } | ||||
| func GetImage(ctx *context.Context) { | |||||
| var ID = ctx.Params(":id") | |||||
| id, _ := strconv.ParseInt(ID, 10, 64) | |||||
| image, err := models.GetImageByID(id) | |||||
| if err != nil { | |||||
| log.Error("GetImageByID failed:%v", err.Error()) | |||||
| ctx.JSON(http.StatusNotFound, nil) | |||||
| } | |||||
| ctx.JSON(http.StatusOK, image) | |||||
| } | |||||
| func CloudBrainImageEdit(ctx *context.Context) { | func CloudBrainImageEdit(ctx *context.Context) { | ||||
| ctx.Data["PageIsImageEdit"] = true | ctx.Data["PageIsImageEdit"] = true | ||||
| ctx.Data["PageFrom"] = ctx.Params(":from") | ctx.Data["PageFrom"] = ctx.Params(":from") | ||||
| @@ -626,7 +626,7 @@ func GrampusTrainJobShow(ctx *context.Context) { | |||||
| task, err := models.GetCloudbrainByJobIDWithDeleted(ctx.Params(":jobid")) | task, err := models.GetCloudbrainByJobIDWithDeleted(ctx.Params(":jobid")) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetCloudbrainByJobID failed:" + err.Error()) | log.Error("GetCloudbrainByJobID failed:" + err.Error()) | ||||
| ctx.ServerError("system error", err) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| @@ -634,8 +634,8 @@ func GrampusTrainJobShow(ctx *context.Context) { | |||||
| result, err := grampus.GetJob(task.JobID) | result, err := grampus.GetJob(task.JobID) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetJob failed:" + err.Error()) | log.Error("GetJob failed:" + err.Error()) | ||||
| //ctx.ServerError("GetJob failed", err) | |||||
| //return | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | |||||
| } | } | ||||
| if result != nil { | if result != nil { | ||||
| @@ -257,15 +257,15 @@ func NotebookShow(ctx *context.Context) { | |||||
| var ID = ctx.Params(":id") | var ID = ctx.Params(":id") | ||||
| task, err := models.GetCloudbrainByIDWithDeleted(ID) | task, err := models.GetCloudbrainByIDWithDeleted(ID) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Data["error"] = err.Error() | |||||
| ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil) | |||||
| log.Error("GET job error", err.Error()) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| result, err := modelarts.GetNotebook2(task.JobID) | result, err := modelarts.GetNotebook2(task.JobID) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Data["error"] = err.Error() | |||||
| ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil) | |||||
| log.Error("GET job error", err.Error()) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| @@ -276,8 +276,8 @@ func NotebookShow(ctx *context.Context) { | |||||
| models.ParseAndSetDurationFromModelArtsNotebook(result, task) | models.ParseAndSetDurationFromModelArtsNotebook(result, task) | ||||
| err = models.UpdateJob(task) | err = models.UpdateJob(task) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.Data["error"] = err.Error() | |||||
| ctx.RenderWithErr(err.Error(), tplModelArtsNotebookShow, nil) | |||||
| log.Error("GET job error", err.Error()) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| } | } | ||||
| @@ -1643,7 +1643,11 @@ func TrainJobShow(ctx *context.Context) { | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetVersionListTasks(%s) failed:%v", jobID, err.Error()) | log.Error("GetVersionListTasks(%s) failed:%v", jobID, err.Error()) | ||||
| ctx.RenderWithErr(err.Error(), tplModelArtsTrainJobShow, nil) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | |||||
| } | |||||
| if len(VersionListTasks) == 0 { | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| //设置权限 | //设置权限 | ||||
| @@ -2297,7 +2301,7 @@ func InferenceJobShow(ctx *context.Context) { | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("GetInferenceTask(%s) failed:%v", jobID, err.Error()) | log.Error("GetInferenceTask(%s) failed:%v", jobID, err.Error()) | ||||
| ctx.RenderWithErr(err.Error(), tplModelArtsInferenceJobShow, nil) | |||||
| ctx.NotFound(ctx.Req.URL.RequestURI(), nil) | |||||
| return | return | ||||
| } | } | ||||
| //设置权限 | //设置权限 | ||||
| @@ -1016,6 +1016,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| }, context.RepoAssignment(), context.RepoMustNotBeArchived(), reqRepoAdmin) | }, context.RepoAssignment(), context.RepoMustNotBeArchived(), reqRepoAdmin) | ||||
| m.Group("/image/:id", func() { | m.Group("/image/:id", func() { | ||||
| m.Get("", repo.GetImage) | |||||
| m.Get("/:from", cloudbrain.AdminOrImageCreaterRight, repo.CloudBrainImageEdit) | m.Get("/:from", cloudbrain.AdminOrImageCreaterRight, repo.CloudBrainImageEdit) | ||||
| m.Post("", cloudbrain.AdminOrImageCreaterRight, bindIgnErr(auth.EditImageCloudBrainForm{}), repo.CloudBrainImageEditPost) | m.Post("", cloudbrain.AdminOrImageCreaterRight, bindIgnErr(auth.EditImageCloudBrainForm{}), repo.CloudBrainImageEditPost) | ||||
| m.Delete("", cloudbrain.AdminOrImageCreaterRight, repo.CloudBrainImageDelete) | m.Delete("", cloudbrain.AdminOrImageCreaterRight, repo.CloudBrainImageDelete) | ||||
| @@ -35,7 +35,7 @@ | |||||
| {{range .Datasets}} | {{range .Datasets}} | ||||
| <tr> | <tr> | ||||
| <td>{{.ID}}</td> | <td>{{.ID}}</td> | ||||
| <td style="display: flex;align-items: center;"><a href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Alias}}/datasets">{{.Title}}</a>{{if .Recommend}}<img src="/img/jian.svg" style="margin-left: 0.5rem;">{{end}}</td> | |||||
| <td style="display: flex;align-items: center;"><a href="{{AppSubUrl}}/{{.Repo.OwnerName}}/{{.Repo.Name}}/datasets">{{.Title}}</a>{{if .Recommend}}<img src="/img/jian.svg" style="margin-left: 0.5rem;">{{end}}</td> | |||||
| <td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> | <td><i class="fa fa{{if .IsPrivate}}-check{{end}}-square-o"></i></td> | ||||
| <td><span title="{{.CreatedUnix.FormatLong}}">{{.CreatedUnix.FormatShort}}</span></td> | <td><span title="{{.CreatedUnix.FormatLong}}">{{.CreatedUnix.FormatShort}}</span></td> | ||||
| <td>{{if .Recommend}}<span class="set_dataset" style="color: rgb(250, 140, 22);cursor: pointer;" data-url="{{$.Link}}/{{.ID}}/action/unrecommend">{{$.i18n.Tr "admin.datasets.unrecommend"}}</span>{{else}}<span class="set_dataset" style="color: rgb(19, 194, 141);cursor: pointer;" data-url="{{$.Link}}/{{.ID}}/action/recommend">{{$.i18n.Tr "admin.datasets.recommend"}}</span>{{end}}</td> | <td>{{if .Recommend}}<span class="set_dataset" style="color: rgb(250, 140, 22);cursor: pointer;" data-url="{{$.Link}}/{{.ID}}/action/unrecommend">{{$.i18n.Tr "admin.datasets.unrecommend"}}</span>{{else}}<span class="set_dataset" style="color: rgb(19, 194, 141);cursor: pointer;" data-url="{{$.Link}}/{{.ID}}/action/recommend">{{$.i18n.Tr "admin.datasets.recommend"}}</span>{{end}}</td> | ||||
| @@ -48,4 +48,4 @@ | |||||
| {{template "base/paginate" .}} | {{template "base/paginate" .}} | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | |||||
| {{template "base/footer" .}} | |||||
| @@ -24,9 +24,9 @@ | |||||
| <div class="ui sixteen wide mobile ten wide tablet ten wide computer colum"> | <div class="ui sixteen wide mobile ten wide tablet ten wide computer colum"> | ||||
| {{range .Datasets}} | {{range .Datasets}} | ||||
| <div class="item"> | <div class="item"> | ||||
| <div class="ui header"> | |||||
| <a class="name" href="{{.Repo.Link}}/datasets"> | |||||
| {{.Repo.OwnerName}} / {{.Repo.Alias}} | |||||
| <div class="ui header" style="display: flex;"> | |||||
| <a class="name dataset-title-a" title="{{.Title}}" href="{{.Repo.Link}}/datasets"> | |||||
| {{.Title}} | |||||
| </a> | </a> | ||||
| <div class="ui right metas"> | <div class="ui right metas"> | ||||
| {{if .Task}} | {{if .Task}} | ||||
| @@ -40,7 +40,7 @@ | |||||
| </div> | </div> | ||||
| <div class="description"> | <div class="description"> | ||||
| {{if .Description}} | {{if .Description}} | ||||
| <p class="has-emoji">{{.Description}}</p> | |||||
| <p class="has-emoji" style="word-break: break-all;">{{.Description}}</p> | |||||
| {{else if .Repo.DescriptionHTML}} | {{else if .Repo.DescriptionHTML}} | ||||
| <p class="has-emoji">{{.Repo.DescriptionHTML}}</p> | <p class="has-emoji">{{.Repo.DescriptionHTML}}</p> | ||||
| {{end}} | {{end}} | ||||
| @@ -53,4 +53,7 @@ | |||||
| </div> | </div> | ||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| </div> | |||||
| </div> | |||||
| <script> | |||||
| console.log({{.Datasets}}) | |||||
| </script> | |||||
| @@ -48,7 +48,7 @@ | |||||
| <button class="ui green button"> | <button class="ui green button"> | ||||
| {{.i18n.Tr "org.create_org"}} | {{.i18n.Tr "org.create_org"}} | ||||
| </button> | </button> | ||||
| <a class="ui button" href="{{AppSubUrl}}/">{{.i18n.Tr "cancel"}}</a> | |||||
| <a class="ui button" href="javascript:history.go(-1)">{{.i18n.Tr "cancel"}}</a> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </form> | </form> | ||||
| @@ -353,7 +353,15 @@ | |||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | ||||
| {{.Image}} | |||||
| <span class="ui poping up clipboard" title="{{.Image}}" data-position="top center" id="clipboard-btn" style="cursor:pointer" | |||||
| data-clipboard-text="{{.Image}}" | |||||
| data-success="{{$.i18n.Tr "repo.copy_link_success"}}" | |||||
| data-error="{{$.i18n.Tr "repo.copy_link_error"}}" | |||||
| data-content="{{$.i18n.Tr "repo.copy_link"}}" | |||||
| data-variation="inverted tiny" | |||||
| > | |||||
| {{.Image}} | |||||
| </span> | |||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -421,7 +421,7 @@ | |||||
| identifier : 'display_job_name', | identifier : 'display_job_name', | ||||
| rules: [ | rules: [ | ||||
| { | { | ||||
| type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[^-]$/]', | |||||
| type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[a-zA-Z0-9_]$/]', | |||||
| } | } | ||||
| ] | ] | ||||
| }, | }, | ||||
| @@ -472,9 +472,9 @@ | |||||
| document.getElementById("mask").style.display = "none" | document.getElementById("mask").style.display = "none" | ||||
| } | } | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| send_run_para() | send_run_para() | ||||
| get_name() | get_name() | ||||
| validate() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -381,7 +381,15 @@ | |||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | ||||
| {{.Image}} | |||||
| <span class="ui poping up clipboard" title="{{.Image}}" data-position="top center" id="clipboard-btn" style="cursor:pointer" | |||||
| data-clipboard-text="{{.Image}}" | |||||
| data-success="{{$.i18n.Tr "repo.copy_link_success"}}" | |||||
| data-error="{{$.i18n.Tr "repo.copy_link_error"}}" | |||||
| data-content="{{$.i18n.Tr "repo.copy_link"}}" | |||||
| data-variation="inverted tiny" | |||||
| > | |||||
| {{.Image}} | |||||
| </span> | |||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -294,6 +294,27 @@ | |||||
| context.value = '' | context.value = '' | ||||
| $(".icon.icons").css("visibility", "hidden") | $(".icon.icons").css("visibility", "hidden") | ||||
| } | } | ||||
| function validate(){ | |||||
| $('.ui.form').form({ | |||||
| on: 'blur', | |||||
| fields: { | |||||
| display_job_name:{ | |||||
| identifier : 'display_job_name', | |||||
| rules: [ | |||||
| { | |||||
| type: 'regExp[/^[a-z0-9][a-z0-9-_]{1,34}[a-z0-9-]$/]', | |||||
| } | |||||
| ] | |||||
| }, | |||||
| }, | |||||
| onSuccess: function(){ | |||||
| }, | |||||
| onFailure: function(e){ | |||||
| return false; | |||||
| } | |||||
| }) | |||||
| } | |||||
| validate(); | |||||
| form.onsubmit = function (e) { | form.onsubmit = function (e) { | ||||
| let value_task = $("input[name='display_job_name']").val() | let value_task = $("input[name='display_job_name']").val() | ||||
| let value_image = $("input[name='image']").val() | let value_image = $("input[name='image']").val() | ||||
| @@ -390,7 +390,15 @@ | |||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | ||||
| {{.Image}} | |||||
| <span class="ui poping up clipboard" title="{{.Image}}" data-position="top center" id="clipboard-btn" style="cursor:pointer" | |||||
| data-clipboard-text="{{.Image}}" | |||||
| data-success="{{$.i18n.Tr "repo.copy_link_success"}}" | |||||
| data-error="{{$.i18n.Tr "repo.copy_link_error"}}" | |||||
| data-content="{{$.i18n.Tr "repo.copy_link"}}" | |||||
| data-variation="inverted tiny" | |||||
| > | |||||
| {{.Image}} | |||||
| </span> | |||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -483,9 +483,9 @@ | |||||
| $("input#ai_flaver_name").val(name2) | $("input#ai_flaver_name").val(name2) | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function (e) { | $('.ui.create_train_job.green.button').click(function (e) { | ||||
| get_name() | get_name() | ||||
| send_run_para() | |||||
| validate() | |||||
| send_run_para() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -384,7 +384,15 @@ | |||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | ||||
| {{.Image}} | |||||
| <span class="ui poping up clipboard" title="{{.Image}}" data-position="top center" id="clipboard-btn" style="cursor:pointer" | |||||
| data-clipboard-text="{{.Image}}" | |||||
| data-success="{{$.i18n.Tr "repo.copy_link_success"}}" | |||||
| data-error="{{$.i18n.Tr "repo.copy_link_error"}}" | |||||
| data-content="{{$.i18n.Tr "repo.copy_link"}}" | |||||
| data-variation="inverted tiny" | |||||
| > | |||||
| {{.Image}} | |||||
| </span> | |||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -176,7 +176,7 @@ | |||||
| <button class="ui green button" id="submit_reponame"> | <button class="ui green button" id="submit_reponame"> | ||||
| {{.i18n.Tr "repo.create_repo"}} | {{.i18n.Tr "repo.create_repo"}} | ||||
| </button> | </button> | ||||
| <a class="ui button" href="{{AppSubUrl}}/">{{.i18n.Tr "cancel"}}</a> | |||||
| <a class="ui button" href="javascript:history.go(-1)">{{.i18n.Tr "cancel"}}</a> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </form> | </form> | ||||
| @@ -386,7 +386,7 @@ | |||||
| {{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
| {{if .CanDel}} | {{if .CanDel}} | ||||
| <a id="ai-stop-{{.Cloudbrain.ID}}" | <a id="ai-stop-{{.Cloudbrain.ID}}" | ||||
| class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED" "CREATE_FAILED"}}disabled {{else}}blue {{end}}button' | |||||
| class='ui basic ai_stop {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "STOPPING" "CREATING" "STARTING" "SUCCEEDED" "CREATE_FAILED" "DELETED"}}disabled {{else}}blue {{end}}button' | |||||
| data-repopath="{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.Cloudbrain.ID}}/stop" | data-repopath="{{$.RepoLink}}{{if eq .ComputeResource "CPU/GPU"}}/cloudbrain{{else}}/modelarts/notebook{{end}}/{{.Cloudbrain.ID}}/stop" | ||||
| data-jobid="{{.Cloudbrain.ID}}"> | data-jobid="{{.Cloudbrain.ID}}"> | ||||
| {{$.i18n.Tr "repo.stop"}} | {{$.i18n.Tr "repo.stop"}} | ||||
| @@ -405,7 +405,7 @@ | |||||
| {{$.CsrfTokenHtml}} | {{$.CsrfTokenHtml}} | ||||
| {{if .CanDel}} | {{if .CanDel}} | ||||
| <a id="ai-delete-{{.Cloudbrain.ID}}" | <a id="ai-delete-{{.Cloudbrain.ID}}" | ||||
| class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED" "CREATE_FAILED"}}blue {{else}}disabled {{end}}button' | |||||
| class='ui basic ai_delete {{if eq .Status "STOPPED" "FAILED" "START_FAILED" "SUCCEEDED" "CREATE_FAILED" "DELETED"}}blue {{else}}disabled {{end}}button' | |||||
| style="border-radius: .28571429rem;"> | style="border-radius: .28571429rem;"> | ||||
| {{$.i18n.Tr "repo.delete"}} | {{$.i18n.Tr "repo.delete"}} | ||||
| </a> | </a> | ||||
| @@ -427,6 +427,7 @@ | |||||
| {{if .CanDebug}} | {{if .CanDebug}} | ||||
| <a id="model-image-{{.Cloudbrain.ID}}" | <a id="model-image-{{.Cloudbrain.ID}}" | ||||
| class='imageBtn ui basic {{if ne .Status "RUNNING"}}disabled {{else}}blue {{end}}button' | class='imageBtn ui basic {{if ne .Status "RUNNING"}}disabled {{else}}blue {{end}}button' | ||||
| target="_blank" | |||||
| href="{{$.RepoLink}}/cloudbrain/{{.Cloudbrain.ID}}/commit_image">{{$.i18n.Tr "repo.submit_image"}}</a> | href="{{$.RepoLink}}/cloudbrain/{{.Cloudbrain.ID}}/commit_image">{{$.i18n.Tr "repo.submit_image"}}</a> | ||||
| {{else}} | {{else}} | ||||
| <a | <a | ||||
| @@ -433,9 +433,9 @@ | |||||
| $("input#ai_flavor_name").val(name2) | $("input#ai_flavor_name").val(name2) | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| get_name() | get_name() | ||||
| send_run_para() | send_run_para() | ||||
| validate() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -425,9 +425,9 @@ | |||||
| $("input#trainjob_work_server_num").val(val_server_num_select) | $("input#trainjob_work_server_num").val(val_server_num_select) | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| get_name() | get_name() | ||||
| send_run_para() | send_run_para() | ||||
| validate() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -11,7 +11,7 @@ | |||||
| {{template "base/alert" .}} | {{template "base/alert" .}} | ||||
| <div class="inline required field {{if .Err_CloneAddr}}error{{end}}"> | <div class="inline required field {{if .Err_CloneAddr}}error{{end}}"> | ||||
| <label for="clone_addr">{{.i18n.Tr "repo.migrate.clone_address"}}</label> | <label for="clone_addr">{{.i18n.Tr "repo.migrate.clone_address"}}</label> | ||||
| <input id="clone_addr" name="clone_addr" value="{{.clone_addr}}" autofocus required> | |||||
| <input id="clone_addr" name="clone_addr" value="{{.clone_addr}}" autofocus required autocomplete="off" /> | |||||
| <span class="help"> | <span class="help"> | ||||
| {{.i18n.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.i18n.Tr "repo.migrate.clone_local_path"}}{{end}} | {{.i18n.Tr "repo.migrate.clone_address_desc"}}{{if .ContextUser.CanImportLocal}} {{.i18n.Tr "repo.migrate.clone_local_path"}}{{end}} | ||||
| <br/>{{.i18n.Tr "repo.migrate.migrate_items_options"}} | <br/>{{.i18n.Tr "repo.migrate.migrate_items_options"}} | ||||
| @@ -102,7 +102,7 @@ | |||||
| <button class="ui green button" id="submit_reponame"> | <button class="ui green button" id="submit_reponame"> | ||||
| {{.i18n.Tr "repo.migrate_repo"}} | {{.i18n.Tr "repo.migrate_repo"}} | ||||
| </button> | </button> | ||||
| <a class="ui button" href="{{AppSubUrl}}/">{{.i18n.Tr "cancel"}}</a> | |||||
| <a class="ui button" href="javascript:history.go(-1)">{{.i18n.Tr "cancel"}}</a> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </form> | </form> | ||||
| @@ -438,7 +438,7 @@ | |||||
| identifier : 'display_job_name', | identifier : 'display_job_name', | ||||
| rules: [ | rules: [ | ||||
| { | { | ||||
| type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[^-]$/]', | |||||
| type: 'regExp[/^[a-zA-Z0-9-_]{1,64}[a-zA-Z0-9_]$/]', | |||||
| } | } | ||||
| ] | ] | ||||
| }, | }, | ||||
| @@ -489,9 +489,9 @@ | |||||
| document.getElementById("mask").style.display = "none" | document.getElementById("mask").style.display = "none" | ||||
| } | } | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function(e) { | $('.ui.create_train_job.green.button').click(function(e) { | ||||
| send_run_para() | send_run_para() | ||||
| get_name() | get_name() | ||||
| validate() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -110,6 +110,28 @@ | |||||
| $('#messageInfo').css('display','none') | $('#messageInfo').css('display','none') | ||||
| function validate(){ | |||||
| $('.ui.form').form({ | |||||
| on: 'blur', | |||||
| fields: { | |||||
| display_job_name:{ | |||||
| identifier : 'display_job_name', | |||||
| rules: [ | |||||
| { | |||||
| type: 'regExp[/^[a-z0-9][a-z0-9-_]{1,36}$/]', | |||||
| } | |||||
| ] | |||||
| }, | |||||
| }, | |||||
| onSuccess: function(){ | |||||
| }, | |||||
| onFailure: function(e){ | |||||
| return false; | |||||
| } | |||||
| }) | |||||
| } | |||||
| validate(); | |||||
| form.onsubmit = function(e){ | form.onsubmit = function(e){ | ||||
| let value_task = $("input[name='display_job_name']").val() | let value_task = $("input[name='display_job_name']").val() | ||||
| @@ -357,7 +357,15 @@ | |||||
| <td class="ti-text-form-content"> | <td class="ti-text-form-content"> | ||||
| <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | <div class="text-span text-span-w" id="{{.VersionName}}-mirror"> | ||||
| {{.Image}} | |||||
| <span class="ui poping up clipboard" title="{{.Image}}" data-position="top center" id="clipboard-btn" style="cursor:pointer" | |||||
| data-clipboard-text="{{.Image}}" | |||||
| data-success="{{$.i18n.Tr "repo.copy_link_success"}}" | |||||
| data-error="{{$.i18n.Tr "repo.copy_link_error"}}" | |||||
| data-content="{{$.i18n.Tr "repo.copy_link"}}" | |||||
| data-variation="inverted tiny" | |||||
| > | |||||
| {{.Image}} | |||||
| </span> | |||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -500,9 +500,9 @@ | |||||
| $("input#trainjob_work_server_num").val(val_server_num_select) | $("input#trainjob_work_server_num").val(val_server_num_select) | ||||
| } | } | ||||
| validate(); | |||||
| $('.ui.create_train_job.green.button').click(function (e) { | $('.ui.create_train_job.green.button').click(function (e) { | ||||
| get_name() | get_name() | ||||
| send_run_para() | send_run_para() | ||||
| validate() | |||||
| }) | }) | ||||
| </script> | </script> | ||||
| @@ -270,7 +270,7 @@ | |||||
| {{end}} | {{end}} | ||||
| {{if .CanDel}} | {{if .CanDel}} | ||||
| <a class="ti-action-menu-item stop-show-version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED"}}disabled {{end}}" | |||||
| <a class="ti-action-menu-item stop-show-version {{if eq .Status "KILLED" "FAILED" "START_FAILED" "KILLING" "COMPLETED" "SUCCEEDED" "STOPPED"}}disabled {{end}}" | |||||
| id="{{.VersionName}}-stop" | id="{{.VersionName}}-stop" | ||||
| data-jobid="{{.JobID}}" | data-jobid="{{.JobID}}" | ||||
| data-repopath="{{$.RepoRelPath}}/modelarts/train-job" | data-repopath="{{$.RepoRelPath}}/modelarts/train-job" | ||||
| @@ -478,7 +478,7 @@ | |||||
| } | } | ||||
| function loadModelList(){ | function loadModelList(){ | ||||
| $.get(`${repolink}/modelmanage/query_model_for_predict?repoId=${repoId}`, (data) => { | |||||
| $.get(`${repolink}/modelmanage/query_model_for_predict?repoId=${repoId}&type=-1`, (data) => { | |||||
| modelData = data | modelData = data | ||||
| let nameList = data.nameList | let nameList = data.nameList | ||||
| const n_length = nameList.length | const n_length = nameList.length | ||||
| @@ -6,7 +6,8 @@ | |||||
| text-align: right; | text-align: right; | ||||
| } | } | ||||
| .inline .ui.dropdown .text { | .inline .ui.dropdown .text { | ||||
| color: rgba(0, 0, 0, .87) !important | |||||
| color: rgba(0, 0, 0, .87) !important; | |||||
| max-width: 360px; | |||||
| } | } | ||||
| .newtext{ | .newtext{ | ||||
| left: 15px !important | left: 15px !important | ||||
| @@ -361,4 +361,4 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | |||||
| {{template "base/footer" .}} | |||||
| @@ -6,7 +6,7 @@ | |||||
| ref="table" | ref="table" | ||||
| :data="tableData" | :data="tableData" | ||||
| style="min-width: 100%" | style="min-width: 100%" | ||||
| row-key="ID" | |||||
| row-key="rowKey" | |||||
| lazy | lazy | ||||
| :load="load" | :load="load" | ||||
| :tree-props="{children: 'Children', hasChildren: 'hasChildren'}" | :tree-props="{children: 'Children', hasChildren: 'hasChildren'}" | ||||
| @@ -171,6 +171,7 @@ export default { | |||||
| tableData[i].EngineName = this.getEngineName(tableData[i]) | tableData[i].EngineName = this.getEngineName(tableData[i]) | ||||
| tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | ||||
| tableData[i].cName=tableData[i].Name | tableData[i].cName=tableData[i].Name | ||||
| tableData[i].rowKey = tableData[i].ID + Math.random() | |||||
| tableData[i].Name='' | tableData[i].Name='' | ||||
| tableData[i].VersionCount = '' | tableData[i].VersionCount = '' | ||||
| tableData[i].Children = true | tableData[i].Children = true | ||||
| @@ -310,18 +311,18 @@ export default { | |||||
| const store = this.$refs.table.store | const store = this.$refs.table.store | ||||
| if(!this.loadNodeMap.get(row.cName)){ | if(!this.loadNodeMap.get(row.cName)){ | ||||
| const parent = store.states.data | const parent = store.states.data | ||||
| const index = parent.findIndex(child => child.ID == row.ID) | |||||
| const index = parent.findIndex(child => child.rowKey == row.rowKey) | |||||
| this.getModelList() | this.getModelList() | ||||
| }else{ | }else{ | ||||
| let {tree,treeNode,resolve} = this.loadNodeMap.get(row.cName) | let {tree,treeNode,resolve} = this.loadNodeMap.get(row.cName) | ||||
| const keys = Object.keys(store.states.lazyTreeNodeMap); | const keys = Object.keys(store.states.lazyTreeNodeMap); | ||||
| if(keys.includes(row.ID)){ | |||||
| if(keys.includes(row.rowKey)){ | |||||
| this.getModelList() | this.getModelList() | ||||
| }else{ | }else{ | ||||
| let parentRow = store.states.data.find(child => child.cName == row.cName); | let parentRow = store.states.data.find(child => child.cName == row.cName); | ||||
| let childrenIndex = store.states.lazyTreeNodeMap[parentRow.ID].findIndex(child => child.ID == row.ID) | |||||
| let childrenIndex = store.states.lazyTreeNodeMap[parentRow.rowKey].findIndex(child => child.rowKey == row.rowKey) | |||||
| parentRow.VersionCount = parentRow.VersionCount-1 | parentRow.VersionCount = parentRow.VersionCount-1 | ||||
| const parent = store.states.lazyTreeNodeMap[parentRow.ID] | |||||
| const parent = store.states.lazyTreeNodeMap[parentRow.rowKey] | |||||
| if(parent.length===1){ | if(parent.length===1){ | ||||
| this.getModelList() | this.getModelList() | ||||
| }else{ | }else{ | ||||
| @@ -379,8 +380,8 @@ export default { | |||||
| } | } | ||||
| }, | }, | ||||
| getModelList(){ | getModelList(){ | ||||
| try { | |||||
| this.$refs.table.store.states.lazyTreeNodeMap = {} | |||||
| try { | |||||
| this.loadNodeMap.clear(); | |||||
| this.$axios.get(location.href+'_api',{ | this.$axios.get(location.href+'_api',{ | ||||
| params:this.params | params:this.params | ||||
| }).then((res)=>{ | }).then((res)=>{ | ||||
| @@ -391,6 +392,7 @@ export default { | |||||
| for(let i=0;i<this.tableData.length;i++){ | for(let i=0;i<this.tableData.length;i++){ | ||||
| TrainTaskInfo = JSON.parse(this.tableData[i].TrainTaskInfo) | TrainTaskInfo = JSON.parse(this.tableData[i].TrainTaskInfo) | ||||
| this.tableData[i].cName=this.tableData[i].Name | this.tableData[i].cName=this.tableData[i].Name | ||||
| this.tableData[i].rowKey=this.tableData[i].ID + Math.random() | |||||
| this.tableData[i].EngineName = this.getEngineName(this.tableData[i]) | this.tableData[i].EngineName = this.getEngineName(this.tableData[i]) | ||||
| this.tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | this.tableData[i].ComputeResource = TrainTaskInfo.ComputeResource | ||||
| this.tableData[i].hasChildren = res.data.data[i].VersionCount===1 ? false : true | this.tableData[i].hasChildren = res.data.data[i].VersionCount===1 ? false : true | ||||
| @@ -215,16 +215,16 @@ | |||||
| <div style="display:flex;align-items: center;justify-content: center;"> | <div style="display:flex;align-items: center;justify-content: center;"> | ||||
| <span v-if="scope.row.isPrivate" style="color: rgb(250, 140, 22);">私有</span> | <span v-if="scope.row.isPrivate" style="color: rgb(250, 140, 22);">私有</span> | ||||
| <span v-else style="color: rgb(19, 194, 141);">公开</span> | <span v-else style="color: rgb(19, 194, 141);">公开</span> | ||||
| <el-tooltip class="item" effect="dark" content="镜像提交中..." placement="top"> | |||||
| <i v-if="scope.row.status===0" class="CREATING" style="margin-left:0.3rem"></i> | |||||
| <el-tooltip v-if="scope.row.status===0" class="item" effect="dark" content="镜像提交中..." placement="top"> | |||||
| <i class="CREATING" style="margin-left:0.3rem"></i> | |||||
| </el-tooltip> | </el-tooltip> | ||||
| <el-tooltip class="item" effect="dark" content="检测提交镜像是否大小超过20G!" placement="top"> | |||||
| <i v-if="scope.row.status===2" class="FAILED" style="margin-left:0.3rem"></i> | |||||
| <el-tooltip v-if="scope.row.status===2" class="item" effect="dark" content="检测提交镜像是否大小超过20G!" placement="top"> | |||||
| <i class="FAILED" style="margin-left:0.3rem"></i> | |||||
| </el-tooltip> | </el-tooltip> | ||||
| <el-tooltip class="item" effect="dark" content="镜像提交成功" placement="top"> | |||||
| <i v-if="scope.row.status===1" class="SUCCEEDED" style="margin-left:0.3rem"></i> | |||||
| <el-tooltip v-if="scope.row.status===1" class="item" effect="dark" content="镜像提交成功" placement="top"> | |||||
| <i class="SUCCEEDED" style="margin-left:0.3rem"></i> | |||||
| </el-tooltip> | </el-tooltip> | ||||
| </div> | </div> | ||||
| @@ -473,6 +473,7 @@ export default { | |||||
| tableDataCustom: [], | tableDataCustom: [], | ||||
| starCustom:[], | starCustom:[], | ||||
| loadingCustom:false, | loadingCustom:false, | ||||
| refreshCustomTimer: null, | |||||
| currentPageStar:1, | currentPageStar:1, | ||||
| pageSizeStar:10, | pageSizeStar:10, | ||||
| @@ -485,6 +486,7 @@ export default { | |||||
| methods: { | methods: { | ||||
| handleClick(tab, event) { | handleClick(tab, event) { | ||||
| this.search = '' | this.search = '' | ||||
| this.stopImageListCustomRefresh(); | |||||
| if(tab.name=="first"){ | if(tab.name=="first"){ | ||||
| this.paramsPublic.q = '' | this.paramsPublic.q = '' | ||||
| this.getImageListPublic() | this.getImageListPublic() | ||||
| @@ -560,9 +562,31 @@ export default { | |||||
| }); | }); | ||||
| this.loadingCustom = false | this.loadingCustom = false | ||||
| this.getImageListCustomRefresh() | |||||
| }) | }) | ||||
| }, | }, | ||||
| getImageListCustomRefresh() { | |||||
| this.stopImageListCustomRefresh(); | |||||
| this.refreshCustomTimer = setInterval(() => { | |||||
| this.tableDataCustom.forEach(item => { | |||||
| if (item.status === 0) { | |||||
| this.$axios.get(`/image/${item.id}`, {}).then((res) => { | |||||
| const newData = res.data; | |||||
| this.tableDataCustom.forEach(it => { | |||||
| if (it.id === newData.id) { | |||||
| it.status = newData.status; | |||||
| } | |||||
| }); | |||||
| }) | |||||
| } | |||||
| }); | |||||
| }, 5000); | |||||
| }, | |||||
| stopImageListCustomRefresh() { | |||||
| this.refreshCustomTimer && clearInterval(this.refreshCustomTimer); | |||||
| }, | |||||
| getImageListStar(){ | getImageListStar(){ | ||||
| this.loadingStar = true | this.loadingStar = true | ||||
| this.$axios.get('/explore/images/star',{ | this.$axios.get('/explore/images/star',{ | ||||
| @@ -715,8 +739,10 @@ export default { | |||||
| else{ | else{ | ||||
| this.getImageListPublic() | this.getImageListPublic() | ||||
| } | } | ||||
| }, | |||||
| beforeDestroy() { | |||||
| this.stopImageListCustomRefresh(); | |||||
| } | } | ||||
| }; | }; | ||||
| </script> | </script> | ||||
| @@ -1,23 +1,37 @@ | |||||
| export default async function initClipboard() { | export default async function initClipboard() { | ||||
| const els = document.querySelectorAll('.clipboard'); | |||||
| const els = document.querySelectorAll(".clipboard"); | |||||
| if (!els || !els.length) return; | if (!els || !els.length) return; | ||||
| const { default: ClipboardJS } = await import(/* webpackChunkName: "clipboard" */'clipboard'); | |||||
| const { default: ClipboardJS } = await import( | |||||
| /* webpackChunkName: "clipboard" */ "clipboard" | |||||
| ); | |||||
| const clipboard = new ClipboardJS(els); | const clipboard = new ClipboardJS(els); | ||||
| clipboard.on('success', (e) => { | |||||
| clipboard.on("success", (e) => { | |||||
| e.clearSelection(); | e.clearSelection(); | ||||
| $(`#${e.trigger.getAttribute('id')}`).popup('destroy'); | |||||
| e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-success')); | |||||
| $(`#${e.trigger.getAttribute('id')}`).popup('show'); | |||||
| e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')); | |||||
| $(`#${e.trigger.getAttribute("id")}`).popup("destroy"); | |||||
| e.trigger.setAttribute( | |||||
| "data-content", | |||||
| e.trigger.getAttribute("data-success") | |||||
| ); | |||||
| $(`#${e.trigger.getAttribute("id")}`).popup("show"); | |||||
| e.trigger.setAttribute( | |||||
| "data-content", | |||||
| e.trigger.getAttribute("data-original") | |||||
| ); | |||||
| }); | }); | ||||
| clipboard.on('error', (e) => { | |||||
| $(`#${e.trigger.getAttribute('id')}`).popup('destroy'); | |||||
| e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-error')); | |||||
| $(`#${e.trigger.getAttribute('id')}`).popup('show'); | |||||
| e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')); | |||||
| clipboard.on("error", (e) => { | |||||
| $(`#${e.trigger.getAttribute("id")}`).popup("destroy"); | |||||
| e.trigger.setAttribute( | |||||
| "data-content", | |||||
| e.trigger.getAttribute("data-error") | |||||
| ); | |||||
| $(`#${e.trigger.getAttribute("id")}`).popup("show"); | |||||
| e.trigger.setAttribute( | |||||
| "data-content", | |||||
| e.trigger.getAttribute("data-original") | |||||
| ); | |||||
| }); | }); | ||||
| } | } | ||||
| @@ -168,8 +168,8 @@ export default async function initCloudrainSow() { | |||||
| let downloadFlag = $(this).data("download-flag") || ""; | let downloadFlag = $(this).data("download-flag") || ""; | ||||
| let gpuFlag = $(this).data("gpu-flag") || ""; | let gpuFlag = $(this).data("gpu-flag") || ""; | ||||
| let version_name = $(this).data("version"); | let version_name = $(this).data("version"); | ||||
| let parents = $(this).data("parents") || ""; | |||||
| let filename = $(this).data("filename") || ""; | |||||
| let parents = $(this).data("parents"); | |||||
| let filename = $(this).data("filename"); | |||||
| let init = $(this).data("init") || ""; | let init = $(this).data("init") || ""; | ||||
| let path = $(this).data("path"); | let path = $(this).data("path"); | ||||
| let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`; | let url = `/api/v1/repos${path}?version_name=${version_name}&parentDir=${parents}`; | ||||
| @@ -189,7 +189,7 @@ export default async function initCloudrainSow() { | |||||
| htmlBread += "<div class='divider'> / </div>"; | htmlBread += "<div class='divider'> / </div>"; | ||||
| $(`#file_breadcrumb${version_name}`).append(htmlBread); | $(`#file_breadcrumb${version_name}`).append(htmlBread); | ||||
| } else { | } else { | ||||
| renderBrend(path, version_name, parents, filename, init); | |||||
| renderBrend(path, version_name, parents, filename, init, downloadFlag); | |||||
| } | } | ||||
| }).fail(function (err) { | }).fail(function (err) { | ||||
| console.log(err, version_name); | console.log(err, version_name); | ||||
| @@ -217,7 +217,14 @@ export default async function initCloudrainSow() { | |||||
| size = size.toFixed(0); //保留的小数位数 | size = size.toFixed(0); //保留的小数位数 | ||||
| return size + unitArr[index]; | return size + unitArr[index]; | ||||
| } | } | ||||
| function renderBrend(path, version_name, parents, filename, init) { | |||||
| function renderBrend( | |||||
| path, | |||||
| version_name, | |||||
| parents, | |||||
| filename, | |||||
| init, | |||||
| downloadFlag | |||||
| ) { | |||||
| if (init == "folder") { | if (init == "folder") { | ||||
| let htmlBrend = ""; | let htmlBrend = ""; | ||||
| let sectionName = $( | let sectionName = $( | ||||
| @@ -227,11 +234,11 @@ export default async function initCloudrainSow() { | |||||
| let filename1 = $(`input[name=modelback${version_name}]`).val(); | let filename1 = $(`input[name=modelback${version_name}]`).val(); | ||||
| if (parents1 === "") { | if (parents1 === "") { | ||||
| $(`#file_breadcrumb${version_name} .active.section`).replaceWith( | $(`#file_breadcrumb${version_name} .active.section`).replaceWith( | ||||
| `<a class='section load-model-file' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='' data-init='init'>${sectionName}</a>` | |||||
| `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='' data-init='init'>${sectionName}</a>` | |||||
| ); | ); | ||||
| } else { | } else { | ||||
| $(`#file_breadcrumb${version_name} .active.section`).replaceWith( | $(`#file_breadcrumb${version_name} .active.section`).replaceWith( | ||||
| `<a class='section load-model-file' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='${filename1}'>${sectionName}</a>` | |||||
| `<a class='section load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${parents1}' data-filename='${filename1}'>${sectionName}</a>` | |||||
| ); | ); | ||||
| } | } | ||||
| @@ -272,7 +279,7 @@ export default async function initCloudrainSow() { | |||||
| html += "<span class='octicon octicon-file-directory'>"; | html += "<span class='octicon octicon-file-directory'>"; | ||||
| html += "</span>"; | html += "</span>"; | ||||
| if (data.Dirs[i].IsDir) { | if (data.Dirs[i].IsDir) { | ||||
| html += `<a class='load-model-file' data-path='${path}' data-version='${version_name}' data-parents='${data.Dirs[i].ParenDir}' data-filename='${data.Dirs[i].FileName}' data-init='folder'>`; | |||||
| html += `<a class='load-model-file' data-download-flag='${downloadFlag}' data-path='${path}' data-version='${version_name}' data-parents='${data.Dirs[i].ParenDir}' data-filename='${data.Dirs[i].FileName}' data-init='folder'>`; | |||||
| html += | html += | ||||
| "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" + | "<span class='fitted'><i class='folder icon' width='16' height='16' aria-hidden='true'></i>" + | ||||
| data.Dirs[i].FileName + | data.Dirs[i].FileName + | ||||
| @@ -2950,13 +2950,13 @@ $(document).ready(async () => { | |||||
| } | } | ||||
| const $cloneAddr = $("#clone_addr"); | const $cloneAddr = $("#clone_addr"); | ||||
| $cloneAddr.on("change", () => { | |||||
| $cloneAddr.on("input change", () => { | |||||
| const $repoName = $("#alias"); | const $repoName = $("#alias"); | ||||
| const $owner = $("#ownerDropdown div.text").attr("title"); | const $owner = $("#ownerDropdown div.text").attr("title"); | ||||
| const $urlAdd = | const $urlAdd = | ||||
| location.href.split("/")[0] + "//" + location.href.split("/")[2]; | location.href.split("/")[0] + "//" + location.href.split("/")[2]; | ||||
| if ($cloneAddr.val().length > 0 && $repoName.val().length === 0) { | |||||
| // Only modify if repo_name input is blank | |||||
| if ($cloneAddr.val().length > 0 /* && $repoName.val().length === 0 */) { | |||||
| // modify when clone address change | |||||
| const repoValue = $cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; | const repoValue = $cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]; | ||||
| $repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]); | $repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]); | ||||
| $.get( | $.get( | ||||
| @@ -140,27 +140,26 @@ | |||||
| border: 1px solid #ffffff; | border: 1px solid #ffffff; | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| } | } | ||||
| .item { | .item { | ||||
| border-bottom: 1px solid rgba(34,36,38,.15); | |||||
| border-bottom: 1px solid rgba(34, 36, 38, 0.15); | |||||
| .ui.buttons { | .ui.buttons { | ||||
| .button { | .button { | ||||
| box-shadow: none !important; | box-shadow: none !important; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| .ui.grid > .row { | .ui.grid > .row { | ||||
| align-items: center; | align-items: center; | ||||
| } | } | ||||
| .title { | .title { | ||||
| font-size: 16px; | font-size: 16px; | ||||
| font-weight: bold; | font-weight: bold; | ||||
| margin: 0 6px; | |||||
| margin: 0 6px; | |||||
| overflow: hidden; | overflow: hidden; | ||||
| padding-right: 15px; | padding-right: 15px; | ||||
| white-space: nowrap; | white-space: nowrap; | ||||
| @@ -195,7 +194,15 @@ | |||||
| .name { | .name { | ||||
| word-break: break-all; | word-break: break-all; | ||||
| } | } | ||||
| .dataset-title-a { | |||||
| flex: 1; | |||||
| overflow: hidden; | |||||
| text-overflow: ellipsis; | |||||
| min-width: 0; | |||||
| word-break: inherit !important; | |||||
| margin-right: 3rem; | |||||
| white-space: nowrap; | |||||
| } | |||||
| .metas { | .metas { | ||||
| color: #888888; | color: #888888; | ||||
| font-size: 14px; | font-size: 14px; | ||||
| @@ -222,7 +229,7 @@ | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| .panel_creator_reponam{ | |||||
| .panel_creator_reponam { | |||||
| display: inline-block; | display: inline-block; | ||||
| border-radius: 4px; | border-radius: 4px; | ||||
| padding: 4px; | padding: 4px; | ||||
| @@ -231,29 +238,28 @@ | |||||
| background-color: rgba(161, 220, 255, 0.2); | background-color: rgba(161, 220, 255, 0.2); | ||||
| color: #101010; | color: #101010; | ||||
| } | } | ||||
| .panel_dataset_name{ | |||||
| .panel_dataset_name { | |||||
| font-size: 15px; | font-size: 15px; | ||||
| color: #0366D6; | |||||
| color: #0366d6; | |||||
| text-align: center; | text-align: center; | ||||
| margin-left: 1rem; | margin-left: 1rem; | ||||
| } | } | ||||
| .panel_datset_desc{ | |||||
| .panel_datset_desc { | |||||
| white-space: nowrap; | white-space: nowrap; | ||||
| display: inline-block; | display: inline-block; | ||||
| overflow: hidden; | overflow: hidden; | ||||
| width: 90%; | width: 90%; | ||||
| text-overflow: ellipsis; | text-overflow: ellipsis; | ||||
| } | } | ||||
| .el-dialog__body{ | |||||
| padding-top:0 | |||||
| .el-dialog__body { | |||||
| padding-top: 0; | |||||
| } | } | ||||
| #dataset-base{ | |||||
| .active{ | |||||
| color: #0087f5!important; | |||||
| border: 1px solid #0087f5!important; | |||||
| #dataset-base { | |||||
| .active { | |||||
| color: #0087f5 !important; | |||||
| border: 1px solid #0087f5 !important; | |||||
| /* margin: -1px!important; */ | /* margin: -1px!important; */ | ||||
| background: #fff!important; | |||||
| background: #fff !important; | |||||
| } | } | ||||
| } | |||||
| } | |||||
| @@ -311,6 +311,7 @@ footer .column { | |||||
| } | } | ||||
| .FAILED, | .FAILED, | ||||
| .START_FAILED, | .START_FAILED, | ||||
| .DELETED, | |||||
| .CREATE_FAILED { | .CREATE_FAILED { | ||||
| display: inline-block; | display: inline-block; | ||||
| width: 18px; | width: 18px; | ||||