mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-17 05:54:19 +01:00
Add comments section to admin users/teams pages. (#1600)
* Add a comments section for a user's page in the Admin Panel * Move user graphs into a modal for Admin Panel * Create a new webpack JS chunk for the admin section for the Vue components (`components.js`) - Not really sure why webpack needed this to be separated out * Closes #1052
This commit is contained in:
@@ -97,7 +97,7 @@ export default {
|
|||||||
if (comment.length > 0) {
|
if (comment.length > 0) {
|
||||||
helpers.comments.add_comment(
|
helpers.comments.add_comment(
|
||||||
comment,
|
comment,
|
||||||
"challenge",
|
this.$props.type,
|
||||||
this.getArgs(),
|
this.getArgs(),
|
||||||
() => {
|
() => {
|
||||||
this.loadComments();
|
this.loadComments();
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import CTFd from "core/CTFd";
|
|||||||
import { htmlEntities } from "core/utils";
|
import { htmlEntities } from "core/utils";
|
||||||
import { ezAlert, ezQuery, ezBadge } from "core/ezq";
|
import { ezAlert, ezQuery, ezBadge } from "core/ezq";
|
||||||
import { createGraph, updateGraph } from "core/graphs";
|
import { createGraph, updateGraph } from "core/graphs";
|
||||||
|
import Vue from "vue/dist/vue.esm.browser";
|
||||||
|
import CommentBox from "../components/comments/CommentBox.vue";
|
||||||
|
|
||||||
function createTeam(event) {
|
function createTeam(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -481,11 +483,30 @@ $(() => {
|
|||||||
|
|
||||||
$("#team-info-edit-form").submit(updateTeam);
|
$("#team-info-edit-form").submit(updateTeam);
|
||||||
|
|
||||||
|
// Insert CommentBox element
|
||||||
|
const commentBox = Vue.extend(CommentBox);
|
||||||
|
let vueContainer = document.createElement("div");
|
||||||
|
document.querySelector("#comment-box").appendChild(vueContainer);
|
||||||
|
new commentBox({
|
||||||
|
propsData: { type: "team", id: window.TEAM_ID }
|
||||||
|
}).$mount(vueContainer);
|
||||||
|
|
||||||
let type, id, name, account_id;
|
let type, id, name, account_id;
|
||||||
({ type, id, name, account_id } = window.stats_data);
|
({ type, id, name, account_id } = window.stats_data);
|
||||||
|
|
||||||
|
let intervalId;
|
||||||
|
$("#team-statistics-modal").on("shown.bs.modal", function(_e) {
|
||||||
createGraphs(type, id, name, account_id);
|
createGraphs(type, id, name, account_id);
|
||||||
setInterval(() => {
|
intervalId = setInterval(() => {
|
||||||
updateGraphs(type, id, name, account_id);
|
updateGraphs(type, id, name, account_id);
|
||||||
}, 300000);
|
}, 300000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#team-statistics-modal").on("hidden.bs.modal", function(_e) {
|
||||||
|
clearInterval(intervalId);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".statistics-team").click(function(_event) {
|
||||||
|
$("#team-statistics-modal").modal("toggle");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import CTFd from "core/CTFd";
|
|||||||
import { htmlEntities } from "core/utils";
|
import { htmlEntities } from "core/utils";
|
||||||
import { ezQuery, ezBadge } from "core/ezq";
|
import { ezQuery, ezBadge } from "core/ezq";
|
||||||
import { createGraph, updateGraph } from "core/graphs";
|
import { createGraph, updateGraph } from "core/graphs";
|
||||||
|
import Vue from "vue/dist/vue.esm.browser";
|
||||||
|
import CommentBox from "../components/comments/CommentBox.vue";
|
||||||
|
|
||||||
function createUser(event) {
|
function createUser(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -441,11 +443,30 @@ $(() => {
|
|||||||
$("#user-info-edit-form").submit(updateUser);
|
$("#user-info-edit-form").submit(updateUser);
|
||||||
$("#user-award-form").submit(awardUser);
|
$("#user-award-form").submit(awardUser);
|
||||||
|
|
||||||
|
// Insert CommentBox element
|
||||||
|
const commentBox = Vue.extend(CommentBox);
|
||||||
|
let vueContainer = document.createElement("div");
|
||||||
|
document.querySelector("#comment-box").appendChild(vueContainer);
|
||||||
|
new commentBox({
|
||||||
|
propsData: { type: "user", id: window.USER_ID }
|
||||||
|
}).$mount(vueContainer);
|
||||||
|
|
||||||
let type, id, name, account_id;
|
let type, id, name, account_id;
|
||||||
({ type, id, name, account_id } = window.stats_data);
|
({ type, id, name, account_id } = window.stats_data);
|
||||||
|
|
||||||
|
let intervalId;
|
||||||
|
$("#user-statistics-modal").on("shown.bs.modal", function(_e) {
|
||||||
createGraphs(type, id, name, account_id);
|
createGraphs(type, id, name, account_id);
|
||||||
setInterval(() => {
|
intervalId = setInterval(() => {
|
||||||
updateGraphs(type, id, name, account_id);
|
updateGraphs(type, id, name, account_id);
|
||||||
}, 300000);
|
}, 300000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#user-statistics-modal").on("hidden.bs.modal", function(_e) {
|
||||||
|
clearInterval(intervalId);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".statistics-user").click(function(_event) {
|
||||||
|
$("#user-statistics-modal").modal("toggle");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
157
CTFd/themes/admin/static/js/components.dev.js
Normal file
157
CTFd/themes/admin/static/js/components.dev.js
Normal file
File diff suppressed because one or more lines are too long
1
CTFd/themes/admin/static/js/components.min.js
vendored
Normal file
1
CTFd/themes/admin/static/js/components.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
CTFd/themes/admin/static/js/helpers.min.js
vendored
2
CTFd/themes/admin/static/js/helpers.min.js
vendored
@@ -1 +1 @@
|
|||||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{"./CTFd/themes/core/assets/js/helpers.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=r(n("./node_modules/jquery/dist/jquery.js")),p=r(n("./CTFd/themes/core/assets/js/ezq.js")),o=n("./CTFd/themes/core/assets/js/utils.js");function r(e){return e&&e.__esModule?e:{default:e}}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],o=!0,r=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(o=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);o=!0);}catch(e){r=!0,i=e}finally{try{o||null==a.return||a.return()}finally{if(r)throw i}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var i={files:{upload:function(t,e,n){var o=window.CTFd;t instanceof d.default&&(t=t[0]);var r=new FormData(t);r.append("nonce",o.config.csrfNonce);for(var i=0,s=Object.entries(e);i<s.length;i++){var a=f(s[i],2),l=a[0],c=a[1];r.append(l,c)}var u=p.default.ezProgressBar({width:0,title:"Upload Progress"});d.default.ajax({url:o.config.urlRoot+"/api/v1/files",data:r,type:"POST",cache:!1,contentType:!1,processData:!1,xhr:function(){var e=d.default.ajaxSettings.xhr();return e.upload.onprogress=function(e){if(e.lengthComputable){var t=e.loaded/e.total*100;u=p.default.ezProgressBar({target:u,width:t})}},e},success:function(e){t.reset(),u=p.default.ezProgressBar({target:u,width:100}),setTimeout(function(){u.modal("hide")},500),n&&n(e)}})}},comments:{get_comments:function(e){return window.CTFd.fetch("/api/v1/comments?"+d.default.param(e),{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()})},add_comment:function(e,t,n,o){var r=window.CTFd,i=function(t){for(var e=1;e<arguments.length;e++)if(e%2){var n=null!=arguments[e]?arguments[e]:{},o=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),o.forEach(function(e){s(t,e,n[e])})}else Object.defineProperties(t,Object.getOwnPropertyDescriptors(arguments[e]));return t}({content:e,type:t},n);r.fetch("/api/v1/comments",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(i)}).then(function(e){return e.json()}).then(function(e){o&&o(e)})},delete_comment:function(e){return window.CTFd.fetch("/api/v1/comments/".concat(e),{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()})}},utils:{htmlEntities:o.htmlEntities,colorHash:o.colorHash,copyToClipboard:o.copyToClipboard},ezq:p.default};t.default=i},"./node_modules/markdown-it/lib/helpers/index.js":function(e,t,n){t.parseLinkLabel=n("./node_modules/markdown-it/lib/helpers/parse_link_label.js"),t.parseLinkDestination=n("./node_modules/markdown-it/lib/helpers/parse_link_destination.js"),t.parseLinkTitle=n("./node_modules/markdown-it/lib/helpers/parse_link_title.js")},"./node_modules/markdown-it/lib/helpers/parse_link_destination.js":function(e,t,n){var a=n("./node_modules/markdown-it/lib/common/utils.js").unescapeAll;e.exports=function(e,t,n){var o,r,i=t,s={ok:!1,pos:0,lines:0,str:""};if(60===e.charCodeAt(t)){for(t++;t<n;){if(10===(o=e.charCodeAt(t)))return s;if(62===o)return s.pos=t+1,s.str=a(e.slice(i+1,t)),s.ok=!0,s;92===o&&t+1<n?t+=2:t++}return s}for(r=0;t<n&&32!==(o=e.charCodeAt(t))&&!(o<32||127===o);)if(92===o&&t+1<n)t+=2;else{if(40===o&&r++,41===o){if(0===r)break;r--}t++}return i===t||0!==r||(s.str=a(e.slice(i,t)),s.lines=0,s.pos=t,s.ok=!0),s}},"./node_modules/markdown-it/lib/helpers/parse_link_label.js":function(e,t,n){e.exports=function(e,t,n){var o,r,i,s,a=-1,l=e.posMax,c=e.pos;for(e.pos=t+1,o=1;e.pos<l;){if(93===(i=e.src.charCodeAt(e.pos))&&0===--o){r=!0;break}if(s=e.pos,e.md.inline.skipToken(e),91===i)if(s===e.pos-1)o++;else if(n)return e.pos=c,-1}return r&&(a=e.pos),e.pos=c,a}},"./node_modules/markdown-it/lib/helpers/parse_link_title.js":function(e,t,n){var l=n("./node_modules/markdown-it/lib/common/utils.js").unescapeAll;e.exports=function(e,t,n){var o,r,i=0,s=t,a={ok:!1,pos:0,lines:0,str:""};if(n<=t)return a;if(34!==(r=e.charCodeAt(t))&&39!==r&&40!==r)return a;for(t++,40===r&&(r=41);t<n;){if((o=e.charCodeAt(t))===r)return a.pos=t+1,a.lines=i,a.str=l(e.slice(s+1,t)),a.ok=!0,a;10===o?i++:92===o&&t+1<n&&(t++,10===e.charCodeAt(t)&&i++),t++}return a}}}]);
|
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"./CTFd/themes/core/assets/js/helpers.js":function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var d=r(n("./node_modules/jquery/dist/jquery.js")),p=r(n("./CTFd/themes/core/assets/js/ezq.js")),o=n("./CTFd/themes/core/assets/js/utils.js");function r(e){return e&&e.__esModule?e:{default:e}}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],o=!0,r=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(o=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);o=!0);}catch(e){r=!0,i=e}finally{try{o||null==a.return||a.return()}finally{if(r)throw i}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var i={files:{upload:function(t,e,n){var o=window.CTFd;t instanceof d.default&&(t=t[0]);var r=new FormData(t);r.append("nonce",o.config.csrfNonce);for(var i=0,s=Object.entries(e);i<s.length;i++){var a=f(s[i],2),l=a[0],c=a[1];r.append(l,c)}var u=p.default.ezProgressBar({width:0,title:"Upload Progress"});d.default.ajax({url:o.config.urlRoot+"/api/v1/files",data:r,type:"POST",cache:!1,contentType:!1,processData:!1,xhr:function(){var e=d.default.ajaxSettings.xhr();return e.upload.onprogress=function(e){if(e.lengthComputable){var t=e.loaded/e.total*100;u=p.default.ezProgressBar({target:u,width:t})}},e},success:function(e){t.reset(),u=p.default.ezProgressBar({target:u,width:100}),setTimeout(function(){u.modal("hide")},500),n&&n(e)}})}},comments:{get_comments:function(e){return window.CTFd.fetch("/api/v1/comments?"+d.default.param(e),{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()})},add_comment:function(e,t,n,o){var r=window.CTFd,i=function(t){for(var e=1;e<arguments.length;e++)if(e%2){var n=null!=arguments[e]?arguments[e]:{},o=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(o=o.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),o.forEach(function(e){s(t,e,n[e])})}else Object.defineProperties(t,Object.getOwnPropertyDescriptors(arguments[e]));return t}({content:e,type:t},n);r.fetch("/api/v1/comments",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(i)}).then(function(e){return e.json()}).then(function(e){o&&o(e)})},delete_comment:function(e){return window.CTFd.fetch("/api/v1/comments/".concat(e),{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()})}},utils:{htmlEntities:o.htmlEntities,colorHash:o.colorHash,copyToClipboard:o.copyToClipboard},ezq:p.default};t.default=i},"./node_modules/markdown-it/lib/helpers/index.js":function(e,t,n){t.parseLinkLabel=n("./node_modules/markdown-it/lib/helpers/parse_link_label.js"),t.parseLinkDestination=n("./node_modules/markdown-it/lib/helpers/parse_link_destination.js"),t.parseLinkTitle=n("./node_modules/markdown-it/lib/helpers/parse_link_title.js")},"./node_modules/markdown-it/lib/helpers/parse_link_destination.js":function(e,t,n){var a=n("./node_modules/markdown-it/lib/common/utils.js").unescapeAll;e.exports=function(e,t,n){var o,r,i=t,s={ok:!1,pos:0,lines:0,str:""};if(60===e.charCodeAt(t)){for(t++;t<n;){if(10===(o=e.charCodeAt(t)))return s;if(62===o)return s.pos=t+1,s.str=a(e.slice(i+1,t)),s.ok=!0,s;92===o&&t+1<n?t+=2:t++}return s}for(r=0;t<n&&32!==(o=e.charCodeAt(t))&&!(o<32||127===o);)if(92===o&&t+1<n)t+=2;else{if(40===o&&r++,41===o){if(0===r)break;r--}t++}return i===t||0!==r||(s.str=a(e.slice(i,t)),s.lines=0,s.pos=t,s.ok=!0),s}},"./node_modules/markdown-it/lib/helpers/parse_link_label.js":function(e,t,n){e.exports=function(e,t,n){var o,r,i,s,a=-1,l=e.posMax,c=e.pos;for(e.pos=t+1,o=1;e.pos<l;){if(93===(i=e.src.charCodeAt(e.pos))&&0===--o){r=!0;break}if(s=e.pos,e.md.inline.skipToken(e),91===i)if(s===e.pos-1)o++;else if(n)return e.pos=c,-1}return r&&(a=e.pos),e.pos=c,a}},"./node_modules/markdown-it/lib/helpers/parse_link_title.js":function(e,t,n){var l=n("./node_modules/markdown-it/lib/common/utils.js").unescapeAll;e.exports=function(e,t,n){var o,r,i=0,s=t,a={ok:!1,pos:0,lines:0,str:""};if(n<=t)return a;if(34!==(r=e.charCodeAt(t))&&39!==r&&40!==r)return a;for(t++,40===r&&(r=41);t<n;){if((o=e.charCodeAt(t))===r)return a.pos=t+1,a.lines=i,a.str=l(e.slice(s+1,t)),a.ok=!0,a;10===o?i++:92===o&&t+1<n&&(t++,10===e.charCodeAt(t)&&i++),t++}return a}}}]);
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/challenges.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/challenges.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/configs.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/configs.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/editor.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/editor.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/main.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/main.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/notifications.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/notifications.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/pages.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/pages.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/reset.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/reset.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/scoreboard.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/scoreboard.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/statistics.js","helpers","echarts","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/statistics.js","components","helpers","echarts","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/submissions.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/submissions.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/teams.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/teams.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -147,7 +147,7 @@
|
|||||||
/******/
|
/******/
|
||||||
/******/
|
/******/
|
||||||
/******/ // add entry module to deferred list
|
/******/ // add entry module to deferred list
|
||||||
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/users.js","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
/******/ deferredModules.push(["./CTFd/themes/admin/assets/js/pages/users.js","components","helpers","vendor","default~pages/challenge~pages/challenges~pages/configs~pages/editor~pages/main~pages/notifications~p~d5a3cc0a"]);
|
||||||
/******/ // run deferred modules when ready
|
/******/ // run deferred modules when ready
|
||||||
/******/ return checkDeferredModules();
|
/******/ return checkDeferredModules();
|
||||||
/******/ })
|
/******/ })
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
|||||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"./node_modules/bootstrap/dist/js/bootstrap.bundle.js":function(o,i,a){(function(no){var e,t,n,r;function ro(e){return(ro="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}
|
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"./node_modules/bootstrap/dist/js/bootstrap.bundle.js":function(o,i,a){(function(no){var e,t,n,r;function ro(e){return(ro="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}
|
||||||
/*!
|
/*!
|
||||||
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
||||||
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
||||||
|
|||||||
@@ -143,6 +143,7 @@
|
|||||||
<script defer src="{{ url_for('views.themes', theme='admin', path='js/vendor.bundle.js') }}"></script>
|
<script defer src="{{ url_for('views.themes', theme='admin', path='js/vendor.bundle.js') }}"></script>
|
||||||
<script defer src="{{ url_for('views.themes', theme='admin', path='js/core.js') }}"></script>
|
<script defer src="{{ url_for('views.themes', theme='admin', path='js/core.js') }}"></script>
|
||||||
<script defer src="{{ url_for('views.themes', theme='admin', path='js/helpers.js') }}"></script>
|
<script defer src="{{ url_for('views.themes', theme='admin', path='js/helpers.js') }}"></script>
|
||||||
|
<script defer src="{{ url_for('views.themes', theme='admin', path='js/components.js') }}"></script>
|
||||||
|
|
||||||
{% block entrypoint %}
|
{% block entrypoint %}
|
||||||
<script defer src="{{ url_for('views.themes', theme='admin', path='js/pages/main.js') }}"></script>
|
<script defer src="{{ url_for('views.themes', theme='admin', path='js/pages/main.js') }}"></script>
|
||||||
|
|||||||
23
CTFd/themes/admin/templates/modals/teams/statistics.html
Normal file
23
CTFd/themes/admin/templates/modals/teams/statistics.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<div class="row min-vh-25">
|
||||||
|
{% if solves %}
|
||||||
|
<div id="keys-pie-graph" class="col-md-6 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="categories-pie-graph" class="col-md-6 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="score-graph" class="col-md-12 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||||
|
No data yet
|
||||||
|
</h3>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
23
CTFd/themes/admin/templates/modals/users/statistics.html
Normal file
23
CTFd/themes/admin/templates/modals/users/statistics.html
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<div class="row min-vh-25">
|
||||||
|
{% if solves %}
|
||||||
|
<div id="keys-pie-graph" class="col-md-6 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="categories-pie-graph" class="col-md-6 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="score-graph" class="col-md-12 d-flex align-items-center">
|
||||||
|
<div class="text-center w-100">
|
||||||
|
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
||||||
|
No data yet
|
||||||
|
</h3>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
@@ -20,6 +20,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="team-statistics-modal" class="modal fade">
|
||||||
|
<div class="modal-dialog modal-xl">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h2 class="modal-action text-center w-100">Team Statistics</h2>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body clearfix">
|
||||||
|
{% include "admin/modals/teams/statistics.html" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="team-captain-modal" class="modal fade">
|
<div id="team-captain-modal" class="modal fade">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@@ -140,6 +156,10 @@
|
|||||||
<i class="btn-fa fas fa-pencil-alt fa-2x px-2" data-toggle="tooltip" data-placement="top"
|
<i class="btn-fa fas fa-pencil-alt fa-2x px-2" data-toggle="tooltip" data-placement="top"
|
||||||
title="Edit Team"></i>
|
title="Edit Team"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="statistics-team text-dark">
|
||||||
|
<i class="btn-fa fas fa-chart-pie fa-2x px-2" data-toggle="tooltip" data-placement="top"
|
||||||
|
title="Team Statistics"></i>
|
||||||
|
</a>
|
||||||
<a class="edit-captain text-dark">
|
<a class="edit-captain text-dark">
|
||||||
<i class="btn-fa fas fa-user-tag fa-2x px-2" data-toggle="tooltip" data-placement="top"
|
<i class="btn-fa fas fa-user-tag fa-2x px-2" data-toggle="tooltip" data-placement="top"
|
||||||
title="Choose Captain"></i>
|
title="Choose Captain"></i>
|
||||||
@@ -167,31 +187,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row min-vh-25">
|
<div class="row min-vh-25 pt-5 pb-5">
|
||||||
{% if solves %}
|
|
||||||
<div id="keys-pie-graph" class="col-md-6 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="categories-pie-graph" class="col-md-6 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="score-graph" class="col-md-12 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">
|
|
||||||
No solves yet
|
|
||||||
</h3>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row pt-5 min-vh-25">
|
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<h3 class="text-center">Team Members</h3>
|
<h3 class="text-center">Team Members</h3>
|
||||||
@@ -249,7 +245,7 @@
|
|||||||
aria-controls="nav-missing" aria-selected="false">Missing</a>
|
aria-controls="nav-missing" aria-selected="false">Missing</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="tab-content min-vh-50" id="nav-tabContent">
|
<div class="tab-content min-vh-50 pb-5" id="nav-tabContent">
|
||||||
<div class="tab-pane fade show active" id="nav-solves" role="tabpanel" aria-labelledby="nav-solves-tab">
|
<div class="tab-pane fade show active" id="nav-solves" role="tabpanel" aria-labelledby="nav-solves-tab">
|
||||||
<h3 class="text-center pt-5 d-block">Solves</h3>
|
<h3 class="text-center pt-5 d-block">Solves</h3>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -489,6 +485,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row min-vh-25 pt-5">
|
||||||
|
<div class="col-md-10 offset-md-1">
|
||||||
|
<div id="comment-box">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -20,6 +20,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="user-statistics-modal" class="modal fade">
|
||||||
|
<div class="modal-dialog modal-xl">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h2 class="modal-action text-center w-100">User Statistics</h2>
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body clearfix">
|
||||||
|
{% include "admin/modals/users/statistics.html" %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="user-award-modal" class="modal fade">
|
<div id="user-award-modal" class="modal fade">
|
||||||
<div class="modal-dialog">
|
<div class="modal-dialog">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@@ -133,6 +149,9 @@
|
|||||||
<a class="edit-user text-dark">
|
<a class="edit-user text-dark">
|
||||||
<i class="btn-fa fas fa-user-edit fa-2x px-2" data-toggle="tooltip" data-placement="top" title="Edit User"></i>
|
<i class="btn-fa fas fa-user-edit fa-2x px-2" data-toggle="tooltip" data-placement="top" title="Edit User"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<a class="statistics-user text-dark">
|
||||||
|
<i class="btn-fa fas fa-chart-pie fa-2x px-2" data-toggle="tooltip" data-placement="top" title="User Statistics"></i>
|
||||||
|
</a>
|
||||||
<a class="award-user text-dark">
|
<a class="award-user text-dark">
|
||||||
<i class="btn-fa fas fa-trophy fa-2x px-2" data-toggle="tooltip" data-placement="top" title="Award User"></i>
|
<i class="btn-fa fas fa-trophy fa-2x px-2" data-toggle="tooltip" data-placement="top" title="Award User"></i>
|
||||||
</a>
|
</a>
|
||||||
@@ -158,29 +177,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row min-vh-25">
|
|
||||||
{% if solves %}
|
|
||||||
<div id="keys-pie-graph" class="col-md-6 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="categories-pie-graph" class="col-md-6 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="score-graph" class="col-md-12 d-flex align-items-center">
|
|
||||||
<div class="text-center w-100">
|
|
||||||
<i class="fas fa-circle-notch fa-spin fa-3x fa-fw spinner"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% else %}
|
|
||||||
<h3 class="opacity-50 text-center w-100 justify-content-center align-self-center">No solves yet</h3>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<nav class="nav nav-tabs nav-fill pt-5" id="myTab" role="tablist">
|
<nav class="nav nav-tabs nav-fill pt-5" id="myTab" role="tablist">
|
||||||
<a class="nav-item nav-link active" id="nav-solves-tab" data-toggle="tab" href="#nav-solves" role="tab"
|
<a class="nav-item nav-link active" id="nav-solves-tab" data-toggle="tab" href="#nav-solves" role="tab"
|
||||||
aria-controls="nav-solves" aria-selected="true">Solves</a>
|
aria-controls="nav-solves" aria-selected="true">Solves</a>
|
||||||
@@ -195,7 +191,7 @@
|
|||||||
aria-controls="nav-missing" aria-selected="false">Missing</a>
|
aria-controls="nav-missing" aria-selected="false">Missing</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="tab-content min-vh-50" id="nav-tabContent">
|
<div class="tab-content min-vh-25 pb-5" id="nav-tabContent">
|
||||||
<div class="tab-pane fade show active" id="nav-solves" role="tabpanel" aria-labelledby="nav-solves-tab">
|
<div class="tab-pane fade show active" id="nav-solves" role="tabpanel" aria-labelledby="nav-solves-tab">
|
||||||
<h3 class="text-center pt-5 d-block">Solves</h3>
|
<h3 class="text-center pt-5 d-block">Solves</h3>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -419,6 +415,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row min-vh-25 pt-5">
|
||||||
|
<div class="col-md-10 offset-md-1">
|
||||||
|
<div id="comment-box">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -318,3 +318,7 @@ export function updateGraph(
|
|||||||
let chart = echarts.init(document.querySelector(target));
|
let chart = echarts.init(document.querySelector(target));
|
||||||
chart.setOption(cfg.format(type, id, name, account_id, data));
|
chart.setOption(cfg.format(type, id, name, account_id, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function disposeGraph(target) {
|
||||||
|
echarts.dispose(document.querySelector(target));
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -104,6 +104,13 @@ function getJSConfig(root, type, entries, mode) {
|
|||||||
priority: 1,
|
priority: 1,
|
||||||
reuseExistingChunk: true,
|
reuseExistingChunk: true,
|
||||||
},
|
},
|
||||||
|
components: {
|
||||||
|
name: 'components',
|
||||||
|
filename: `components.${ext}.js`,
|
||||||
|
test: /components/,
|
||||||
|
priority: 1,
|
||||||
|
reuseExistingChunk: true,
|
||||||
|
},
|
||||||
default: {
|
default: {
|
||||||
filename: `core.${ext}.js`,
|
filename: `core.${ext}.js`,
|
||||||
minChunks: 2,
|
minChunks: 2,
|
||||||
|
|||||||
Reference in New Issue
Block a user