| @@ -454,6 +454,7 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) | |||
| AllowRebaseMerge: allowRebaseMerge, | |||
| AllowSquash: allowSquash, | |||
| AvatarURL: repo.avatarLink(e), | |||
| Status: int(repo.Status), | |||
| } | |||
| } | |||
| @@ -311,6 +311,7 @@ func ToOrganization(org *models.User) *api.Organization { | |||
| Location: org.Location, | |||
| Visibility: org.Visibility.String(), | |||
| RepoAdminChangeTeamAccess: org.RepoAdminChangeTeamAccess, | |||
| NumRepos: org.NumRepos, | |||
| } | |||
| } | |||
| @@ -15,6 +15,7 @@ type Organization struct { | |||
| Location string `json:"location"` | |||
| Visibility string `json:"visibility"` | |||
| RepoAdminChangeTeamAccess bool `json:"repo_admin_change_team_access"` | |||
| NumRepos int `json:"num_repos"` | |||
| } | |||
| // CreateOrgOption options for creating an organization | |||
| @@ -90,6 +90,7 @@ type Repository struct { | |||
| AllowRebaseMerge bool `json:"allow_rebase_explicit"` | |||
| AllowSquash bool `json:"allow_squash_merge"` | |||
| AvatarURL string `json:"avatar_url"` | |||
| Status int `json:"status"` | |||
| } | |||
| // CreateRepoOption options when creating repository | |||
| @@ -70,7 +70,7 @@ func CloudBrains(ctx *context.Context) { | |||
| keyword := strings.Trim(ctx.Query("q"), " ") | |||
| ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||
| ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||
| ListOptions: models.ListOptions{ | |||
| Page: page, | |||
| PageSize: setting.UI.IssuePagingNum, | |||
| @@ -84,7 +84,6 @@ func CloudBrains(ctx *context.Context) { | |||
| IsLatestVersion: modelarts.IsLatestVersion, | |||
| ComputeResource: listType, | |||
| Type: models.TypeCloudBrainAll, | |||
| AiCenter: aiCenter, | |||
| Cluster: cluster, | |||
| }) | |||
| if err != nil { | |||
| @@ -93,19 +92,24 @@ func CloudBrains(ctx *context.Context) { | |||
| } | |||
| models.LoadSpecs4CloudbrainInfo(ciTasks) | |||
| for i, task := range ciTasks { | |||
| ciTasks[i].CanDebug = true | |||
| ciTasks[i].CanDel = true | |||
| ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||
| tasks := []*models.CloudbrainInfo{} | |||
| for _, task := range ciTasks { | |||
| if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||
| task.CanDebug = true | |||
| task.CanDel = true | |||
| task.Cloudbrain.ComputeResource = task.ComputeResource | |||
| tasks = append(tasks, task) | |||
| } | |||
| } | |||
| count := int64(len(tasks)) | |||
| pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | |||
| pager.SetDefaultParams(ctx) | |||
| pager.AddParam(ctx, "listType", "ListType") | |||
| ctx.Data["Page"] = pager | |||
| ctx.Data["PageIsCloudBrain"] = true | |||
| ctx.Data["Tasks"] = ciTasks | |||
| ctx.Data["Tasks"] = tasks | |||
| ctx.Data["CanCreate"] = true | |||
| ctx.Data["Keyword"] = keyword | |||
| @@ -707,6 +707,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Get("/issues/search", repo.SearchIssues) | |||
| m.Post("/migrate", reqToken(), bind(auth.MigrateRepoForm{}), repo.Migrate) | |||
| m.Post("/migrate/submit", reqToken(), bind(auth.MigrateRepoForm{}), repo.MigrateSubmit) | |||
| m.Group("/:username/:reponame", func() { | |||
| m.Combo("").Get(reqAnyRepoReader(), repo.Get). | |||
| @@ -732,7 +732,7 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||
| keyword := strings.Trim(ctx.Query("q"), " ") | |||
| ciTasks, count, err := models.CloudbrainAll(&models.CloudbrainsOptions{ | |||
| ciTasks, _, err := models.CloudbrainAll(&models.CloudbrainsOptions{ | |||
| ListOptions: models.ListOptions{ | |||
| Page: page, | |||
| PageSize: pageSize, | |||
| @@ -747,8 +747,8 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||
| NeedRepoInfo: true, | |||
| BeginTimeUnix: int64(recordBeginTime), | |||
| EndTimeUnix: endTime.Unix(), | |||
| AiCenter: aiCenter, | |||
| NeedDeleteInfo: needDeleteInfo, | |||
| // AiCenter: aiCenter, | |||
| NeedDeleteInfo: needDeleteInfo, | |||
| }) | |||
| if err != nil { | |||
| ctx.ServerError("Get job failed:", err) | |||
| @@ -758,43 +758,45 @@ func GetCloudbrainsDetailData(ctx *context.Context) { | |||
| nilTime := time.Time{} | |||
| tasks := []models.TaskDetail{} | |||
| for i, task := range ciTasks { | |||
| ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||
| var taskDetail models.TaskDetail | |||
| taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||
| taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||
| taskDetail.JobName = ciTasks[i].JobName | |||
| taskDetail.DisplayJobName = ciTasks[i].DisplayJobName | |||
| taskDetail.Status = ciTasks[i].Status | |||
| taskDetail.JobType = ciTasks[i].JobType | |||
| taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix | |||
| taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration | |||
| taskDetail.StartTime = ciTasks[i].StartTime | |||
| taskDetail.EndTime = ciTasks[i].EndTime | |||
| taskDetail.ComputeResource = ciTasks[i].ComputeResource | |||
| taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||
| taskDetail.UserName = ciTasks[i].User.Name | |||
| taskDetail.RepoID = ciTasks[i].RepoID | |||
| if ciTasks[i].Repo != nil { | |||
| taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||
| taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias | |||
| } | |||
| if ciTasks[i].Cloudbrain.WorkServerNumber >= 1 { | |||
| taskDetail.WorkServerNum = int64(ciTasks[i].Cloudbrain.WorkServerNumber) | |||
| } else { | |||
| taskDetail.WorkServerNum = 1 | |||
| } | |||
| taskDetail.CardDuration = repo.GetCloudbrainCardDuration(ciTasks[i].Cloudbrain) | |||
| taskDetail.WaitTime = repo.GetCloudbrainWaitTime(ciTasks[i].Cloudbrain) | |||
| if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||
| ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||
| var taskDetail models.TaskDetail | |||
| taskDetail.ID = ciTasks[i].Cloudbrain.ID | |||
| taskDetail.JobID = ciTasks[i].Cloudbrain.JobID | |||
| taskDetail.JobName = ciTasks[i].JobName | |||
| taskDetail.DisplayJobName = ciTasks[i].DisplayJobName | |||
| taskDetail.Status = ciTasks[i].Status | |||
| taskDetail.JobType = ciTasks[i].JobType | |||
| taskDetail.CreatedUnix = ciTasks[i].Cloudbrain.CreatedUnix | |||
| taskDetail.RunTime = ciTasks[i].Cloudbrain.TrainJobDuration | |||
| taskDetail.StartTime = ciTasks[i].StartTime | |||
| taskDetail.EndTime = ciTasks[i].EndTime | |||
| taskDetail.ComputeResource = ciTasks[i].ComputeResource | |||
| taskDetail.Type = ciTasks[i].Cloudbrain.Type | |||
| taskDetail.UserName = ciTasks[i].User.Name | |||
| taskDetail.RepoID = ciTasks[i].RepoID | |||
| if ciTasks[i].Repo != nil { | |||
| taskDetail.RepoName = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Name | |||
| taskDetail.RepoAlias = ciTasks[i].Repo.OwnerName + "/" + ciTasks[i].Repo.Alias | |||
| } | |||
| if ciTasks[i].Cloudbrain.WorkServerNumber >= 1 { | |||
| taskDetail.WorkServerNum = int64(ciTasks[i].Cloudbrain.WorkServerNumber) | |||
| } else { | |||
| taskDetail.WorkServerNum = 1 | |||
| } | |||
| taskDetail.CardDuration = repo.GetCloudbrainCardDuration(ciTasks[i].Cloudbrain) | |||
| taskDetail.WaitTime = repo.GetCloudbrainWaitTime(ciTasks[i].Cloudbrain) | |||
| if ciTasks[i].Cloudbrain.DeletedAt != nilTime || ciTasks[i].Repo == nil { | |||
| taskDetail.IsDelete = true | |||
| } else { | |||
| taskDetail.IsDelete = false | |||
| if ciTasks[i].Cloudbrain.DeletedAt != nilTime || ciTasks[i].Repo == nil { | |||
| taskDetail.IsDelete = true | |||
| } else { | |||
| taskDetail.IsDelete = false | |||
| } | |||
| taskDetail.Spec = ciTasks[i].Spec | |||
| tasks = append(tasks, taskDetail) | |||
| } | |||
| taskDetail.Spec = ciTasks[i].Spec | |||
| tasks = append(tasks, taskDetail) | |||
| } | |||
| count := int64(len(tasks)) | |||
| pager := context.NewPagination(int(count), pageSize, page, getTotalPage(count, pageSize)) | |||
| pager.SetDefaultParams(ctx) | |||
| pager.AddParam(ctx, "listType", "ListType") | |||
| @@ -6,6 +6,8 @@ package repo | |||
| import ( | |||
| "bytes" | |||
| "code.gitea.io/gitea/modules/task" | |||
| "code.gitea.io/gitea/routers/response" | |||
| "errors" | |||
| "fmt" | |||
| "net/http" | |||
| @@ -216,3 +218,146 @@ func handleMigrateError(ctx *context.APIContext, repoOwner *models.User, remoteA | |||
| } | |||
| } | |||
| } | |||
| func MigrateSubmit(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||
| log.Info("receive MigrateSubmit request") | |||
| ctxUser, bizErr := checkContextUser(ctx, form.UID) | |||
| if bizErr != nil { | |||
| ctx.JSON(http.StatusOK, response.ResponseError(bizErr)) | |||
| return | |||
| } | |||
| remoteAddr, err := form.ParseRemoteAddr(ctx.User) | |||
| if err != nil { | |||
| if models.IsErrInvalidCloneAddr(err) { | |||
| addrErr := err.(models.ErrInvalidCloneAddr) | |||
| switch { | |||
| case addrErr.IsURLError: | |||
| ctx.JSON(http.StatusOK, response.PARAM_ERROR) | |||
| case addrErr.IsPermissionDenied: | |||
| ctx.JSON(http.StatusOK, response.INSUFFICIENT_PERMISSION) | |||
| case addrErr.IsInvalidPath: | |||
| ctx.JSON(http.StatusOK, response.PARAM_ERROR) | |||
| default: | |||
| ctx.JSON(http.StatusOK, response.SYSTEM_ERROR) | |||
| } | |||
| } else { | |||
| ctx.JSON(http.StatusOK, response.SYSTEM_ERROR) | |||
| } | |||
| return | |||
| } | |||
| var gitServiceType = api.PlainGitService | |||
| u, err := url.Parse(form.CloneAddr) | |||
| if err == nil && strings.EqualFold(u.Host, "github.com") { | |||
| gitServiceType = api.GithubService | |||
| } | |||
| var opts = migrations.MigrateOptions{ | |||
| OriginalURL: form.CloneAddr, | |||
| GitServiceType: gitServiceType, | |||
| CloneAddr: remoteAddr, | |||
| RepoName: form.RepoName, | |||
| Alias: form.Alias, | |||
| Description: form.Description, | |||
| Private: form.Private || setting.Repository.ForcePrivate, | |||
| Mirror: form.Mirror, | |||
| AuthUsername: form.AuthUsername, | |||
| AuthPassword: form.AuthPassword, | |||
| Wiki: form.Wiki, | |||
| Issues: form.Issues, | |||
| Milestones: form.Milestones, | |||
| Labels: form.Labels, | |||
| Comments: true, | |||
| PullRequests: form.PullRequests, | |||
| Releases: form.Releases, | |||
| } | |||
| if opts.Mirror { | |||
| opts.Issues = false | |||
| opts.Milestones = false | |||
| opts.Labels = false | |||
| opts.Comments = false | |||
| opts.PullRequests = false | |||
| opts.Releases = false | |||
| } | |||
| err = models.CheckCreateRepository(ctx.User, ctxUser, opts.RepoName, opts.Alias) | |||
| if err != nil { | |||
| handleMigrateError4Api(ctx, ctxUser, remoteAddr, err) | |||
| return | |||
| } | |||
| err = task.MigrateRepository(ctx.User, ctxUser, opts) | |||
| if err == nil { | |||
| r := make(map[string]string) | |||
| r["OpenIUrl"] = strings.TrimSuffix(setting.AppURL, "/") + "/" + ctxUser.Name + "/" + opts.RepoName | |||
| r["OriginUrl"] = form.CloneAddr | |||
| ctx.JSON(http.StatusOK, response.SuccessWithData(r)) | |||
| return | |||
| } | |||
| handleMigrateError4Api(ctx, ctxUser, remoteAddr, err) | |||
| } | |||
| func checkContextUser(ctx *context.APIContext, uid int64) (*models.User, *response.BizError) { | |||
| if uid == ctx.User.ID || uid == 0 { | |||
| return ctx.User, nil | |||
| } | |||
| org, err := models.GetUserByID(uid) | |||
| if models.IsErrUserNotExist(err) { | |||
| return ctx.User, nil | |||
| } | |||
| if err != nil { | |||
| return nil, response.SYSTEM_ERROR | |||
| } | |||
| // Check ownership of organization. | |||
| if !org.IsOrganization() { | |||
| return nil, nil | |||
| } | |||
| if !ctx.User.IsAdmin { | |||
| canCreate, err := org.CanCreateOrgRepo(ctx.User.ID) | |||
| if err != nil { | |||
| return nil, response.NewBizError(err) | |||
| } else if !canCreate { | |||
| return nil, response.INSUFFICIENT_PERMISSION | |||
| } | |||
| } | |||
| return org, nil | |||
| } | |||
| func handleMigrateError4Api(ctx *context.APIContext, repoOwner *models.User, remoteAddr string, err error) { | |||
| switch { | |||
| case models.IsErrRepoAlreadyExist(err): | |||
| ctx.JSON(http.StatusOK, response.Error(3, "The repository with the same name already exists.")) | |||
| case migrations.IsRateLimitError(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError("Remote visit addressed rate limitation.")) | |||
| case migrations.IsTwoFactorAuthError(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError("Remote visit required two factors authentication.")) | |||
| case models.IsErrReachLimitOfRepo(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("You have already reached your limit of %d repositories.", repoOwner.MaxCreationLimit()))) | |||
| case models.IsErrNameReserved(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The username '%s' is reserved.", err.(models.ErrNameReserved).Name))) | |||
| case models.IsErrNameCharsNotAllowed(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The username '%s' contains invalid characters.", err.(models.ErrNameCharsNotAllowed).Name))) | |||
| case models.IsErrNamePatternNotAllowed(err): | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("The pattern '%s' is not allowed in a username.", err.(models.ErrNamePatternNotAllowed).Pattern))) | |||
| default: | |||
| err = util.URLSanitizedError(err, remoteAddr) | |||
| if strings.Contains(err.Error(), "Authentication failed") || | |||
| strings.Contains(err.Error(), "Bad credentials") || | |||
| strings.Contains(err.Error(), "could not read Username") { | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("Authentication failed: %v.", err))) | |||
| } else if strings.Contains(err.Error(), "fatal:") { | |||
| ctx.JSON(http.StatusOK, response.ServerError(fmt.Sprintf("Migration failed: %v.", err))) | |||
| } else { | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| } | |||
| } | |||
| } | |||
| func QueryRepoSatus(ctx *context.APIContext, form auth.MigrateRepoForm) { | |||
| } | |||
| @@ -1,8 +1,14 @@ | |||
| package response | |||
| //repo response | |||
| var RESOURCE_QUEUE_NOT_AVAILABLE = &BizError{Code: 1001, Err: "resource queue not available"} | |||
| var SPECIFICATION_NOT_EXIST = &BizError{Code: 1002, Err: "specification not exist"} | |||
| var SPECIFICATION_NOT_AVAILABLE = &BizError{Code: 1003, Err: "specification not available"} | |||
| var CATEGORY_STILL_HAS_BADGES = &BizError{Code: 1004, Err: "Please delete badges in the category first"} | |||
| var BADGES_STILL_HAS_USERS = &BizError{Code: 1005, Err: "Please delete users of badge first"} | |||
| //common response | |||
| var SYSTEM_ERROR = &BizError{Code: 9009, Err: "System error.Please try again later"} | |||
| var INSUFFICIENT_PERMISSION = &BizError{Code: 9003, Err: "insufficient permissions"} | |||
| var PARAM_ERROR = &BizError{Code: 9001, Err: "param error permissions"} | |||
| @@ -812,7 +812,7 @@ func Cloudbrains(ctx *context.Context) { | |||
| for i, _ := range repos { | |||
| repoIDList = append(repoIDList, repos[i].ID) | |||
| } | |||
| ciTasks, count, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||
| ciTasks, _, err := models.Cloudbrains(&models.CloudbrainsOptions{ | |||
| ListOptions: models.ListOptions{ | |||
| Page: page, | |||
| PageSize: setting.UI.IssuePagingNum, | |||
| @@ -828,7 +828,6 @@ func Cloudbrains(ctx *context.Context) { | |||
| RepoIDList: repoIDList, | |||
| ComputeResource: listType, | |||
| Type: models.TypeCloudBrainAll, | |||
| AiCenter: aiCenter, | |||
| Cluster: cluster, | |||
| }) | |||
| if err != nil { | |||
| @@ -836,18 +835,22 @@ func Cloudbrains(ctx *context.Context) { | |||
| return | |||
| } | |||
| models.LoadSpecs4CloudbrainInfo(ciTasks) | |||
| for i, task := range ciTasks { | |||
| ciTasks[i].CanDebug = true | |||
| ciTasks[i].CanDel = true | |||
| ciTasks[i].Cloudbrain.ComputeResource = task.ComputeResource | |||
| tasks := []*models.CloudbrainInfo{} | |||
| for _, task := range ciTasks { | |||
| if aiCenter == "" || aiCenter == task.Cloudbrain.Spec.AiCenterCode { | |||
| task.CanDebug = true | |||
| task.CanDel = true | |||
| task.Cloudbrain.ComputeResource = task.ComputeResource | |||
| tasks = append(tasks, task) | |||
| } | |||
| } | |||
| count := int64(len(tasks)) | |||
| pager := context.NewPagination(int(count), setting.UI.IssuePagingNum, page, getTotalPage(count, setting.UI.IssuePagingNum)) | |||
| pager.SetDefaultParams(ctx) | |||
| pager.AddParam(ctx, "listType", "ListType") | |||
| ctx.Data["Page"] = pager | |||
| ctx.Data["PageIsUserCloudBrain"] = true | |||
| ctx.Data["Tasks"] = ciTasks | |||
| ctx.Data["Tasks"] = tasks | |||
| ctx.Data["CanCreate"] = true | |||
| ctx.Data["Keyword"] = keyword | |||
| @@ -16,19 +16,11 @@ | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | |||
| </div> | |||
| </div> | |||
| <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| <div class="default text" style="color: rgba(0,0,0,.87);">{{.i18n.Tr "cloudbrain.all_ai_center"}}</div> | |||
| <div class="ui selection dropdown" id="aiCenter-sel" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| <div class="default text" style="color: rgba(0,0,0,.87);" aicenter="{{$.aiCenter}}">{{if eq $.aiCenter ""}}{{.i18n.Tr "cloudbrain.all_ai_center"}}{{end}}</div> | |||
| <i class="dropdown icon"></i> | |||
| <div class="menu"> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=鹏城云计算所" data-value="鹏城云计算所">鹏城云计算所</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=成都智算" data-value="成都智算">成都智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=合肥类脑" data-value="合肥类脑">合肥类脑</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=octopus" data-value="octopus">octopus</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=武汉智算" data-value="武汉智算">武汉智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=西安智算" data-value="西安智算">西安智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=中原智算" data-value="中原智算">中原智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=许昌AI中心" data-value="许昌AI中心">许昌AI中心</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||
| </div> | |||
| </div> | |||
| <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| @@ -73,4 +65,44 @@ | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <script> | |||
| ;(function() { | |||
| document.addEventListener('DOMContentLoaded', function() { | |||
| $.ajax({ | |||
| type: "GET", | |||
| url: "/admin/resources/queue/centers", | |||
| dataType: "json", | |||
| data: {}, | |||
| success: function (res) { | |||
| if (res && res.Code === 0) { | |||
| var data = res.Data; | |||
| var aiCenterSelEl = $('#aiCenter-sel'); | |||
| var itemEl = aiCenterSelEl.find('.menu .item').eq(0); | |||
| var selectAiCenterCode = aiCenterSelEl.find('.default').attr('aicenter'); | |||
| var selectAiCenterName = ''; | |||
| for (var i = 0, iLen = data.length; i < iLen; i++) { | |||
| var dataI = data[i]; | |||
| var itemClone = itemEl.clone(); | |||
| var oHref = itemClone.attr('href'); | |||
| var oId = itemClone.attr('id'); | |||
| itemClone.attr('data-value', dataI.AiCenterCode); | |||
| itemClone.removeAttr('id'); | |||
| itemClone.attr('href', oHref + dataI.AiCenterCode); | |||
| itemClone.text(dataI.AiCenterName); | |||
| aiCenterSelEl.find('.menu').append(itemClone); | |||
| if (selectAiCenterCode === dataI.AiCenterCode) { | |||
| selectAiCenterName = dataI.AiCenterName; | |||
| } | |||
| } | |||
| selectAiCenterCode && aiCenterSelEl.dropdown('set selected', selectAiCenterCode); | |||
| selectAiCenterName && aiCenterSelEl.dropdown('set text', selectAiCenterName); | |||
| } | |||
| }, | |||
| error: function (err) { | |||
| console.log(err); | |||
| } | |||
| }); | |||
| }); | |||
| })(); | |||
| </script> | |||
| @@ -28,19 +28,11 @@ | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster=resource_cluster_c2net&aiCenter={{$.aiCenter}}" data-value="{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}">{{.i18n.Tr "cloudbrain.resource_cluster_c2net"}}</a> | |||
| </div> | |||
| </div> | |||
| <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| <div class="default text" style="color: rgba(0,0,0,.87);">{{.i18n.Tr "cloudbrain.all_ai_center"}}</div> | |||
| <div class="ui selection dropdown" id="aiCenter-sel" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| <div class="default text" style="color: rgba(0,0,0,.87);" aicenter="{{$.aiCenter}}">{{if eq $.aiCenter ""}}{{.i18n.Tr "cloudbrain.all_ai_center"}}{{end}}</div> | |||
| <i class="dropdown icon"></i> | |||
| <div class="menu"> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=鹏城云计算所" data-value="鹏城云计算所">鹏城云计算所</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=成都智算" data-value="成都智算">成都智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=合肥类脑" data-value="合肥类脑">合肥类脑</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=octopus" data-value="octopus">octopus</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=武汉智算" data-value="武汉智算">武汉智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=西安智算" data-value="西安智算">西安智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=中原智算" data-value="中原智算">中原智算</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=许昌AI中心" data-value="许昌AI中心">许昌AI中心</a> | |||
| <a class="item" href="{{$.Link}}?q={{$.Keyword}}&jobType={{$.JobType}}&listType={{$.ListType}}&jobStatus={{$.JobStatus}}&cluster={{$.cluster}}&aiCenter=" data-value='{{.i18n.Tr "cloudbrain.all_ai_center"}}'>{{.i18n.Tr "cloudbrain.all_ai_center"}}</a> | |||
| </div> | |||
| </div> | |||
| <div class="ui selection dropdown" style="min-width: 10em;min-height:2.6em;border-radius: .28571429rem;margin-right: 1em;padding: .67em 3.2em .7em 1em;"> | |||
| @@ -87,4 +79,44 @@ | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| <script> | |||
| ;(function() { | |||
| document.addEventListener('DOMContentLoaded', function() { | |||
| $.ajax({ | |||
| type: "GET", | |||
| url: "/admin/resources/queue/centers", | |||
| dataType: "json", | |||
| data: {}, | |||
| success: function (res) { | |||
| if (res && res.Code === 0) { | |||
| var data = res.Data; | |||
| var aiCenterSelEl = $('#aiCenter-sel'); | |||
| var itemEl = aiCenterSelEl.find('.menu .item').eq(0); | |||
| var selectAiCenterCode = aiCenterSelEl.find('.default').attr('aicenter'); | |||
| var selectAiCenterName = ''; | |||
| for (var i = 0, iLen = data.length; i < iLen; i++) { | |||
| var dataI = data[i]; | |||
| var itemClone = itemEl.clone(); | |||
| var oHref = itemClone.attr('href'); | |||
| var oId = itemClone.attr('id'); | |||
| itemClone.attr('data-value', dataI.AiCenterCode); | |||
| itemClone.removeAttr('id'); | |||
| itemClone.attr('href', oHref + dataI.AiCenterCode); | |||
| itemClone.text(dataI.AiCenterName); | |||
| aiCenterSelEl.find('.menu').append(itemClone); | |||
| if (selectAiCenterCode === dataI.AiCenterCode) { | |||
| selectAiCenterName = dataI.AiCenterName; | |||
| } | |||
| } | |||
| selectAiCenterCode && aiCenterSelEl.dropdown('set selected', selectAiCenterCode); | |||
| selectAiCenterName && aiCenterSelEl.dropdown('set text', selectAiCenterName); | |||
| } | |||
| }, | |||
| error: function (err) { | |||
| console.log(err); | |||
| } | |||
| }); | |||
| }); | |||
| })(); | |||
| </script> | |||
| @@ -529,7 +529,7 @@ function userSearchControll() { | |||
| : params.get("jobStatus").toUpperCase(); | |||
| const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | |||
| $("#userCloud .default.text ").each(function (index, e) { | |||
| $(e).text(dropdownValueArray[index]); | |||
| index != 1 && $(e).text(dropdownValueArray[index]); | |||
| }); | |||
| } | |||
| @@ -564,7 +564,7 @@ function AdaminSearchControll() { | |||
| : params.get("jobStatus").toUpperCase(); | |||
| const dropdownValueArray = [cluster, aiCenter, jobType, listType, jobStatus]; | |||
| $("#adminCloud .default.text ").each(function (index, e) { | |||
| $(e).text(dropdownValueArray[index]); | |||
| index != 1 && $(e).text(dropdownValueArray[index]); | |||
| }); | |||
| } | |||
| userSearchControll(); | |||