/* globals wipPrefixes */
/* exported timeAddManual, toggleStopwatch, cancelStopwatch */
/* exported toggleDeadlineForm, setDeadline, updateDeadline, deleteDependencyModal, cancelCodeComment, onOAuthLoginClick */
import "./publicpath.js";
import "./polyfills.js";
import "./features/letteravatar.js";
import Vue from "vue";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import axios from "axios";
import qs from "qs";
import Cookies from "js-cookie";
import "jquery.are-you-sure";
import "./vendor/semanticdropdown.js";
import { svg } from "./utils.js";
import echarts from "echarts";
import initContextPopups from "./features/contextpopup.js";
import initGitGraph from "./features/gitgraph.js";
import initClipboard from "./features/clipboard.js";
import initUserHeatmap from "./features/userheatmap.js";
import initDateTimePicker from "./features/datetimepicker.js";
import initContextMenu from "./features/contexmenu.js";
import {
initTribute,
issuesTribute,
emojiTribute,
} from "./features/tribute.js";
import createDropzone from "./features/dropzone.js";
import highlight from "./features/highlight.js";
import ActivityTopAuthors from "./components/ActivityTopAuthors.vue";
import {
initNotificationsTable,
initNotificationCount,
} from "./features/notification.js";
import { createCodeEditor } from "./features/codeeditor.js";
import MinioUploader from "./components/MinioUploader.vue";
import EditAboutInfo from "./components/EditAboutInfo.vue";
// import Images from './components/Images.vue';
import EditTopics from "./components/EditTopics.vue";
import DataAnalysis from "./components/DataAnalysis.vue";
import Contributors from "./components/Contributors.vue";
import Model from "./components/Model.vue";
import WxAutorize from "./components/WxAutorize.vue";
import initCloudrain from "./features/cloudrbanin.js";
import initCloudrainSow from "./features/cloudbrainShow.js";
import initImage from "./features/images.js";
import selectDataset from "./components/dataset/selectDataset.vue";
// import $ from 'jquery.js'
import router from "./router/index.js";
import { Message } from "element-ui";
Vue.use(ElementUI);
Vue.prototype.$axios = axios;
Vue.prototype.$Cookies = Cookies;
Vue.prototype.qs = qs;
Vue.prototype.$message = Message;
const { AppSubUrl, StaticUrlPrefix, csrf } = window.config;
Object.defineProperty(Vue.prototype, "$echarts", {
value: echarts,
});
function htmlEncode(text) {
return jQuery("
';
imageShow += data.attachments;
imageShow += "
";
$content.find(".ui.attached.segment").append(imageShow);
} else {
$content.find(".ui.middle.aligned").html(data.attachments);
}
}
} else if (data.attachments === "") {
$content.find(".ui.small.images").parent().remove();
} else {
$content.find(".ui.small.images").html(data.attachments);
}
dz.emit("submit");
dz.emit("reload");
}
);
});
} else {
$textarea = $segment.find("textarea");
$simplemde = commentMDEditors[$editContentZone.data("write")];
}
// Show write/preview tab and copy raw content as needed
$editContentZone.show();
$renderContent.hide();
if ($textarea.val().length === 0) {
$textarea.val($rawContent.text());
$simplemde.value($rawContent.text());
}
$textarea.focus();
$simplemde.codemirror.focus();
event.preventDefault();
});
// Delete comment
$(".delete-comment").on("click", function () {
const $this = $(this);
if (window.confirm($this.data("locale"))) {
$.post($this.data("url"), {
_csrf: csrf,
}).done(() => {
$(`#${$this.data("comment-id")}`).remove();
});
}
return false;
});
// Change status
const $statusButton = $("#status-button");
$("#comment-form .edit_area").on("keyup", function () {
if ($(this).val().length === 0) {
$statusButton.text($statusButton.data("status"));
} else {
$statusButton.text($statusButton.data("status-and-comment"));
}
});
$statusButton.on("click", () => {
$("#status").val($statusButton.data("status-val"));
$("#comment-form").trigger("submit");
});
// Pull Request merge button
const $mergeButton = $(".merge-button > button");
$mergeButton.on("click", function (e) {
e.preventDefault();
$(`.${$(this).data("do")}-fields`).show();
$(this).parent().hide();
});
$(".merge-button > .dropdown").dropdown({
onChange(_text, _value, $choice) {
if ($choice.data("do")) {
$mergeButton.find(".button-text").text($choice.text());
$mergeButton.data("do", $choice.data("do"));
}
},
});
$(".merge-cancel").on("click", function (e) {
e.preventDefault();
$(this).closest(".form").hide();
$mergeButton.parent().show();
});
initReactionSelector();
}
// Datasets
if ($(".repository.dataset-list.view").length > 0) {
const editContentToggle = function () {
$("#dataset-content").toggle();
$("#dataset-content-edit").toggle();
$("#dataset-content input").focus();
return false;
};
$("[data-dataset-status]").on("click", function () {
const $this = $(this);
const $private = $this.data("private");
const $is_private = $this.data("is-private");
if ($is_private === $private) {
return;
}
const $uuid = $this.data("uuid");
$.post($this.data("url"), {
_csrf: $this.data("csrf"),
file: $uuid,
is_private: $private,
})
.done((_data) => {
$(`[data-uuid='${$uuid}']`).removeClass("positive active");
$(`[data-uuid='${$uuid}']`).data("is-private", $private);
$this.addClass("positive active");
})
.fail(() => {
window.location.reload();
});
});
$("[data-dataset-delete]").on("click", function () {
const $this = $(this);
$("#data-dataset-delete-modal")
.modal({
closable: false,
onApprove() {
$.post($this.data("remove-url"), {
_csrf: $this.data("csrf"),
file: $this.data("uuid"),
})
.done((_data) => {
$(`#${$this.data("uuid")}`).hide();
})
.fail(() => {
window.location.reload();
});
},
})
.modal("show");
});
$("[data-category-id]").on("click", function () {
const category = $(this).data("category-id");
$("#category").val(category);
$("#submit").click();
});
$("[data-task-id]").on("click", function () {
const task = $(this).data("task-id");
$("#task").val(task);
$("#submit").click();
});
$("[data-license-id]").on("click", function () {
const license = $(this).data("license-id");
$("#license").val(license);
$("#submit").click();
});
$("#dataset-edit").on("click", editContentToggle);
$("#cancel").on("click", editContentToggle);
}
// Diff
if ($(".repository.diff").length > 0) {
$(".diff-counter").each(function () {
const $item = $(this);
const addLine = $item.find("span[data-line].add").data("line");
const delLine = $item.find("span[data-line].del").data("line");
const addPercent =
(parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine))) *
100;
$item.find(".bar .add").css("width", `${addPercent}%`);
});
}
// Quick start and repository home
$("#repo-clone-ssh").on("click", function () {
$(".clone-url").text($(this).data("link"));
$("#repo-clone-url").val($(this).data("link"));
$(this).addClass("blue");
$("#repo-clone-https").removeClass("blue");
localStorage.setItem("repo-clone-protocol", "ssh");
});
$("#repo-clone-https").on("click", function () {
$(".clone-url").text($(this).data("link"));
$("#repo-clone-url").val($(this).data("link"));
$(this).addClass("blue");
$("#repo-clone-ssh").removeClass("blue");
localStorage.setItem("repo-clone-protocol", "https");
});
$("#repo-clone-url").on("click", function () {
$(this).select();
});
// Pull request
const $repoComparePull = $(".repository.compare.pull");
if ($repoComparePull.length > 0) {
initFilterSearchDropdown(".choose.branch .dropdown");
// show pull request form
$repoComparePull.find("button.show-form").on("click", function (e) {
e.preventDefault();
$repoComparePull.find(".pullrequest-form").show();
autoSimpleMDE.codemirror.refresh();
$(this).parent().hide();
});
}
// Branches
if ($(".repository.settings.branches").length > 0) {
initFilterSearchDropdown(".protected-branches .dropdown");
$(".enable-protection, .enable-whitelist, .enable-statuscheck").on(
"change",
function () {
if (this.checked) {
$($(this).data("target")).removeClass("disabled");
} else {
$($(this).data("target")).addClass("disabled");
}
}
);
$(".disable-whitelist").on("change", function () {
if (this.checked) {
$($(this).data("target")).addClass("disabled");
}
});
}
// Language stats
if ($(".language-stats").length > 0) {
$(".language-stats").on("click", (e) => {
e.preventDefault();
$(".language-stats-details, .repository-menu").slideToggle();
});
}
}
function initMigration() {
const toggleMigrations = function () {
const authUserName = $("#auth_username").val();
const cloneAddr = $("#clone_addr").val();
if (
!$("#mirror").is(":checked") &&
authUserName &&
authUserName.length > 0 &&
cloneAddr !== undefined &&
(cloneAddr.startsWith("https://github.com") ||
cloneAddr.startsWith("http://github.com") ||
cloneAddr.startsWith("http://gitlab.com") ||
cloneAddr.startsWith("https://gitlab.com"))
) {
$("#migrate_items").show();
} else {
$("#migrate_items").hide();
}
};
toggleMigrations();
$("#clone_addr").on("input", toggleMigrations);
$("#auth_username").on("input", toggleMigrations);
$("#mirror").on("change", toggleMigrations);
}
function initPullRequestReview() {
$(".show-outdated").on("click", function (e) {
e.preventDefault();
const id = $(this).data("comment");
$(this).addClass("hide");
$(`#code-comments-${id}`).removeClass("hide");
$(`#code-preview-${id}`).removeClass("hide");
$(`#hide-outdated-${id}`).removeClass("hide");
});
$(".hide-outdated").on("click", function (e) {
e.preventDefault();
const id = $(this).data("comment");
$(this).addClass("hide");
$(`#code-comments-${id}`).addClass("hide");
$(`#code-preview-${id}`).addClass("hide");
$(`#show-outdated-${id}`).removeClass("hide");
});
$("button.comment-form-reply").on("click", function (e) {
e.preventDefault();
$(this).hide();
const form = $(this).parent().find(".comment-form");
form.removeClass("hide");
assingMenuAttributes(form.find(".menu"));
});
// The following part is only for diff views
if ($(".repository.pull.diff").length === 0) {
return;
}
$(".diff-detail-box.ui.sticky").sticky();
$(".btn-review")
.on("click", function (e) {
e.preventDefault();
$(this).closest(".dropdown").find(".menu").toggle("visible");
})
.closest(".dropdown")
.find(".link.close")
.on("click", function (e) {
e.preventDefault();
$(this).closest(".menu").toggle("visible");
});
$(".code-view .lines-code,.code-view .lines-num")
.on("mouseenter", function () {
const parent = $(this).closest("td");
$(this)
.closest("tr")
.addClass(
parent.hasClass("lines-num-old") || parent.hasClass("lines-code-old")
? "focus-lines-old"
: "focus-lines-new"
);
})
.on("mouseleave", function () {
$(this).closest("tr").removeClass("focus-lines-new focus-lines-old");
});
$(".add-code-comment").on("click", function (e) {
// https://github.com/go-gitea/gitea/issues/4745
if ($(e.target).hasClass("btn-add-single")) {
return;
}
e.preventDefault();
const isSplit = $(this).closest(".code-diff").hasClass("code-diff-split");
const side = $(this).data("side");
const idx = $(this).data("idx");
const path = $(this).data("path");
const form = $("#pull_review_add_comment").html();
const tr = $(this).closest("tr");
let ntr = tr.next();
if (!ntr.hasClass("add-comment")) {
ntr = $(
``
);
tr.after(ntr);
}
const td = ntr.find(`.add-comment-${side}`);
let commentCloud = td.find(".comment-code-cloud");
if (commentCloud.length === 0) {
td.html(form);
commentCloud = td.find(".comment-code-cloud");
assingMenuAttributes(commentCloud.find(".menu"));
td.find("input[name='line']").val(idx);
td.find("input[name='side']").val(
side === "left" ? "previous" : "proposed"
);
td.find("input[name='path']").val(path);
}
commentCloud.find("textarea").focus();
});
}
function assingMenuAttributes(menu) {
const id = Math.floor(Math.random() * Math.floor(1000000));
menu.attr("data-write", menu.attr("data-write") + id);
menu.attr("data-preview", menu.attr("data-preview") + id);
menu.find(".item").each(function () {
const tab = $(this).attr("data-tab") + id;
$(this).attr("data-tab", tab);
});
menu.parent().find("*[data-tab='write']").attr("data-tab", `write${id}`);
menu.parent().find("*[data-tab='preview']").attr("data-tab", `preview${id}`);
initCommentPreviewTab(menu.parent(".form"));
return id;
}
function initRepositoryCollaboration() {
// Change collaborator access mode
$(".access-mode.menu .item").on("click", function () {
const $menu = $(this).parent();
$.post($menu.data("url"), {
_csrf: csrf,
uid: $menu.data("uid"),
mode: $(this).data("value"),
});
});
}
function initTeamSettings() {
// Change team access mode
$(".organization.new.team input[name=permission]").on("change", () => {
const val = $(
"input[name=permission]:checked",
".organization.new.team"
).val();
if (val === "admin") {
$(".organization.new.team .team-units").hide();
} else {
$(".organization.new.team .team-units").show();
}
});
}
function initWikiForm() {
const $editArea = $(".repository.wiki textarea#edit_area");
let sideBySideChanges = 0;
let sideBySideTimeout = null;
if ($editArea.length > 0) {
const simplemde = new SimpleMDE({
autoDownloadFontAwesome: false,
element: $editArea[0],
forceSync: true,
previewRender(plainText, preview) {
// Async method
setTimeout(() => {
// FIXME: still send render request when return back to edit mode
const render = function () {
sideBySideChanges = 0;
if (sideBySideTimeout !== null) {
clearTimeout(sideBySideTimeout);
sideBySideTimeout = null;
}
$.post(
$editArea.data("url"),
{
_csrf: csrf,
mode: "gfm",
context: $editArea.data("context"),
text: plainText,
},
(data) => {
preview.innerHTML = ` element clickable like a link
$("tr[data-href]").on("click", function () {
window.location = $(this).data("href");
});
// make table element clickable like a link
$("td[data-href]").click(function () {
window.location = $(this).data("href");
});
// 在String原型对象上添加format方法
String.prototype.format = function () {
let str = this;
if (arguments.length == 0) {
return str;
} else {
Object.keys(arguments).forEach((item, index) => {
str = str.replace(/\?/, arguments[item]);
});
return str;
}
};
// Dropzone
const $dropzone = $("#dropzone");
if ($dropzone.length > 0) {
const filenameDict = {};
let maxFileTooltips;
let maxSizeTooltips;
if (
$dropzone.data("max-file-tooltips") &&
$dropzone.data("max-size-tooltips")
) {
maxFileTooltips = $dropzone
.data("max-file-tooltips")
.format($dropzone.data("max-file"), $dropzone.data("max-size"));
maxSizeTooltips = $dropzone
.data("max-size-tooltips")
.format($dropzone.data("max-file"));
}
await createDropzone("#dropzone", {
url: $dropzone.data("upload-url"),
headers: { "X-Csrf-Token": csrf },
maxFiles: $dropzone.data("max-file"),
maxFilesize: $dropzone.data("max-size"),
acceptedFiles:
$dropzone.data("accepts") === "*/*" ? null : $dropzone.data("accepts"),
addRemoveLinks: true,
dictDefaultMessage: $dropzone.data("default-message"),
dictInvalidFileType: $dropzone.data("invalid-input-type"),
dictFileTooBig: $dropzone.data("file-too-big"),
dictRemoveFile: $dropzone.data("remove-file"),
init() {
this.on("success", (file, data) => {
filenameDict[file.name] = data.uuid;
const input = $(
``
).val(data.uuid);
$(".files").append(input);
});
this.on("removedfile", (file) => {
if (file.name in filenameDict) {
$(`#${filenameDict[file.name]}`).remove();
}
if ($dropzone.data("remove-url") && $dropzone.data("csrf")) {
$.post($dropzone.data("remove-url"), {
file: filenameDict[file.name],
_csrf: $dropzone.data("csrf"),
});
}
});
this.on("addedfile", (file) => {
if (file.size / (1000 * 1000) > $dropzone.data("max-size")) {
this.removeFile(file);
if (maxFileTooltips) {
$(".maxfilesize.ui.red.message").text(maxFileTooltips);
$(".maxfilesize.ui.red.message").css("display", "block");
}
} else {
if (maxFileTooltips) {
$(".maxfilesize.ui.red.message").css("display", "none");
}
}
});
this.on("maxfilesexceeded", (file) => {
this.removeFile(file);
if (maxSizeTooltips) {
$(".maxfilesize.ui.red.message").text(maxSizeTooltips);
$(".maxfilesize.ui.red.message").css("display", "block");
}
});
},
});
}
// Helpers.
$(".delete-button").on("click", showDeletePopup);
$(".add-all-button").on("click", showAddAllPopup);
$(".link-action").on("click", linkAction);
$(".link-email-action").on("click", linkEmailAction);
$(".delete-branch-button").on("click", showDeletePopup);
$(".undo-button").on("click", function () {
const $this = $(this);
$.post($this.data("url"), {
_csrf: csrf,
id: $this.data("id"),
}).done((data) => {
window.location.href = data.redirect;
});
});
$(".show-panel.button").on("click", function () {
$($(this).data("panel")).show();
});
$(".show-modal.button").on("click", function () {
$($(this).data("modal")).modal("show");
});
$(".delete-post.button").on("click", function () {
const $this = $(this);
$.post($this.data("request-url"), {
_csrf: csrf,
}).done(() => {
window.location.href = $this.data("done-url");
});
});
// Set anchor.
$(".markdown").each(function () {
$(this)
.find("h1, h2, h3, h4, h5, h6")
.each(function () {
let node = $(this);
node = node.wrap('');
node.append(
`${svg("octicon-link", 16)}`
);
});
});
$(".issue-checkbox").on("click", () => {
const numChecked = $(".issue-checkbox").children("input:checked").length;
if (numChecked > 0) {
$("#issue-filters").addClass("hide");
$("#issue-actions").removeClass("hide");
} else {
$("#issue-filters").removeClass("hide");
$("#issue-actions").addClass("hide");
}
});
$(".issue-action").on("click", function () {
let { action } = this.dataset;
let { elementId } = this.dataset;
const issueIDs = $(".issue-checkbox")
.children("input:checked")
.map(function () {
return this.dataset.issueId;
})
.get()
.join();
console.log("this:", this);
const { url } = this.dataset;
if (elementId === "0" && url.substr(-9) === "/assignee") {
elementId = "";
action = "clear";
}
updateIssuesMeta(url, action, issueIDs, elementId, "").then(() => {
// NOTICE: This reset of checkbox state targets Firefox caching behaviour, as the checkboxes stay checked after reload
if (action === "close" || action === "open") {
// uncheck all checkboxes
$('.issue-checkbox input[type="checkbox"]').each((_, e) => {
e.checked = false;
});
}
reload();
});
});
// NOTICE: This event trigger targets Firefox caching behaviour, as the checkboxes stay checked after reload
// trigger ckecked event, if checkboxes are checked on load
$('.issue-checkbox input[type="checkbox"]:checked')
.first()
.each((_, e) => {
e.checked = false;
$(e).trigger("click");
});
$(".resolve-conversation").on("click", function (e) {
e.preventDefault();
const id = $(this).data("comment-id");
const action = $(this).data("action");
const url = $(this).data("update-url");
$.post(url, {
_csrf: csrf,
action,
comment_id: id,
}).then(reload);
});
buttonsClickOnEnter();
searchUsers();
searchTeams();
searchRepositories();
initCommentForm();
initInstall();
initRepository();
initMigration();
initWikiForm();
initEditForm();
initEditor();
initOrganization();
initGithook();
initWebhook();
initAdmin();
initCodeView();
initVueApp();
initVueUploader();
initVueDataset();
initVueEditAbout();
initVueEditTopic();
initVueContributors();
// initVueImages();
initVueModel();
initVueDataAnalysis();
initVueWxAutorize();
initVueselectDataset();
initTeamSettings();
initCtrlEnterSubmit();
initNavbarContentToggle();
// initTopicbar();vim
// closeTopicbar();
initU2FAuth();
initU2FRegister();
initIssueList();
initWipTitle();
initPullRequestReview();
initRepoStatusChecker();
initTemplateSearch();
initContextPopups();
initNotificationsTable();
initNotificationCount();
initTribute();
initDropDown();
initCloudrain();
initCloudrainSow();
initImage();
initContextMenu();
// Repo clone url.
if ($("#repo-clone-url").length > 0) {
switch (localStorage.getItem("repo-clone-protocol")) {
case "ssh":
if ($("#repo-clone-ssh").length === 0) {
$("#repo-clone-https").trigger("click");
}
break;
default:
$("#repo-clone-https").trigger("click");
break;
}
}
const routes = {
"div.user.settings": initUserSettings,
"div.repository.settings.collaboration": initRepositoryCollaboration,
};
let selector;
for (selector in routes) {
if ($(selector).length > 0) {
routes[selector]();
break;
}
}
const $cloneAddr = $("#clone_addr");
$cloneAddr.on("input change", () => {
const $repoName = $("#alias");
const $owner = $("#ownerDropdown div.text").attr("title");
const $urlAdd =
location.href.split("/")[0] + "//" + location.href.split("/")[2];
if ($cloneAddr.val().length > 0 /* && $repoName.val().length === 0 */) {
// modify when clone address change
const repoValue = $cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3];
$repoName.val($cloneAddr.val().match(/^(.*\/)?((.+?)(\.git)?)$/)[3]);
$.get(
`${window.config.AppSubUrl}/repo/check_name?q=${repoValue}&owner=${$owner}`,
(data) => {
const repo_name = data.name;
$("#repo_name").val(repo_name);
repo_name && $("#repo_name").parent().removeClass("error");
$("#repoAdress").css("display", "flex");
$("#repoAdress span").text(
$urlAdd + "/" + $owner + "/" + $("#repo_name").val() + ".git"
);
$("#repo_name").attr("placeholder", "");
}
);
}
});
// parallel init of lazy-loaded features
await Promise.all([
highlight(document.querySelectorAll("pre code")),
initGitGraph(),
initClipboard(),
initUserHeatmap(),
]);
});
function changeHash(hash) {
if (window.history.pushState) {
window.history.pushState(null, null, hash);
} else {
window.location.hash = hash;
}
}
function deSelect() {
if (window.getSelection) {
window.getSelection().removeAllRanges();
} else {
document.selection.empty();
}
}
function selectRange($list, $select, $from) {
$list.removeClass("active");
if ($from) {
let a = parseInt($select.attr("rel").substr(1));
let b = parseInt($from.attr("rel").substr(1));
let c;
if (a !== b) {
if (a > b) {
c = a;
a = b;
b = c;
}
const classes = [];
for (let i = a; i <= b; i++) {
classes.push(`.L${i}`);
}
$list.filter(classes.join(",")).addClass("active");
changeHash(`#L${a}-L${b}`);
return;
}
}
$select.addClass("active");
changeHash(`#${$select.attr("rel")}`);
}
$(() => {
// Warn users that try to leave a page after entering data into a form.
// Except on sign-in pages, and for forms marked as 'ignore-dirty'.
if ($(".user.signin").length === 0) {
$("form:not(.ignore-dirty)").areYouSure();
}
// Parse SSH Key
$("#ssh-key-content").on("change paste keyup", function () {
const arrays = $(this).val().split(" ");
const $title = $("#ssh-key-title");
if ($title.val() === "" && arrays.length === 3 && arrays[2] !== "") {
$title.val(arrays[2]);
}
});
});
function showDeletePopup() {
const $this = $(this);
let filter = "";
if ($this.attr("id")) {
filter += `#${$this.attr("id")}`;
}
const dialog = $(`.delete.modal${filter}`);
dialog.find(".name").text($this.data("name"));
dialog
.modal({
closable: false,
onApprove() {
if ($this.data("type") === "form") {
$($this.data("form")).trigger("submit");
return;
}
$.post($this.data("url"), {
_csrf: csrf,
id: $this.data("id"),
}).done((data) => {
window.location.href = data.redirect;
});
},
})
.modal("show");
return false;
}
function showAddAllPopup() {
const $this = $(this);
let filter = "";
if ($this.attr("id")) {
filter += `#${$this.attr("id")}`;
}
const dialog = $(`.addall.modal${filter}`);
dialog.find(".name").text($this.data("name"));
dialog
.modal({
closable: false,
onApprove() {
if ($this.data("type") === "form") {
$($this.data("form")).trigger("submit");
return;
}
$.post($this.data("url"), {
_csrf: csrf,
id: $this.data("id"),
}).done((data) => {
window.location.href = data.redirect;
});
},
})
.modal("show");
return false;
}
function linkAction(e) {
e.preventDefault();
const $this = $(this);
const redirect = $this.data("redirect");
$.post($this.data("url"), {
_csrf: csrf,
}).done((data) => {
if (data.redirect) {
window.location.href = data.redirect;
} else if (redirect) {
window.location.href = redirect;
} else {
window.location.reload();
}
});
}
function linkEmailAction(e) {
const $this = $(this);
$("#form-uid").val($this.data("uid"));
$("#form-email").val($this.data("email"));
$("#form-primary").val($this.data("primary"));
$("#form-activate").val($this.data("activate"));
$("#form-uid").val($this.data("uid"));
$("#change-email-modal").modal("show");
e.preventDefault();
}
function initVueComponents() {
const vueDelimeters = ["${", "}"];
Vue.component("repo-search", {
delimiters: vueDelimeters,
props: {
searchLimit: {
type: Number,
default: 10,
},
suburl: {
type: String,
required: true,
},
uid: {
type: Number,
required: true,
},
organizations: {
type: Array,
default: [],
},
isOrganization: {
type: Boolean,
default: true,
},
canCreateOrganization: {
type: Boolean,
default: false,
},
organizationsTotalCount: {
type: Number,
default: 0,
},
moreReposLink: {
type: String,
default: "",
},
},
data() {
const params = new URLSearchParams(window.location.search);
let tab = params.get("repo-search-tab");
if (!tab) {
tab = "repos";
}
let reposFilter = params.get("repo-search-filter");
if (!reposFilter) {
reposFilter = "all";
}
let privateFilter = params.get("repo-search-private");
if (!privateFilter) {
privateFilter = "both";
}
let archivedFilter = params.get("repo-search-archived");
if (!archivedFilter) {
archivedFilter = "unarchived";
}
let searchQuery = params.get("repo-search-query");
if (!searchQuery) {
searchQuery = "";
}
let page = 1;
try {
page = parseInt(params.get("repo-search-page"));
} catch {
// noop
}
if (!page) {
page = 1;
}
return {
tab,
repos: [],
reposTotalCount: 0,
reposFilter,
archivedFilter,
privateFilter,
page,
finalPage: 1,
searchQuery,
isLoading: false,
staticPrefix: StaticUrlPrefix,
counts: {},
repoTypes: {
all: {
searchMode: "",
},
forks: {
searchMode: "fork",
},
mirrors: {
searchMode: "mirror",
},
sources: {
searchMode: "source",
},
collaborative: {
searchMode: "collaborative",
},
},
};
},
computed: {
showMoreReposLink() {
return (
this.repos.length > 0 &&
this.repos.length <
this.counts[
`${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`
]
);
},
searchURL() {
return `${
this.suburl
}/api/v1/repos/search?sort=updated&order=desc&uid=${this.uid}&q=${
this.searchQuery
}&page=${this.page}&limit=${this.searchLimit}&mode=${
this.repoTypes[this.reposFilter].searchMode
}${this.reposFilter !== "all" ? "&exclusive=1" : ""}${
this.archivedFilter === "archived" ? "&archived=true" : ""
}${this.archivedFilter === "unarchived" ? "&archived=false" : ""}${
this.privateFilter === "private" ? "&onlyPrivate=true" : ""
}${this.privateFilter === "public" ? "&private=false" : ""}`;
},
repoTypeCount() {
return this.counts[
`${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`
];
},
},
mounted() {
this.searchRepos(this.reposFilter);
$(this.$el).find(".poping.up").popup();
$(this.$el).find(".dropdown").dropdown();
this.setCheckboxes();
const self = this;
Vue.nextTick(() => {
self.$refs.search.focus();
});
},
methods: {
changeTab(t) {
this.tab = t;
this.updateHistory();
},
setCheckboxes() {
switch (this.archivedFilter) {
case "unarchived":
$("#archivedFilterCheckbox").checkbox("set unchecked");
break;
case "archived":
$("#archivedFilterCheckbox").checkbox("set checked");
break;
case "both":
$("#archivedFilterCheckbox").checkbox("set indeterminate");
break;
default:
this.archivedFilter = "unarchived";
$("#archivedFilterCheckbox").checkbox("set unchecked");
break;
}
switch (this.privateFilter) {
case "public":
$("#privateFilterCheckbox").checkbox("set unchecked");
break;
case "private":
$("#privateFilterCheckbox").checkbox("set checked");
break;
case "both":
$("#privateFilterCheckbox").checkbox("set indeterminate");
break;
default:
this.privateFilter = "both";
$("#privateFilterCheckbox").checkbox("set indeterminate");
break;
}
},
changeReposFilter(filter) {
this.reposFilter = filter;
this.repos = [];
this.page = 1;
Vue.set(
this.counts,
`${filter}:${this.archivedFilter}:${this.privateFilter}`,
0
);
this.searchRepos();
},
updateHistory() {
const params = new URLSearchParams(window.location.search);
if (this.tab === "repos") {
params.delete("repo-search-tab");
} else {
params.set("repo-search-tab", this.tab);
}
if (this.reposFilter === "all") {
params.delete("repo-search-filter");
} else {
params.set("repo-search-filter", this.reposFilter);
}
if (this.privateFilter === "both") {
params.delete("repo-search-private");
} else {
params.set("repo-search-private", this.privateFilter);
}
if (this.archivedFilter === "unarchived") {
params.delete("repo-search-archived");
} else {
params.set("repo-search-archived", this.archivedFilter);
}
if (this.searchQuery === "") {
params.delete("repo-search-query");
} else {
params.set("repo-search-query", this.searchQuery);
}
if (this.page === 1) {
params.delete("repo-search-page");
} else {
params.set("repo-search-page", `${this.page}`);
}
window.history.replaceState({}, "", `?${params.toString()}`);
},
toggleArchivedFilter() {
switch (this.archivedFilter) {
case "both":
this.archivedFilter = "unarchived";
break;
case "unarchived":
this.archivedFilter = "archived";
break;
case "archived":
this.archivedFilter = "both";
break;
default:
this.archivedFilter = "unarchived";
break;
}
this.page = 1;
this.repos = [];
this.setCheckboxes();
Vue.set(
this.counts,
`${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`,
0
);
this.searchRepos();
},
togglePrivateFilter() {
switch (this.privateFilter) {
case "both":
this.privateFilter = "public";
break;
case "public":
this.privateFilter = "private";
break;
case "private":
this.privateFilter = "both";
break;
default:
this.privateFilter = "both";
break;
}
this.page = 1;
this.repos = [];
this.setCheckboxes();
Vue.set(
this.counts,
`${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`,
0
);
this.searchRepos();
},
changePage(page) {
this.page = page;
if (this.page > this.finalPage) {
this.page = this.finalPage;
}
if (this.page < 1) {
this.page = 1;
}
this.repos = [];
Vue.set(
this.counts,
`${this.reposFilter}:${this.archivedFilter}:${this.privateFilter}`,
0
);
this.searchRepos();
},
showArchivedRepo(repo) {
switch (this.archivedFilter) {
case "both":
return true;
case "unarchived":
return !repo.archived;
case "archived":
return repo.archived;
default:
return !repo.archived;
}
},
showPrivateRepo(repo) {
switch (this.privateFilter) {
case "both":
return true;
case "public":
return !repo.private;
case "private":
return repo.private;
default:
return true;
}
},
showFilteredRepo(repo) {
switch (this.reposFilter) {
case "sources":
return repo.owner.id === this.uid && !repo.mirror && !repo.fork;
case "forks":
return repo.owner.id === this.uid && !repo.mirror && repo.fork;
case "mirrors":
return repo.mirror;
case "collaborative":
return repo.owner.id !== this.uid && !repo.mirror;
default:
return true;
}
},
showRepo(repo) {
return (
this.showArchivedRepo(repo) &&
this.showPrivateRepo(repo) &&
this.showFilteredRepo(repo)
);
},
searchRepos() {
const self = this;
this.isLoading = true;
const searchedMode = this.repoTypes[this.reposFilter].searchMode;
const searchedURL = this.searchURL;
const searchedQuery = this.searchQuery;
$.getJSON(searchedURL, (result, _textStatus, request) => {
if (searchedURL === self.searchURL) {
self.repos = result.data;
const count = request.getResponseHeader("X-Total-Count");
if (
searchedQuery === "" &&
searchedMode === "" &&
self.archivedFilter === "both"
) {
self.reposTotalCount = count;
}
Vue.set(
self.counts,
`${self.reposFilter}:${self.archivedFilter}:${self.privateFilter}`,
count
);
self.finalPage = Math.floor(count / self.searchLimit) + 1;
self.updateHistory();
}
}).always(() => {
if (searchedURL === self.searchURL) {
self.isLoading = false;
}
});
},
repoClass(repo) {
if (repo.fork) {
return "octicon-repo-forked";
}
if (repo.mirror) {
return "octicon-repo-clone";
}
if (repo.template) {
return `octicon-repo-template${repo.private ? "-private" : ""}`;
}
if (repo.private) {
return "octicon-lock";
}
return "octicon-repo";
},
},
});
}
function initCtrlEnterSubmit() {
$(".js-quick-submit").on("keydown", function (e) {
if (
((e.ctrlKey && !e.altKey) || e.metaKey) &&
(e.keyCode === 13 || e.keyCode === 10)
) {
$(this).closest("form").trigger("submit");
}
});
}
function initVueApp() {
const el = document.getElementById("app");
if (!el) {
return;
}
initVueComponents();
new Vue({
delimiters: ["${", "}"],
el,
data: {
page: parseInt(new URLSearchParams(window.location.search).get("page")),
searchLimit: Number(
(document.querySelector("meta[name=_search_limit]") || {}).content
),
page: 1,
suburl: AppSubUrl,
uid: Number(
(document.querySelector("meta[name=_context_uid]") || {}).content
),
activityTopAuthors: window.ActivityTopAuthors || [],
localHref: "",
},
components: {
ActivityTopAuthors,
},
mounted() {
this.page = parseInt(
new URLSearchParams(window.location.search).get("page")
);
this.localHref = location.href;
},
methods: {
handleCurrentChange: function (val) {
const searchParams = new URLSearchParams(window.location.search);
if (!window.location.search) {
window.location.href = this.localHref + "?page=" + val;
} else if (searchParams.has("page")) {
window.location.href = this.localHref.replace(
/page=[0-9]+/g,
"page=" + val
);
} else {
window.location.href = location.href + "&page=" + val;
}
this.page = val;
},
},
});
}
function initVueUploader() {
const el = document.getElementById("minioUploader");
if (!el) {
return;
}
new Vue({
el: "#minioUploader",
components: { MinioUploader },
template: "",
});
}
function initVueEditAbout() {
const el = document.getElementById("about-desc");
if (!el) {
return;
}
new Vue({
el: "#about-desc",
render: (h) => h(EditAboutInfo),
});
}
function initVueDataset() {
if ($("#dataset_check").length) {
if (location.search.indexOf("recommend=true") !== -1) {
$("#dataset_check").checkbox("set checked");
} else {
$("#dataset_check").checkbox("set unchecked");
}
$("#dataset_check").checkbox({
onChecked: function () {
if (location.search) {
const params = new URLSearchParams(location.search);
if (params.has("recommend")) {
params.delete("recommend");
location.href =
AppSubUrl +
location.pathname +
"?" +
params.toString() +
"&recommend=true";
} else {
location.href = `${window.config.AppSubUrl}/admin/datasets${location.search}&recommend=true`;
}
} else {
location.href = `${window.config.AppSubUrl}/admin/datasets?recommend=true`;
}
},
onUnchecked: function () {
if (location.search == "?recommend=true") {
location.href = AppSubUrl + location.pathname;
} else {
const params = new URLSearchParams(location.search);
params.delete("recommend");
location.href =
AppSubUrl + location.pathname + "?" + params.toString();
}
},
});
}
$(".set_dataset").on("click", function () {
const $this = $(this);
let link = $this.data("url");
$.ajax({
url: link,
type: "PUT",
success: function (res) {
console.log(res);
if (res.Code == 0) {
window.location.href = "/admin/datasets";
} else {
$(".ui.negative.message")
.text(res.Message)
.show()
.delay(1500)
.fadeOut();
}
},
error: function (xhr) {
// 隐藏 loading
// 只有请求不正常(状态码不为200)才会执行
$(".ui.negative.message")
.html(xhr.responseText)
.show()
.delay(1500)
.fadeOut();
console.log(xhr);
},
complete: function (xhr) {
// $("#mask").css({"display":"none","z-index":"1"})
},
});
});
const el = document.getElementById("dataset-base");
if (!el) {
return;
}
let link = $("#square-link").data("link");
let repolink = $(".dataset-repolink").data("repolink");
let datasetType = $(".dataset-repolink").data("dataset-type");
const clearBtn = document.getElementsByClassName("clear_dataset_value");
const params = new URLSearchParams(location.search);
for (let i = 0; i < clearBtn.length; i++) {
clearBtn[i].addEventListener("click", function (e) {
let searchType = e.target.getAttribute("data-clear-value");
if (params.has(searchType)) {
params.delete(searchType);
let clearSearch = params.toString();
location.href = link + "?" + clearSearch;
}
});
}
const items = [];
const zipStatus = [];
$("#dataset-range-value")
.find(".item")
.each(function () {
items.push($(this).data("private"));
zipStatus.push($(this).data("decompress-state"));
});
let num_stars = $("#dataset-range-value").data("num-stars");
let star_active = $("#dataset-range-value").data("star-active");
const ruleForm = {};
if (document.getElementById("dataset-edit-value")) {
let $this = $("#dataset-edit-value");
ruleForm.title = $this.data("edit-title") || "";
ruleForm.description = $this.data("edit-description") || "";
ruleForm.category = $this.data("edit-category") || "";
ruleForm.task = $this.data("edit-task") || "";
ruleForm.license = $this.data("edit-license") || "";
ruleForm.id = $this.data("edit-id") || "";
ruleForm._csrf = csrf;
}
const starItems = [];
const starActives = [];
$("#datasets-square-range-value")
.find(".item")
.each(function () {
starItems.push($(this).data("num-stars"));
starActives.push($(this).data("star-active"));
});
const taskLists = [];
const licenseLists = [];
$("#task-square-range-value")
.find(".item")
.each(function () {
taskLists.push($(this).data("task"));
});
$("#task-square-range-value")
.find(".item")
.each(function () {
licenseLists.push($(this).data("license"));
});
let dataset_file_desc;
if (document.getElementById("dataset-file-desc")) {
dataset_file_desc = document.getElementById("dataset-file-desc").value;
}
new Vue({
delimiters: ["${", "}"],
el,
data: {
suburl: AppSubUrl,
url: "",
checked: false,
clusterFlag: false,
type: 0,
desc: "",
descfile: "",
datasetType: "",
privates: [],
zipStatus: [],
starItems: [],
starActives: [],
taskLists: [],
taskShow: [],
licenseLists: [],
licenseShow: [],
hasMoreBthHis: false,
showMoreHis: false,
star_active: false,
num_stars: 0,
dialogVisible: false,
activeName: "first",
searchDataItem: "",
currentRepoDataset: [],
myDataset: [],
publicDataset: [],
myFavoriteDataset: [],
page: 1,
totalnums: 0,
repolink: "",
datasetType: 0,
dataset_uuid: "",
dataset_name: "",
loadingDataIndex: false,
timer: null,
ruleForm: {
title: "",
description: "",
category: "",
task: "",
license: "",
_csrf: csrf,
},
ruleForm1: {
title: "",
description: "",
category: "",
task: "",
license: "",
_csrf: "",
id: "",
},
rules: {
title: [
{ required: true, message: "请输入数据集名称", trigger: "blur" },
{
min: 1,
max: 100,
message: "长度在 1 到 100 个字符",
trigger: "blur",
},
// {required:true,message:'test',pattern:'/^[a-zA-Z0-9-_]{1,100}[^-]$/',trigger:'blur'},
{
validator: (rule, value, callback) => {
if (/^[a-zA-Z0-9-_.]{0,100}$/.test(value) == false) {
callback(new Error("输入不符合数据集名称规则"));
} else {
callback();
}
},
trigger: "blur",
},
],
description: [
{ required: true, message: "请输入数据集描述详情", trigger: "blur" },
],
category: [
{ required: true, message: "请选择分类", trigger: "change" },
],
task: [
{
required: true,
message: "请选择研究方向/应用领域",
trigger: "change",
},
],
// license: [
// { required: true, message: '请选择活动区域', trigger: 'change' }
// ]
},
},
components: {
MinioUploader,
},
mounted() {
if (document.getElementById("fail_dataset_name")) {
this.dataset_name = document.getElementById("fail_dataset_name").value;
this.dataset_uuid = document.getElementById("fail_dataset_uuid").value;
}
this.getTypeList();
if (!!document.getElementById("dataset-repolink-init")) {
// this.datasetType = location.href.indexOf('cloudbrain') !== -1 ? 0 : 1
this.datasetType = $("#dataset-repolink-init").data("dataset-type");
this.getCurrentRepoDataset(this.repolink, this.datasetType);
}
const params = new URLSearchParams(location.search);
if (params.has("recommend") && params.get("recommend") == "true") {
this.checked = true;
} else {
this.checked = false;
}
},
created() {
if (document.getElementById("postPath")) {
this.url = document.getElementById("postPath").value;
}
this.privates = items;
this.zipStatus = zipStatus;
this.num_stars = num_stars;
this.star_active = star_active;
this.ruleForm1 = ruleForm;
// this.getEditInit()
this.starItems = starItems;
this.starActives = starActives;
this.taskLists = taskLists;
this.licenseLists = licenseLists;
this.descfile = dataset_file_desc;
this.repolink = repolink;
this.datasetType = datasetType;
},
methods: {
copyUrl(url) {
const cInput = document.createElement("input");
cInput.value = url;
document.body.appendChild(cInput);
cInput.select();
document.execCommand("Copy");
cInput.remove();
$("body").toast({
message: "复制成功!",
showProgress: "bottom",
showIcon: "check circle",
class: "info",
position: "top right",
});
},
handleCurrentChange(val) {
this.page = val;
switch (this.activeName) {
case "first":
this.getCurrentRepoDataset(this.repolink, this.datasetType);
break;
case "second":
this.getMyDataset(this.repolink, this.datasetType);
break;
case "third":
this.getPublicDataset(this.repolink, this.datasetType);
break;
case "fourth":
this.getStarDataset(this.repolink, this.datasetType);
break;
}
},
handleCheckedChange(val) {
if (val) {
if (location.search) {
const params = new URLSearchParams(location.search);
if (params.has("recommend")) {
params.delete("recommend");
let search = params.toString();
location.href = `${AppSubUrl}/explore/datasets?${search}&recommend=${val}`;
} else {
location.href = `${AppSubUrl}/explore/datasets${location.search}&recommend=${val}`;
}
} else {
location.href = `${AppSubUrl}/explore/datasets?recommend=${val}`;
}
} else {
if (location.search == "?recommend=true") {
location.href = AppSubUrl + location.pathname;
} else {
const params = new URLSearchParams(location.search);
params.delete("recommend");
location.href =
AppSubUrl + location.pathname + "?" + params.toString();
}
}
},
createDataset(formName) {
let _this = this;
this.$refs[formName].validate((valid) => {
if (valid) {
document.getElementById("mask").style.display = "block";
_this.$axios
.post(_this.url, _this.qs.stringify(_this.ruleForm))
.then((res) => {
if (res.data.Code === 0) {
document.getElementById("mask").style.display = "none";
location.href = _this.url.split("/create")[0] + "?type=-1";
} else {
console.log(res.data.Message);
}
document.getElementById("mask").style.display = "none";
})
.catch((error) => {
console.log(error);
});
} else {
return false;
}
});
},
cancelDataset(getpage, attachment) {
if (getpage && !attachment) {
if (getpage === "create") {
location.href = this.url.split("/create")[0] + "?type=-1";
} else if (getpage === "edit") {
location.href = this.url.split("/edit")[0] + "?type=-1";
} else {
location.href = "/";
}
} else {
location.href = `${AppSubUrl}${attachment}/datasets`;
}
},
gotoUpload(repolink, datsetId) {
// location.href = `${AppSubUrl}${repolink}/datasets/attachments/upload?datasetId=${datsetId}`
window.open(
`${AppSubUrl}${repolink}/datasets/attachments/upload?datasetId=${datsetId}`,
"_blank"
);
},
gotoDataset(datsetUrl) {
location.href = datsetUrl;
},
gotoAnnotate(repolink, uuid, type) {
location.href = `${AppSubUrl}${repolink}/datasets/label/${uuid}?type=${type}`;
},
setcluster(val) {
this.clusterFlag = val;
},
uploadGpu() {
this.type = 0;
},
uploadNpu() {
this.type = 1;
},
sortAble(dom) {
const params = new URLSearchParams(location.search);
if (params.toString() === "") {
location.href = `${location.href}?sort=${dom}Asc`;
} else if (!params.get("sort")) {
location.href = `${location.href}&sort=${dom}Asc`;
} else if (
params.get("sort") === `${dom}Desc` ||
params.get("sort").indexOf(`${dom}`) === -1
) {
params.set("sort", `${dom}Asc`);
let asc = params.toString();
location.search = asc;
} else {
params.set("sort", `${dom}Desc`);
let desc = params.toString();
location.search = desc;
}
},
sortIcon(dom, sort) {
const params = new URLSearchParams(location.search);
if (sort === "up") {
if (params.toString() === "") {
location.href = `${location.href}?sort=${dom}Asc`;
} else if (!params.get("sort")) {
location.href = `${location.href}&sort=${dom}Asc`;
} else if (
params.get("sort") &&
params.get("sort").indexOf(`${dom}Asc`) !== -1
) {
params.delete("sort");
location.search = params.toString();
} else {
params.set("sort", `${dom}Asc`);
let asc = params.toString();
location.search = asc;
}
} else if (sort === "down") {
if (params.toString() === "") {
location.href = `${location.href}?sort=${dom}Desc`;
} else if (!params.get("sort")) {
location.href = `${location.href}&sort=${dom}Desc`;
} else if (
params.get("sort") &&
params.get("sort").indexOf(`${dom}Desc`) !== -1
) {
params.delete("sort");
location.search = params.toString();
} else {
params.set("sort", `${dom}Desc`);
let asc = params.toString();
location.search = asc;
}
}
},
setPrivate(uuid, privateFlag, index) {
const params = { _csrf: csrf, file: uuid, is_private: privateFlag };
this.$axios
.post("/attachments/private", this.qs.stringify(params))
.then((res) => {
this.$set(this.privates, index, privateFlag);
})
.catch((error) => {
console.log(error);
});
},
delDataset(uuid) {
let _this = this;
const params = { _csrf: csrf, file: uuid };
$("#data-dataset-delete-modal")
.modal({
closable: false,
onApprove() {
_this.$axios
.post("/attachments/delete", _this.qs.stringify(params))
.then((res) => {
// $('#'+uuid).hide()
location.reload();
})
.catch((error) => {
console.log(error);
});
},
})
.modal("show");
},
// getEditInit(){
// if($('#dataset-edit-value')){
// $this = $('#dataset-edit-value')
// this.ruleForm.title = $this.data('edit-title') || ''
// this.ruleForm.description = $this.data('edit-description') || ''
// this.ruleForm.category = $this.data('edit-category') || ''
// this.ruleForm.task = $this.data('edit-task') || ''
// this.ruleForm.license = $this.data('edit-license') || ''
// this.ruleForm.id = $this.data('edit-id')|| ''
// }
// },
editDataset(formName, id) {
let _this = this;
this.url = this.url.split(`/${id}`)[0];
this.$refs[formName].validate((valid) => {
if (valid) {
document.getElementById("mask").style.display = "block";
_this.$axios
.post(_this.url, _this.qs.stringify(_this.ruleForm1))
.then((res) => {
if (res.data.Code === 0) {
document.getElementById("mask").style.display = "none";
location.href = _this.url.split("/edit")[0] + "?type=-1";
} else {
console.log(res.data.Message);
}
document.getElementById("mask").style.display = "none";
})
.catch((err) => {
console.log(err);
});
} else {
return false;
}
});
},
editDatasetFile(id, backurl) {
let url = "/attachments/edit";
const params = { id: id, description: this.descfile, _csrf: csrf };
// document.getElementById("mask").style.display = "block"
this.$axios
.post(url, this.qs.stringify(params))
.then((res) => {
if (res.data.Code === 0) {
location.href = `${AppSubUrl}${backurl}/datasets`;
} else {
console.log(res.data.Message);
}
})
.catch((err) => {
console.log(err);
});
},
postStar(id, link) {
if (this.star_active) {
let url = link + "/" + id + "/unstar";
this.$axios.put(url).then((res) => {
if (res.data.Code === 0) {
this.star_active = false;
this.num_stars = this.num_stars - 1;
}
});
} else {
let url = link + "/" + id + "/star";
this.$axios.put(url).then((res) => {
if (res.data.Code === 0) {
this.star_active = true;
this.num_stars = this.num_stars + 1;
}
});
}
},
postSquareStar(id, link, index) {
if (this.starActives[index]) {
let url = link + "/" + id + "/unstar";
this.$axios.put(url).then((res) => {
if (res.data.Code === 0) {
this.$set(this.starActives, index, false);
this.$set(this.starItems, index, this.starItems[index] - 1);
}
});
} else {
let url = link + "/" + id + "/star";
this.$axios.put(url).then((res) => {
if (res.data.Code === 0) {
this.$set(this.starActives, index, true);
this.$set(this.starItems, index, this.starItems[index] + 1);
}
});
}
},
getTypeList() {
const params = new URLSearchParams(window.location.search);
if (window.location.search && params.has("type")) {
if (params.get("type") == 0) {
this.datasetType = "0";
}
if (params.get("type") == 1) {
this.datasetType = "1";
}
if (params.get("type") == -1) {
this.datasetType = "-1";
}
} else {
this.datasetType = "-1";
}
},
changeDatasetType(val) {
const searchParams = new URLSearchParams(window.location.search);
if (!window.location.search) {
window.location.href = window.location.href + "?type=" + val;
} else if (searchParams.has("type")) {
window.location.href = window.location.href.replace(
/type=([0-9]|-[0-9])/g,
"type=" + val
);
} else {
window.location.href = window.location.href + "&type=" + val;
}
},
gotoDatasetEidt(repolink, id) {
location.href = `${repolink}/datasets/attachments/edit/${id}`;
},
handleClick(repoLink, tabName, type) {
if (tabName == "first") {
this.page = 1;
this.searchDataItem = "";
this.getCurrentRepoDataset(repoLink, type);
}
if (tabName == "second") {
this.page = 1;
this.searchDataItem = "";
this.getMyDataset(repoLink, type);
}
if (tabName == "third") {
this.page = 1;
this.searchDataItem = "";
this.getPublicDataset(repoLink, type);
}
if (tabName == "fourth") {
this.page = 1;
this.searchDataItem = "";
this.getStarDataset(repoLink, type);
}
},
polling(checkStatuDataset, repoLink) {
this.timer = window.setInterval(() => {
setTimeout(() => {
this.getDatasetStatus(checkStatuDataset, repoLink);
}, 0);
}, 15000);
},
getDatasetStatus(checkStatuDataset, repoLink) {
const getmap = checkStatuDataset.map((item) => {
let url = `${AppSubUrl}${repolink}/datasets/status/${item.UUID}`;
return this.$axios.get(url);
});
this.$axios.all(getmap).then((res) => {
let flag = res.some((item) => {
return item.data.AttachmentStatus == 1;
});
flag && clearInterval(this.timer);
flag && this.refreshStatusDataset();
});
},
refreshStatusDataset() {
switch (this.activeName) {
case "first":
this.getCurrentRepoDataset(this.repolink, this.datasetType);
break;
case "second":
this.getMyDataset(this.repolink, this.datasetType);
break;
case "third":
this.getPublicDataset(this.repolink, this.datasetType);
break;
case "fourth":
this.getStarDataset(this.repolink, this.datasetType);
break;
}
},
getCurrentRepoDataset(repoLink, type) {
clearInterval(this.timer);
this.loadingDataIndex = true;
let url = repoLink + "/datasets/current_repo";
this.$axios
.get(url, {
params: {
type: type,
page: this.page,
q: this.searchDataItem,
},
})
.then((res) => {
if (res.data.result_code == "0") {
this.currentRepoDataset = JSON.parse(res.data.data);
const checkStatuDataset = this.currentRepoDataset.filter(
(item) => item.DecompressState === 2
);
if (checkStatuDataset.length > 0) {
this.polling(checkStatuDataset, repoLink);
}
this.totalnums = parseInt(res.data.count);
} else {
this.totalnums = 0;
}
this.loadingDataIndex = false;
});
},
getMyDataset(repoLink, type) {
clearInterval(this.timer);
this.loadingDataIndex = true;
let url = repoLink + "/datasets/my_datasets";
this.$axios
.get(url, {
params: {
type: type,
page: this.page,
q: this.searchDataItem,
},
})
.then((res) => {
this.myDataset = JSON.parse(res.data.data);
const checkStatuDataset = this.myDataset.filter(
(item) => item.DecompressState === 2
);
if (checkStatuDataset.length > 0) {
this.polling(checkStatuDataset, repoLink);
}
this.totalnums = parseInt(res.data.count);
this.loadingDataIndex = false;
});
},
getPublicDataset(repoLink, type) {
clearInterval(this.timer);
this.loadingDataIndex = true;
let url = repoLink + "/datasets/public_datasets";
this.$axios
.get(url, {
params: {
type: type,
page: this.page,
q: this.searchDataItem,
},
})
.then((res) => {
this.publicDataset = JSON.parse(res.data.data);
const checkStatuDataset = this.publicDataset.filter(
(item) => item.DecompressState === 2
);
if (checkStatuDataset.length > 0) {
this.polling(checkStatuDataset, repoLink);
}
this.totalnums = parseInt(res.data.count);
this.loadingDataIndex = false;
});
},
getStarDataset(repoLink, type) {
clearInterval(this.timer);
this.loadingDataIndex = true;
let url = repoLink + "/datasets/my_favorite";
this.$axios
.get(url, {
params: {
type: type,
page: this.page,
q: this.searchDataItem,
},
})
.then((res) => {
this.myFavoriteDataset = JSON.parse(res.data.data);
const checkStatuDataset = this.myFavoriteDataset.filter(
(item) => item.DecompressState === 2
);
if (checkStatuDataset.length > 0) {
this.polling(checkStatuDataset, repoLink);
}
this.totalnums = parseInt(res.data.count);
this.loadingDataIndex = false;
});
},
selectDataset(uuid, name) {
this.dataset_uuid = uuid;
this.dataset_name = name;
this.dialogVisible = false;
},
searchDataset() {
switch (this.activeName) {
case "first":
this.page = 1;
this.getCurrentRepoDataset(this.repolink, this.datasetType);
break;
case "second":
this.page = 1;
this.getMyDataset(this.repolink, this.datasetType);
break;
case "third":
this.page = 1;
this.getPublicDataset(this.repolink, this.datasetType);
break;
case "fourth":
this.page = 1;
this.getStarDataset(this.repolink, this.datasetType);
break;
}
},
},
watch: {
searchDataItem() {
switch (this.activeName) {
case "first":
this.page = 1;
this.getCurrentRepoDataset(this.repolink, this.datasetType);
break;
case "second":
this.page = 1;
this.getMyDataset(this.repolink, this.datasetType);
break;
case "third":
this.page = 1;
this.getPublicDataset(this.repolink, this.datasetType);
break;
case "fourth":
this.page = 1;
this.getStarDataset(this.repolink, this.datasetType);
break;
}
},
},
});
}
function initVueEditTopic() {
const el = document.getElementById("topic_edit1");
if (!el) {
return;
}
new Vue({
el: "#topic_edit1",
render: (h) => h(EditTopics),
});
}
function initVueContributors() {
const el = document.getElementById("Contributors");
if (!el) {
return;
}
new Vue({
el: "#Contributors",
render: (h) => h(Contributors),
});
}
// function initVueImages() {
// const el = document.getElementById('images');
// if (!el) {
// return;
// }
// new Vue({
// el: '#images',
// render: h => h(Images)
// });
// }
function initVueModel() {
const el = document.getElementById("model_list");
if (!el) {
return;
}
new Vue({
el: el,
render: (h) => h(Model),
});
}
function initVueDataAnalysis() {
const el = document.getElementById("data_analysis");
if (!el) {
return;
}
new Vue({
el: "#data_analysis",
router,
render: (h) => h(DataAnalysis),
});
}
function initVueWxAutorize() {
const el = document.getElementById("WxAutorize");
if (!el) {
return;
}
new Vue({
el: el,
render: (h) => h(WxAutorize),
});
}
function initVueselectDataset() {
const el = document.getElementById("select-multi-dataset");
if (!el) {
return;
}
new Vue({
el: el,
render: (h) => h(selectDataset),
});
}
window.timeAddManual = function () {
$(".mini.modal")
.modal({
duration: 200,
onApprove() {
$("#add_time_manual_form").trigger("submit");
},
})
.modal("show");
};
window.toggleStopwatch = function () {
$("#toggle_stopwatch_form").trigger("submit");
};
window.cancelStopwatch = function () {
$("#cancel_stopwatch_form").trigger("submit");
};
function initFilterBranchTagDropdown(selector) {
$(selector).each(function () {
const $dropdown = $(this);
const $data = $dropdown.find(".data");
const data = {
items: [],
mode: $data.data("mode"),
searchTerm: "",
noResults: "",
canCreateBranch: false,
menuVisible: false,
active: 0,
};
$data.find(".item").each(function () {
data.items.push({
name: $(this).text(),
url: $(this).data("url"),
branch: $(this).hasClass("branch"),
tag: $(this).hasClass("tag"),
selected: $(this).hasClass("selected"),
});
});
$data.remove();
new Vue({
delimiters: ["${", "}"],
el: this,
data,
beforeMount() {
const vm = this;
this.noResults = vm.$el.getAttribute("data-no-results");
this.canCreateBranch =
vm.$el.getAttribute("data-can-create-branch") === "true";
document.body.addEventListener("click", (event) => {
if (vm.$el.contains(event.target)) {
return;
}
if (vm.menuVisible) {
Vue.set(vm, "menuVisible", false);
}
});
},
watch: {
menuVisible(visible) {
if (visible) {
this.focusSearchField();
}
},
},
computed: {
filteredItems() {
const vm = this;
const items = vm.items.filter((item) => {
return (
((vm.mode === "branches" && item.branch) ||
(vm.mode === "tags" && item.tag)) &&
(!vm.searchTerm ||
item.name.toLowerCase().includes(vm.searchTerm.toLowerCase()))
);
});
vm.active = items.length === 0 && vm.showCreateNewBranch ? 0 : -1;
return items;
},
showNoResults() {
return this.filteredItems.length === 0 && !this.showCreateNewBranch;
},
showCreateNewBranch() {
const vm = this;
if (!this.canCreateBranch || !vm.searchTerm || vm.mode === "tags") {
return false;
}
return (
vm.items.filter(
(item) => item.name.toLowerCase() === vm.searchTerm.toLowerCase()
).length === 0
);
},
},
methods: {
selectItem(item) {
const prev = this.getSelected();
if (prev !== null) {
prev.selected = false;
}
item.selected = true;
window.location.href = item.url;
},
createNewBranch() {
if (!this.showCreateNewBranch) {
return;
}
$(this.$refs.newBranchForm).trigger("submit");
},
focusSearchField() {
const vm = this;
Vue.nextTick(() => {
vm.$refs.searchField.focus();
});
},
getSelected() {
for (let i = 0, j = this.items.length; i < j; ++i) {
if (this.items[i].selected) return this.items[i];
}
return null;
},
getSelectedIndexInFiltered() {
for (let i = 0, j = this.filteredItems.length; i < j; ++i) {
if (this.filteredItems[i].selected) return i;
}
return -1;
},
scrollToActive() {
let el = this.$refs[`listItem${this.active}`];
if (!el || el.length === 0) {
return;
}
if (Array.isArray(el)) {
el = el[0];
}
const cont = this.$refs.scrollContainer;
if (el.offsetTop < cont.scrollTop) {
cont.scrollTop = el.offsetTop;
} else if (
el.offsetTop + el.clientHeight >
cont.scrollTop + cont.clientHeight
) {
cont.scrollTop = el.offsetTop + el.clientHeight - cont.clientHeight;
}
},
keydown(event) {
const vm = this;
if (event.keyCode === 40) {
// arrow down
event.preventDefault();
if (vm.active === -1) {
vm.active = vm.getSelectedIndexInFiltered();
}
if (
vm.active + (vm.showCreateNewBranch ? 0 : 1) >=
vm.filteredItems.length
) {
return;
}
vm.active++;
vm.scrollToActive();
}
if (event.keyCode === 38) {
// arrow up
event.preventDefault();
if (vm.active === -1) {
vm.active = vm.getSelectedIndexInFiltered();
}
if (vm.active <= 0) {
return;
}
vm.active--;
vm.scrollToActive();
}
if (event.keyCode === 13) {
// enter
event.preventDefault();
if (vm.active >= vm.filteredItems.length) {
vm.createNewBranch();
} else if (vm.active >= 0) {
vm.selectItem(vm.filteredItems[vm.active]);
}
}
if (event.keyCode === 27) {
// escape
event.preventDefault();
vm.menuVisible = false;
}
},
},
});
});
}
$(".commit-button").on("click", function (e) {
e.preventDefault();
$(this).parent().find(".commit-body").toggle();
});
function initNavbarContentToggle() {
const content = $("#navbar");
const toggle = $("#navbar-expand-toggle");
let isExpanded = false;
toggle.on("click", () => {
isExpanded = !isExpanded;
if (isExpanded) {
content.addClass("shown");
toggle.addClass("active");
} else {
content.removeClass("shown");
toggle.removeClass("active");
}
});
}
window.toggleDeadlineForm = function () {
$("#deadlineForm").fadeToggle(150);
};
window.setDeadline = function () {
const deadline = $("#deadlineDate").val();
window.updateDeadline(deadline);
};
window.updateDeadline = function (deadlineString) {
$("#deadline-err-invalid-date").hide();
$("#deadline-loader").addClass("loading");
let realDeadline = null;
if (deadlineString !== "") {
const newDate = Date.parse(deadlineString);
if (Number.isNaN(newDate)) {
$("#deadline-loader").removeClass("loading");
$("#deadline-err-invalid-date").show();
return false;
}
realDeadline = new Date(newDate);
}
$.ajax(`${$("#update-issue-deadline-form").attr("action")}/deadline`, {
data: JSON.stringify({
due_date: realDeadline,
}),
headers: {
"X-Csrf-Token": csrf,
"X-Remote": true,
},
contentType: "application/json",
type: "POST",
success() {
reload();
},
error() {
$("#deadline-loader").removeClass("loading");
$("#deadline-err-invalid-date").show();
},
});
};
window.deleteDependencyModal = function (id, type) {
$(".remove-dependency")
.modal({
closable: false,
duration: 200,
onApprove() {
$("#removeDependencyID").val(id);
$("#dependencyType").val(type);
$("#removeDependencyForm").trigger("submit");
},
})
.modal("show");
};
function initIssueList() {
const repolink = $("#repolink").val();
const repoId = $("#repoId").val();
const crossRepoSearch = $("#crossRepoSearch").val();
const tp = $("#type").val();
let issueSearchUrl = `${AppSubUrl}/api/v1/repos/${repolink}/issues?q={query}&type=${tp}`;
if (crossRepoSearch === "true") {
issueSearchUrl = `${AppSubUrl}/api/v1/repos/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
}
$("#new-dependency-drop-list").dropdown({
apiSettings: {
url: issueSearchUrl,
onResponse(response) {
const filteredResponse = { success: true, results: [] };
const currIssueId = $("#new-dependency-drop-list").data("issue-id");
// Parse the response from the api to work with our dropdown
$.each(response, (_i, issue) => {
// Don't list current issue in the dependency list.
if (issue.id === currIssueId) {
return;
}
filteredResponse.results.push({
name: `#${issue.number} ${htmlEncode(
issue.title
)} ${htmlEncode(
issue.repository.full_name
)} `,
value: issue.id,
});
});
return filteredResponse;
},
cache: false,
},
fullTextSearch: true,
});
$(".menu a.label-filter-item").each(function () {
$(this).on("click", function (e) {
if (e.altKey) {
e.preventDefault();
const href = $(this).attr("href");
const id = $(this).data("label-id");
const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;
const newStr = "labels=$1-$2$3&";
window.location = href.replace(new RegExp(regStr), newStr);
}
});
});
$(".menu .ui.dropdown.label-filter").on("keydown", (e) => {
if (e.altKey && e.keyCode === 13) {
const selectedItems = $(
".menu .ui.dropdown.label-filter .menu .item.selected"
);
if (selectedItems.length > 0) {
const item = $(selectedItems[0]);
const href = item.attr("href");
const id = item.data("label-id");
const regStr = `labels=(-?[0-9]+%2c)*(${id})(%2c-?[0-9]+)*&`;
const newStr = "labels=$1-$2$3&";
window.location = href.replace(new RegExp(regStr), newStr);
}
}
});
}
window.cancelCodeComment = function (btn) {
const form = $(btn).closest("form");
if (form.length > 0 && form.hasClass("comment-form")) {
form.addClass("hide");
form.parent().find("button.comment-form-reply").show();
} else {
form.closest(".comment-code-cloud").remove();
}
};
window.submitReply = function (btn) {
const form = $(btn).closest("form");
if (form.length > 0 && form.hasClass("comment-form")) {
form.trigger("submit");
}
};
window.onOAuthLoginClick = function () {
const oauthLoader = $("#oauth2-login-loader");
const oauthNav = $("#oauth2-login-navigator");
oauthNav.hide();
oauthLoader.removeClass("disabled");
setTimeout(() => {
// recover previous content to let user try again
// usually redirection will be performed before this action
oauthLoader.addClass("disabled");
oauthNav.show();
}, 5000);
};
// Pull SVGs via AJAX to workaround CORS issues with |