diff options
Diffstat (limited to 'dashboard/src/components/model')
-rw-r--r-- | dashboard/src/components/model/AddCategory.vue | 126 | ||||
-rw-r--r-- | dashboard/src/components/model/AddMetarule.vue | 111 | ||||
-rw-r--r-- | dashboard/src/components/model/Category.vue | 64 | ||||
-rw-r--r-- | dashboard/src/components/model/CreateModel.vue | 57 | ||||
-rw-r--r-- | dashboard/src/components/model/Metarule.vue | 155 | ||||
-rw-r--r-- | dashboard/src/components/model/Model.vue | 112 | ||||
-rw-r--r-- | dashboard/src/components/model/OrphanCategory.vue | 65 | ||||
-rw-r--r-- | dashboard/src/components/model/Orphans.vue | 79 |
8 files changed, 769 insertions, 0 deletions
diff --git a/dashboard/src/components/model/AddCategory.vue b/dashboard/src/components/model/AddCategory.vue new file mode 100644 index 00000000..c22ab333 --- /dev/null +++ b/dashboard/src/components/model/AddCategory.vue @@ -0,0 +1,126 @@ +<template> + <div> + <template v-if="categories.length > 0"> + <h4>Select category:</h4> + <form data-vv-scope="select"> + <div class="form-group"> + <select v-model="selectedCategoryId" v-validate.initial="'required'"> + <option disabled value>Please select one</option> + <option + v-for="category in categories" + :value="category.id" + :key="category.id" + >{{category.name}}</option> + </select> + </div> + <button type="button" class="btn btn-secondary" @click="close()">Cancel</button> + <span> </span> + <button + type="button" + :disabled="errors.any('select')" + class="btn btn-primary" + @click="addCategory()" + >Add</button> + </form> + <br> + <br> + <h4>Or create a new one:</h4> + </template> + <h4 v-else>Create a category:</h4> + <form data-vv-scope="create"> + <div class="form-group"> + <label for="categoryName">Name</label> + <input + type="text" + name="name" + v-model="categoryCreate.name" + v-validate.initial="'alpha_dash|required|min:3'" + class="form-control" + id="categoryName" + > + </div> + <div class="form-group"> + <label for="modelDescription">Description</label> + <textarea + name="description" + v-model="categoryCreate.description" + v-validate="'required|min:3'" + class="form-control" + ></textarea> + </div> + <ul> + <li v-for="error in errors.all('create')" :key="error.id">{{ error }}</li> + </ul> + <button type="button" class="btn btn-secondary" @click="close()">Cancel</button> + <span> </span> + <button + type="button" + :disabled="errors.any('create')" + class="btn btn-primary" + @click="createCategory()" + >Create</button> + </form> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; +import util from "./../../services/Util.service.js"; + +var categoryMap = { + subject: { + listName: "subject_categories", + serviceListName: "subjectCategories" + }, + object: { + listName: "object_categories", + serviceListName: "objectCategories" + }, + action: { + listName: "action_categories", + serviceListName: "actionCategories" + } +}; + +export default { + name: "addCategory", + data: function() { + return { + selectedCategoryId: null, + categoryCreate: { + name: "", + description: "" + } + }; + }, + props: { + metarule: Object, + type: String + }, + methods: { + createCategory() { + ModelService.createCategory(this.type, this.categoryCreate).then(category => { + this.selectedCategoryId = category.id; + this.addCategory(); + }); + }, + addCategory() { + var category = ModelService.getCategory(this.type, this.selectedCategoryId); + var metaRuleCopy = util.clone(this.metarule); + metaRuleCopy[categoryMap[this.type].listName].push(category); + ModelService.updateMetaRule(metaRuleCopy); + this.close(); + }, + close() { + this.$emit("close"); + } + }, + computed: { + categories() { + return ModelService[categoryMap[this.type].serviceListName].filter( + el => !this.metarule[categoryMap[this.type].listName].includes(el) + ); + } + } +}; +</script> diff --git a/dashboard/src/components/model/AddMetarule.vue b/dashboard/src/components/model/AddMetarule.vue new file mode 100644 index 00000000..ef6e8503 --- /dev/null +++ b/dashboard/src/components/model/AddMetarule.vue @@ -0,0 +1,111 @@ +<template> + <div> + <hr> + <template v-if="metarules.length > 0"> + <h4>Select metarule:</h4> + <form data-vv-scope="select"> + <div class="form-group"> + <select v-model="selectedMetaruleId" v-validate.initial="'required'"> + <option disabled value>Please select one</option> + <option + v-for="metarule in metarules" + :value="metarule.id" + :key="metarule.id" + >{{metarule.name}}</option> + </select> + </div> + <button type="button" class="btn btn-secondary" @click="close()">Cancel</button> + <span> </span> + <button + type="button" + :disabled="errors.any('select')" + class="btn btn-primary" + @click="addMetarule()" + >Add</button> + </form> + <br> + <br> + <h4>Or create a new one:</h4> + </template> + <h4 v-else>Create a metarule:</h4> + <form data-vv-scope="create"> + <div class="form-group"> + <label for="metaruleName">Name</label> + <input + type="text" + name="name" + v-model="metaruleCreate.name" + v-validate.initial="'alpha_dash|required|min:3'" + class="form-control" + id="metaruleName" + > + </div> + <div class="form-group"> + <label for="modelDescription">Description</label> + <textarea + name="description" + v-model="metaruleCreate.description" + v-validate="'required|min:3'" + class="form-control" + ></textarea> + </div> + <ul> + <li v-for="error in errors.all('create')" :key="error.id">{{ error }}</li> + </ul> + <button type="button" class="btn btn-secondary" @click="close()">Cancel</button> + <span> </span> + <button + type="button" + :disabled="errors.any('create')" + class="btn btn-primary" + @click="createMetarule()" + >Create and add</button> + </form> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; +import util from "./../../services/Util.service.js"; + +export default { + name: "addMetarule", + data: function() { + return { + selectedMetaruleId: null, + metaruleCreate: { + name: "", + description: "" + } + }; + }, + props: { + model: Object + }, + methods: { + createMetarule() { + ModelService.createMetaRule(this.metaruleCreate).then(metarule => { + this.selectedMetaruleId = metarule.id; + this.addMetarule(); + }); + }, + addMetarule() { + var metaRule = ModelService.getMetaRule(this.selectedMetaruleId); + var modelCopy = util.clone(this.model); + modelCopy.meta_rules.push(metaRule); + ModelService.updateModel(modelCopy); + this.close(); + }, + close() { + this.$emit("close"); + } + }, + computed: { + metarules() { + return ModelService.metaRules.filter( + el => !this.model.meta_rules.includes(el) + ); + } + } +}; +</script> diff --git a/dashboard/src/components/model/Category.vue b/dashboard/src/components/model/Category.vue new file mode 100644 index 00000000..81efb1ed --- /dev/null +++ b/dashboard/src/components/model/Category.vue @@ -0,0 +1,64 @@ +<template> + <div> + <span :title="category.description">{{ category.name }}</span> + <button type="button" class="fa fa-trash pull-right btn btn-dark btn-sm" @click="removeCategory()" title="Remove"></button> + <div v-for="attribute in attributes" :key="attribute.id"> + <b>attributes: </b> {{attribute.id}} + </div> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; +import util from "./../../services/Util.service.js"; + +var categoryMap = { + subject: { + addTitle: "Add Subject Category", + removeTitleFromMetaRule: + "Are you sure to remove from meta rule this Subject Category?", + removeTitle: "Are you sure to remove this Subject Category?", + listName: "subject_categories", + serviceListName: "subjectCategories" + }, + object: { + addTitle: "Add Object Category", + removeTitleFromMetaRule: + "Are you sure to remove from meta rule this Object Category?", + removeTitle: "Are you sure to remove this Object Category?", + listName: "object_categories", + serviceListName: "objectCategories" + }, + action: { + addTitle: "Add Action Category", + removeTitleFromMetaRule: + "Are you sure to remove from meta rule this Action Category?", + removeTitle: "Are you sure to remove this Action Category?", + listName: "action_categories", + serviceListName: "actionCategories" + } +}; + +export default { + name: "category", + props: { + metarule: Object, + category: Object, + attributes: Array, + type: String + }, + methods: { + removeCategory() { + var typeValue = categoryMap[this.type]; + if (confirm(typeValue.removeTitleFromMetaRule)) { + var metaruleCopy = util.clone(this.metarule); + metaruleCopy[typeValue.listName].splice( + metaruleCopy[typeValue.listName].indexOf(this.category), + 1 + ); + ModelService.updateMetaRule(metaruleCopy); + } + } + } +}; +</script> diff --git a/dashboard/src/components/model/CreateModel.vue b/dashboard/src/components/model/CreateModel.vue new file mode 100644 index 00000000..d5403e7b --- /dev/null +++ b/dashboard/src/components/model/CreateModel.vue @@ -0,0 +1,57 @@ +<template> + <div class="list-group-item row"> + <form> + <div class="form-group"> + <label for="modelName">Name</label> + <input + type="text" + name="name" + v-model="modelCreate.name" + v-validate.initial="'alpha_dash|required|min:3'" + class="form-control" + id="modelName" + > + </div> + <div class="form-group"> + <label for="modelDescription">Description</label> + <textarea + name="description" + v-model="modelCreate.description" + v-validate.initial="'required|min:3'" + class="form-control" + ></textarea> + </div> + <ul> + <li v-for="error in errors.all()" :key="error.id">{{ error }}</li> + </ul> + <button type="button" class="btn btn-secondary" @click="close()">Cancel</button> + <span> </span> + <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="createModel()">Create</button> + </form> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; + +export default { + name: "createModel", + data: function() { + return { + modelCreate: { + name: "", + description: "" + } + }; + }, + methods: { + createModel() { + ModelService.createModel(this.modelCreate); + this.close(); + }, + close() { + this.$emit("close") + } + } +}; +</script> diff --git a/dashboard/src/components/model/Metarule.vue b/dashboard/src/components/model/Metarule.vue new file mode 100644 index 00000000..1cb266bd --- /dev/null +++ b/dashboard/src/components/model/Metarule.vue @@ -0,0 +1,155 @@ +<template> + <div class=""> + <template v-if="edit"> + <form> + <div class="form-group"> + <label for="metaruleName">Name</label> + <input + type="text" + name="name" + v-model="metaruleEdit.name" + v-validate="'alpha_dash|required|min:3'" + class="form-control" + id="metaruleName" + > + </div> + <div class="form-group"> + <label for="modelDescription">Description</label> + <textarea + name="description" + v-model="metaruleEdit.description" + v-validate="'required|min:3'" + class="form-control" + ></textarea> + </div> + <ul> + <li v-for="error in errors.all()" :key="error.id">{{ error }}</li> + </ul> + <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button> + <span> </span> + <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="updateMetarule()">Update</button> + </form> + </template> + <template v-else> + <h3 class="list-group-item-heading inline">{{ metarule.name }}</h3> + <div class="pull-right"> + <button + type="button" + class="fa fa-trash btn btn-dark btn-sm" + @click="removeMetarule()" + title="Remove Meta Rule" + ></button> + <button + type="button" + class="fa fa-edit btn btn-dark btn-sm" + @click="updatingMetarule()" + title="Edit Meta Rule" + ></button> + </div> + <p class="list-group-item-text">{{ metarule.description }}</p> + <p class="list-group-item-text"></p> + <table class="table categories"> + <thead> + <tr> + <th> + <span>Subjects</span> + <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.subject" data-toggle="tooltip" :title="metaruleHelpStrings.subject"></i> + <button + type="button" + class="fa fa-plus pull-right btn btn-dark btn-sm" + @click="addSubjectCategory = true" + title="Add Subject" + ></button> + </th> + <th> + <span>Objects</span> + <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.object" data-toggle="tooltip" :title="metaruleHelpStrings.object"></i> + <button + type="button" + class="fa fa-plus pull-right btn btn-dark btn-sm" + @click="addObjectCategory = true" + title="Add Object" + ></button> + </th> + <th> + <span>Actions</span> + <i class="fa fa-question-circle" style="margin-left: 2%" v-if="metaruleHelpStrings.action" data-toggle="tooltip" :title="metaruleHelpStrings.action"></i> + <button + type="button" + class="fa fa-plus pull-right btn btn-dark btn-sm" + @click="addActionCategory = true" + title="Add Action" + ></button> + </th> + </tr> + </thead> + <tbody> + <tr> + <td> + <AddCategory v-if="addSubjectCategory" :metarule="metarule" type="subject" @close="addSubjectCategory = false"></AddCategory> + <Category v-else v-for="category in metarule.subject_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.subjectAttributes" type="subject"></Category> + </td> + <td> + <AddCategory v-if="addObjectCategory" :metarule="metarule" type="object" @close="addObjectCategory = false"></AddCategory> + <Category v-else v-for="category in metarule.object_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.objectAttributes" type="object"></Category> + </td> + <td> + <AddCategory v-if="addActionCategory" :metarule="metarule" type="action" @close="addActionCategory = false"></AddCategory> + <Category v-else v-for="category in metarule.action_categories" :key="category.id" :category="category" :metarule="metarule" :attributes="metarule.actionAttributes" type="action"></Category> + </td> + </tr> + </tbody> + </table> + </template> + </div> +</template> + +<script> +import Category from './Category.vue' +import AddCategory from './AddCategory.vue' +import ModelService from "./../../services/Model.service.js"; +import util from "./../../services/Util.service.js"; +import helpstrings from "../../helpstrings"; + +export default { + name: "metarule", + data: function() { + return { + edit: false, + metaruleEdit: {}, + addSubjectCategory: false, + addObjectCategory: false, + addActionCategory: false, + metaruleHelpStrings: {} + }; + }, + components: { + Category, + AddCategory + }, + props: { + metarule: Object, + model: Object, + }, + mounted() { + this.metaruleHelpStrings = helpstrings.metarule; + }, + methods: { + updatingMetarule() { + this.metaruleEdit = util.clone(this.metarule); + this.edit = true; + }, + updateMetarule() { + this.edit = false; + ModelService.updateMetaRule(this.metaruleEdit); + }, + removeMetarule() { + if (confirm('Are you sure to remove this Meta Rule from model?')) { + var modelCopy = util.clone(this.model); + modelCopy.meta_rules.splice(modelCopy.meta_rules.indexOf(this.metarule), 1); + ModelService.updateModel(modelCopy); + } + } + } +}; +</script> diff --git a/dashboard/src/components/model/Model.vue b/dashboard/src/components/model/Model.vue new file mode 100644 index 00000000..82ad992d --- /dev/null +++ b/dashboard/src/components/model/Model.vue @@ -0,0 +1,112 @@ +<template> + <div> + <template v-if="edit"> + <form> + <div class="form-group"> + <label for="modelName">Name</label> + <input + type="text" + name="name" + v-model="modelEdit.name" + v-validate="'alpha_dash|required|min:3'" + class="form-control" + id="modelName" + > + </div> + <div class="form-group"> + <label for="modelDescription">Description</label> + <textarea + name="description" + v-model="modelEdit.description" + v-validate="'required|min:3'" + class="form-control" + ></textarea> + </div> + <ul> + <li v-for="error in errors.all()" :key="error.id">{{ error }}</li> + </ul> + <button type="button" class="btn btn-secondary" @click="edit = false">Cancel</button> + <span> </span> + <button type="button" :disabled="errors.any()" class="btn btn-primary" @click="updateModel()">Update</button> + </form> + </template> + <template v-else> + <h3 class="list-group-item-heading inline">{{ model.name }}</h3> + <div class="pull-right"> + <button type="button" class="fa fa-trash btn btn-dark btn-sm" @click="removeModel()" title="Remove Model"></button> + <button type="button" class="fa fa-edit btn btn-dark btn-sm" @click="updatingModel()" title="Edit Model"></button> + </div> + <p class="list-group-item-text">{{ model.description }}</p> + + <AddMetarule v-if="addMetarule" :model="model" @close="addMetarule = false"></AddMetarule> + <details class="list-group-item-text" v-else> + <summary> + <h4 class="inline-block width-200"> + {{ model.meta_rules.length + ' meta rule' + (model.meta_rules.length > 1 ? 's' : ' ') }} + <i class="fa fa-question-circle" v-if="modelHelpStrings.metarule" data-toggle="tooltip" :title="modelHelpStrings.metarule"></i> + </h4> + <button + type="button" + class="fa fa-plus btn btn-dark btn-sm" + @click="addMetarule = true" + title="Add Meta Rule" + ></button> + </summary> + <div class="list-group"> + <Metarule + v-for="metarule in model.meta_rules" + :key="metarule.id" + :metarule="metarule" + :model="model" + ></Metarule> + </div> + </details> + </template> + <hr> + </div> +</template> + +<script> +import Metarule from "./Metarule.vue"; +import ModelService from "./../../services/Model.service.js"; +import AddMetarule from "./AddMetarule.vue"; +import util from "./../../services/Util.service.js"; +import helpstrings from "../../helpstrings"; + +export default { + name: "model", + data: function() { + return { + edit: false, + addMetarule: false, + modelEdit: {}, + modelHelpStrings: {} + }; + }, + components: { + Metarule, + AddMetarule + }, + props: { + model: Object + }, + mounted() { + this.modelHelpStrings = helpstrings.model; + }, + methods: { + updatingModel() { + this.modelEdit = util.clone(this.model); + this.edit = true; + }, + updateModel() { + this.edit = false; + ModelService.updateModel(this.modelEdit); + }, + removeModel() { + if (confirm('Are you sure to delete this Model?')) { + ModelService.removeModel(this.model); + } + } + } +}; +</script> diff --git a/dashboard/src/components/model/OrphanCategory.vue b/dashboard/src/components/model/OrphanCategory.vue new file mode 100644 index 00000000..316b8095 --- /dev/null +++ b/dashboard/src/components/model/OrphanCategory.vue @@ -0,0 +1,65 @@ +<template> + <div class="list-group col-lg-3"> + <h3 class="list-group-item active">{{title}}</h3> + <div v-for="category in categories" class="list-group-item" :key="category.id"> + <h4 class="list-group-item-heading inline">{{ category.name }}</h4> + <button + type="button" + class="fa fa-trash pull-right btn btn-dark btn-sm" + @click="removeCategory(category)" + :title="buttonTitle" + ></button> + <p class="list-group-item-text">{{ category.description }}</p> + </div> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; + +var categoryMap = { + subject: { + title: "Orphan Subject categories", + removeButtonTitle: "Remove Subject category", + removeTitle: "Are you sure to remove this Subject Category?", + listName: "subject_categories", + serviceListName: "subjectCategories" + }, + object: { + title: "Orphan Object categories", + removeButtonTitle: "Remove Object category", + removeTitle: "Are you sure to remove this Object Category?", + listName: "object_categories", + serviceListName: "objectCategories" + }, + action: { + title: "Orphan Action categories", + removeButtonTitle: "Remove Action category", + removeTitle: "Are you sure to remove this Action Category?", + listName: "action_categories", + serviceListName: "actionCategories" + } +}; + +export default { + props: { + categories: Array, + type: String + }, + computed: { + title() { + return categoryMap[this.type].title; + }, + buttonTitle() { + return categoryMap[this.type].removeButtonTitle; + } + }, + methods: { + removeCategory(category) { + if (confirm(categoryMap[this.type].removeTitle)) { + ModelService.removeCategory(this.type, category); + } + } + } +}; +</script> diff --git a/dashboard/src/components/model/Orphans.vue b/dashboard/src/components/model/Orphans.vue new file mode 100644 index 00000000..b3c1c524 --- /dev/null +++ b/dashboard/src/components/model/Orphans.vue @@ -0,0 +1,79 @@ +<template> + <div> + <div class="alert alert-dismissable alert-warning"> + <button type="button" class="close" data-dismiss="alert" @click="showOrphan = false; $emit('close')">×</button> + <h4>Warning!</h4> + <p> + Some metarules or categories are orphan, please check them and delete them if necessary. + <a + href + @click.prevent="showOrphan = true" + v-show="!showOrphan" + >Show orphans</a> + <a href @click.prevent="showOrphan = false" v-show="showOrphan">Hide orphans</a> + </p> + </div> + + <div class="row" v-show="showOrphan"> + <div class="list-group col-lg-3" v-if="orphanMetaRules.length"> + <h3 class="list-group-item active">Orphan Meta rules</h3> + <div v-for="metaRule in orphanMetaRules" class="list-group-item" :key="metaRule.id"> + <h4 class="list-group-item-heading inline">{{ metaRule.name }}</h4> + <button + type="button" + class="fa fa-trash pull-right btn btn-dark btn-sm" + @click="removeMetarule(metaRule)" + title="Remove Meta rule" + ></button> + <p class="list-group-item-text">{{ metaRule.description }}</p> + </div> + </div> + + <OrphanCategory + v-if="orphanSubjectCategories.length" + type="subject" + :categories="orphanSubjectCategories" + ></OrphanCategory> + <OrphanCategory + v-if="orphanObjectCategories.length" + type="object" + :categories="orphanObjectCategories" + ></OrphanCategory> + <OrphanCategory + v-if="orphanActionCategories.length" + type="action" + :categories="orphanActionCategories" + ></OrphanCategory> + </div> + </div> +</template> + +<script> +import ModelService from "./../../services/Model.service.js"; +import OrphanCategory from "./OrphanCategory.vue"; + +export default { + props: { + orphanMetaRules: Array, + orphanSubjectCategories: Array, + orphanObjectCategories: Array, + orphanActionCategories: Array + }, + components: { + OrphanCategory, + }, + data() { + return { + showOrphan: false, + allowAlert: true + }; + }, + methods: { + removeMetarule(metarule) { + if (confirm("Are you sure to remove this Meta Rule?")) { + ModelService.removeMetaRule(metarule); + } + } + } +}; +</script>
\ No newline at end of file |