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