aboutsummaryrefslogtreecommitdiffstats
path: root/chained-ci-vue/js/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'chained-ci-vue/js/index.js')
-rw-r--r--chained-ci-vue/js/index.js250
1 files changed, 250 insertions, 0 deletions
diff --git a/chained-ci-vue/js/index.js b/chained-ci-vue/js/index.js
new file mode 100644
index 0000000..447a27b
--- /dev/null
+++ b/chained-ci-vue/js/index.js
@@ -0,0 +1,250 @@
+// Init token we need to fetch
+var privateTokens = [];
+tokenTargets.forEach(function(target){
+ privateTokens.push({'target': target,
+ 'value': '',
+ 'msg': '',
+ 'icon': '',
+ 'accessGranted': false})
+})
+pipelineRefreshId = -1;
+// Start the authentication
+authenticate();
+
+
+/**
+ * VUE for authentication form
+ *
+ * @data {list} privateTokens list of token objects
+ * @data {list} gitlabProfileToken list of gitlab token to ask
+ *
+ * @computed {dict} tokensByTarget dict of tokens by target
+ * @computed {dict} globalAccessGranted remove the form if all token are verified
+ *
+ * @methods {function} check the form by starting validateTokens
+ */
+var headerVue = new Vue({
+ el: '#header',
+ data: {project: {}}
+});
+
+/**
+ * VUE for pipelines
+ *
+ * @data {bool} loading lock var to avoid concurrent load
+ * @data {dict} pipelines dict of pipelines
+ * @data {list} pipelinesIds list of pipelines
+ * @data {bool} accessGranted show the pipelines
+ * @data {int} pages page indication
+ *
+ * @computed {list} sortedPipelinesIds list of reverse pipelines ids
+ *
+ * @methods {function} job_details load job details on click
+ * @methods {function} handleScroll load new pipelines on scroll to bottom
+ */
+var pipelinesVue = new Vue({
+ el: '#pipelines',
+ data: {
+ loading: false,
+ newPipelineUrl: '',
+ pipelines: {},
+ pipelinesIds: [],
+ accessGranted: false,
+ pipelineFilter: '',
+ pages: 1,
+ timer: updateTimer,
+ actualRefresh: updateTimer * 2,
+ optimizedRefresh: false,
+ },
+ computed: {
+ sortedPipelinesIds: function() {
+ filteredList = [];
+ var pipelines = this.pipelines;
+ var filter = this.pipelineFilter;
+ this.pipelinesIds.sort().reverse().forEach(
+ function(pipelineId){
+ if(pipelines[pipelineId].scenario.includes(filter)){
+ filteredList.push(pipelineId)
+ }
+ }
+ );
+ this.optimizedRefresh = (filteredList.length <= optimizedRefreshLevel);
+ if(this.optimizedRefresh){
+ updateLoop(updateTimer/2);
+ }else{
+ updateLoop(updateTimer);
+ }
+ return filteredList;
+ }
+ },
+ methods:{
+ mouseOverJob: function(job){
+ iconMouseOver(job);
+ },
+ mouseLeaveJob: function(job){
+ iconMouseLeave(job);
+ },
+ jobAction: function(job){
+ jobActionSwitch(job.status, job.id)
+ },
+ jobDetails: function(event, job){
+ taskDetailsVue.showModal = true;
+ taskDetailsVue.showWaiting = true;
+ taskDetailsVue.showPipeline = false;
+ loadSubPipeline(job.id, job.name);
+ },
+ loadMore: function() {
+ if (!pipelinesVue.loading){
+ pipelinesVue.loading = true;
+ pipelinesVue.pages += 1;
+ loadPipelines(pipelinesVue.pages);
+ }
+ },
+ }
+});
+
+// Vue.directive('scroll', {
+// inserted: function(el, binding) {
+// let f = function(evt) {
+// if (binding.value(evt, el)) {}
+// };
+// window.addEventListener('scroll', f);
+// },
+// });
+
+/**
+ * VUE for authentication form
+ *
+ * @data {list} privateTokens list of token objects
+ * @data {list} gitlabProfileToken list of gitlab token to ask
+ *
+ * @computed {dict} tokensByTarget dict of tokens by target
+ * @computed {dict} globalAccessGranted remove the form if all token are verified
+ *
+ * @methods {function} check the form by starting validateTokens
+ */
+var authVue = new Vue({
+ el: '#auth',
+ data: {privateTokens: privateTokens,
+ gitlabProfileToken: gitlabProfileToken},
+ methods:{
+ checkForm: function (e) {
+ validateTokens(this.privateTokens);
+ e.preventDefault();
+ }
+ },
+ computed: {
+ tokensByTarget: function() {
+ tokens = {}
+ this.privateTokens.forEach(function(token){
+ tokens[token.target] = token.value
+ });
+ return tokens
+ },
+ globalAccessGranted: function() {
+ granted = true;
+ this.privateTokens.forEach(function(token){
+ granted = (granted && token.accessGranted)
+ });
+ if (granted){
+ localStorage.setItem("chained_ci_tokens", JSON.stringify(this.privateTokens));
+ load()
+ }
+ pipelinesVue.accessGranted = granted
+ return granted;
+ }
+ }
+});
+
+/**
+ * VUE for the detail of a job (show the sub pipeline)
+ *
+ * @data {bool} showModal show the modal vue
+ * @data {bool} showPipeline show the pipeline
+ * @data {bool} showWaiting show the waiting message
+ * @data {bool} chainedCiFailure prompt a message of chained ci failed
+ * @data {dict} pipeline pipeline data
+ */
+var taskDetailsVue = new Vue({
+ el: '#task_details',
+ data: {
+ showModal: false,
+ showPipeline: false,
+ showWaiting: false,
+ chainedCiFailure: false,
+ pipeline: {
+ 'name': '',
+ 'url': '',
+ 'id': '',
+ 'status': '',
+ 'statusIcon': '',
+ 'console': '',
+ 'stages': [],
+ 'parentTaskId': '',
+ 'parentTaskName': '',
+ }
+ },
+ methods:{
+ mouseOverPipeline: function(pipeline){
+ iconMouseOver(pipeline);
+ },
+ mouseLeavePipeline: function(pipeline){
+ iconMouseLeave(pipeline);
+ },
+ jobAction: function(pipeline){
+ console.log(pipeline)
+ this.showModal = false;
+ this.showPipeline = false;
+ jobActionSwitch(pipeline.status, pipeline.parentTaskId)
+ }
+ }
+});
+
+/**
+ * VUE for alert
+ *
+ * @data {bool} showModal show the modal vue
+ * @data {bool} showPipeline show the pipeline
+ * @data {bool} showWaiting show the waiting message
+ * @data {bool} chainedCiFailure prompt a message of chained ci failed
+ * @data {dict} pipeline pipeline data
+ */
+var alertVue = new Vue({
+ el: '#alert',
+ data: {
+ showModal: false,
+ title: '',
+ message: '',
+ }
+});
+
+// Modal template
+Vue.component('modal', {
+ template: '#modal-template',
+ methods:{
+ closeModal: function(event, emit){
+ if(event.target.className == 'modal-wrapper'){
+ // emit('close')
+ alertVue.showModal = false
+ alertVue.title = ''
+ alertVue.message = ''
+ taskDetailsVue.showModal = false
+ taskDetailsVue.showPipeline = false
+ taskDetailsVue.showWaiting = false
+ taskDetailsVue.chainedCiFailure = false
+ taskDetailsVue.pipeline = {
+ 'name': '',
+ 'url': '',
+ 'id': '',
+ 'status': '',
+ 'statusIcon': '',
+ 'console': '',
+ 'stages': [],
+ 'parentTaskId': '',
+ 'parentTaskName': '',
+ }
+ updatePipelines
+ }
+ },
+ },
+})