Init store for registry
This commit is contained in:
parent
cd61d6e690
commit
13c86bb4ad
9 changed files with 205 additions and 0 deletions
0
app/assets/javascripts/registry/components/app.vue
Normal file
0
app/assets/javascripts/registry/components/app.vue
Normal file
|
@ -0,0 +1,42 @@
|
|||
<script>
|
||||
export default {
|
||||
name: 'collapsibeContainerRegisty',
|
||||
props: {
|
||||
canDelete: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
components: {
|
||||
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isOpen: false,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container-image">
|
||||
<i
|
||||
class="fa"
|
||||
:class="{
|
||||
'chevron-left': !isOpen,
|
||||
'chevron-up': isOpen,
|
||||
}"
|
||||
aria-hidden="true">
|
||||
</i>
|
||||
{{title}}
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
0
app/assets/javascripts/registry/index.js
Normal file
0
app/assets/javascripts/registry/index.js
Normal file
39
app/assets/javascripts/registry/stores/actions.js
Normal file
39
app/assets/javascripts/registry/stores/actions.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
import Vue from 'vue';
|
||||
import VueResource from 'vue-resource';
|
||||
import * as types from './mutation_types';
|
||||
|
||||
Vue.use(VueResource);
|
||||
|
||||
export const fetchRepos = ({ commit, state }) => {
|
||||
commit(types.TOGGLE_MAIN_LOADING);
|
||||
|
||||
return Vue.http.get(state.endpoint)
|
||||
.then(res => res.json())
|
||||
.then((response) => {
|
||||
commit(types.TOGGLE_MAIN_LOADING);
|
||||
commit(types.SET_REPOS_LIST, response);
|
||||
});
|
||||
};
|
||||
|
||||
export const fetchList = ({ commit }, list) => {
|
||||
commit(types.TOGGLE_IMAGE_LOADING, list);
|
||||
|
||||
return Vue.http.get(list.path)
|
||||
.then(res => res.json())
|
||||
.then((response) => {
|
||||
commit(types.TOGGLE_IMAGE_LOADING, list);
|
||||
commit(types.SET_IMAGES_LIST, list, response);
|
||||
});
|
||||
};
|
||||
|
||||
export const deleteRepo = ({ commit }, repo) => Vue.http.delete(repo.path)
|
||||
.then(res => res.json())
|
||||
.then(() => {
|
||||
commit(types.DELETE_REPO, repo);
|
||||
});
|
||||
|
||||
export const deleteImage = ({ commit }, image) => Vue.http.delete(image.path)
|
||||
.then(res => res.json())
|
||||
.then(() => {
|
||||
commit(types.DELETE_IMAGE, image);
|
||||
});
|
37
app/assets/javascripts/registry/stores/index.js
Normal file
37
app/assets/javascripts/registry/stores/index.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
import Vue from 'vue';
|
||||
import Vuex from 'vuex';
|
||||
import actions from './actions';
|
||||
import mutations from './mutations';
|
||||
|
||||
Vue.use(Vuex);
|
||||
|
||||
export default new Vuex.Store({
|
||||
state: {
|
||||
isLoading: false,
|
||||
endpoint: '', // initial endpoint to fetch the repos list
|
||||
/**
|
||||
* Each object in `repos` has the following strucure:
|
||||
* {
|
||||
* name: String,
|
||||
* isLoading: Boolean,
|
||||
* tagsPath: String // endpoint to request the list
|
||||
* destroyPath: String // endpoit to delete the repo
|
||||
* list: Array // List of the registry images
|
||||
* }
|
||||
*
|
||||
* Each registry image inside `list` has the following structure:
|
||||
* {
|
||||
* tag: String,
|
||||
* revision: String
|
||||
* shortRevision: String
|
||||
* size: Number
|
||||
* layers: Number
|
||||
* createdAt: String
|
||||
* destroyPath: String // endpoit to delete each image
|
||||
* }
|
||||
*/
|
||||
repos: [],
|
||||
actions,
|
||||
mutations,
|
||||
},
|
||||
});
|
9
app/assets/javascripts/registry/stores/mutation_types.js
Normal file
9
app/assets/javascripts/registry/stores/mutation_types.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
export const FETCH_REPOS_LIST = 'FETCH_REPOS_LIST';
|
||||
export const DELETE_REPO = 'DELETE_REPO';
|
||||
export const SET_REPOS_LIST = 'SET_REPOS_LIST';
|
||||
export const TOGGLE_MAIN_LOADING = 'TOGGLE_MAIN_LOADING';
|
||||
|
||||
export const FETCH_IMAGES_LIST = 'FETCH_IMAGES_LIST';
|
||||
export const SET_IMAGES_LIST = 'SET_IMAGES_LIST';
|
||||
export const DELETE_IMAGE = 'DELETE_IMAGE';
|
||||
export const TOGGLE_IMAGE_LOADING = 'TOGGLE_MAIN_LOADING';
|
38
app/assets/javascripts/registry/stores/mutations.js
Normal file
38
app/assets/javascripts/registry/stores/mutations.js
Normal file
|
@ -0,0 +1,38 @@
|
|||
import * as types from './mutation_types';
|
||||
|
||||
export default {
|
||||
[types.SET_REPOS_LIST](state, list) {
|
||||
Object.assign(state, {
|
||||
repos: list.map(el => ({
|
||||
name: el.name,
|
||||
isLoading: false,
|
||||
canDelete: !!el.destroy_path,
|
||||
destroyPath: el.destroy_path,
|
||||
list: [],
|
||||
})),
|
||||
});
|
||||
},
|
||||
|
||||
[types.TOGGLE_MAIN_LOADING](state) {
|
||||
Object.assign(state, { isLoading: !state.isLoading });
|
||||
},
|
||||
|
||||
[types.SET_IMAGES_LIST](state, image, list) {
|
||||
const listToUpdate = state.repos.find(el => el.name === image.name);
|
||||
listToUpdate.list = list.map(element => ({
|
||||
tag: element.name,
|
||||
revision: element.revision,
|
||||
shortRevision: element.short_revision,
|
||||
size: element.size,
|
||||
layers: element.layers,
|
||||
createdAt: element.created_at,
|
||||
destroyPath: element.destroy_path,
|
||||
canDelete: !!element.destroy_path,
|
||||
}));
|
||||
},
|
||||
|
||||
[types.TOGGLE_IMAGE_LOADING](state, image) {
|
||||
const listToUpdate = state.repos.find(el => el.name === image.name);
|
||||
listToUpdate.isLoading = !listToUpdate.isLoading;
|
||||
},
|
||||
};
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
import Clipboard from 'vendor/clipboard';
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'clipboardButton',
|
||||
props: {
|
||||
text: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
return new Clipboard(this.$refs.btn, {
|
||||
text: () => {
|
||||
return this.text;
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-transparent btn-clipboard"
|
||||
:data-title="title"
|
||||
:data-clipboard-text="text"
|
||||
ref="btn"
|
||||
>
|
||||
<i
|
||||
aria-hidden="true"
|
||||
class="fa fa-clipboard">
|
||||
</i>
|
||||
</button>
|
||||
</template>
|
Loading…
Reference in a new issue