/* 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 initImage from './features/images.js'
// import $ from 'jquery.js'
import router from './router/index.js'
Vue.use(ElementUI);
Vue.prototype.$axios = axios;
Vue.prototype.$Cookies = Cookies;
Vue.prototype.qs = qs;
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();
initTeamSettings();
initCtrlEnterSubmit();
initNavbarContentToggle();
// initTopicbar();vim
// closeTopicbar();
initU2FAuth();
initU2FRegister();
initIssueList();
initWipTitle();
initPullRequestReview();
initRepoStatusChecker();
initTemplateSearch();
initContextPopups();
initNotificationsTable();
initNotificationCount();
initTribute();
initDropDown();
initCloudrain();
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('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) {
// Only modify if repo_name input is blank
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() {
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)
});
}
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 |