<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> <script src="https://unpkg.com/vue"></script> </head> <body> <h1><%= title %></h1> <div id="files"></div> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <!-- Vue app element --> <div id="app" > {{this.changed}} <h1><a v-bind:href="'?path=' + files.up">.. </a></h1> <template v-for="(item, id) in context"> <h2 v-bind:id="id"> <form v-on:submit.prevent="removeItem(id)"> {{ id }} <button type="submit">Delete</button> </form> </h2> <img width="60%" v-bind:src='item.img'> <table width="100%" > <tr v-for="(values, name) in item"> <td>{{ name }} </td> <td> <div v-for="(val, i_index) in values"> <template v-if="schema.properties[name] && schema.properties[name].input === 'text'"> <input v-model="val.value" type="text" size="45" v-on:keyup="trigger_change_on_enter"/> </template> <template v-else-if="val.id && context[val.id]"> <a v-bind:href="'#' + val.id">{{ context[val.id].name[0].value }}</b> </template> <b v-else> {{ val.value }} </b> <template v-if="schema.properties[name] && schema.properties[name].input === 'link' " > <form v-on:submit.prevent="linkProp(val)" style='display:inline;'> <select v-model="link_to_id" > <template v-for="(link_item, link_id) in context"> <template v-for="other_name in link_item.name"> <option v-if="link_id != val.id && schema.properties[name] && link_item.type && schema.properties[name].type.includes(link_item.type[0].value)" v-bind:value="link_id">{{ other_name.value }}</select> </template> </template> </select> </select> <button type="submit">Link</button> </form> </template> </div> </td> </tr> </table> <form v-on:submit.prevent="addContextProp(item)"> <select v-model="prop_name" > <option v-for="(prop, prop_name) in schema.properties">{{prop_name}}</option> </select> <button type="submit">Add prop</button> </form> <br><br> </template> <form v-on:submit.prevent="addContext(context)"> <select v-model="type" > <option v-for="(type, type_name) in schema.types" v-bind:value="type_name"> {{ type_name }} </option> </select> <button type="submit">Add contextual item</button> </form> <div id="filelist" border="1"> <div v-for="(file, path) in files.files"> <template v-if="!(context[file.id])"> <h1>{{ file.filename }}</h1> <img width="50%" v-bind:src='file.img'> <form v-on:submit.prevent="addFile(file)"> <button type="submit">Add file to package</button> </form> </template> </div> </div> <div id="filelist" border="1"> <ul v-for="dir in files.dirs"> <li><a v-bind:href="'?path=' + dir.absolute">{{ dir.name }}</a></li> </ul> </div> </div> </div> <!-- end Vue app element --> <script> var save = function save() { console.log(data); } var vue; var files = {}; var context = {}; var schema = {}; document.addEventListener("DOMContentLoaded", function(event) { const urlParams = new URLSearchParams(window.location.search); const path = urlParams.get('path'); axios.get('/files?path=' + path) .then(function (response) { files = response.data; axios.get("/context_entities").then(function(response){ context = response.data; axios.get("/schema").then(function(response){ schema = response.data; // handle success vue = new Vue({ el: "#app", data: { files: files, context: context, schema: schema, prop: {"name":"nom", "value": "val"}, type: "Person", prop_name: "", link_to_id: "", link_id: "", changed: 0, latest_id: 0 }, methods: { "save": function save() { axios.post('/files?path=' + path, this.$data.files.files).then( ) }, "save_context": function save_context() { axios.post('/context_entities?path=.', this.context).then( function () { } ) }, "addContextProp": function addContextProp(item){ var prop_name = this.prop_name; if (item[prop_name]) { item[prop_name].push({"value": "", "id": ""}); } else { item[prop_name] = [{"value": "", "id": ""}]; } this.changed += 1; }, trigger_change_on_enter: function(e) { if (e.keyCode === 13) { this.changed += 1; this.save_context(); } }, "linkProp": function linkProp(val) { val.value = context[this.link_to_id].name[0].value val.id = this.link_to_id this.changed += 1; this.save_context(); }, "addFile": function addFile(file) { if (!context[file.id]) { var new_item = JSON.parse(JSON.stringify(schema.types.File.template)); new_item.name[0].value = file.id; new_item.img = file.img; alert(file.img); context[file.id] = new_item; this.changed += 1; this.save_context(); } else { alert("Already got that file"); //Should never fire but you never know } }, "removeItem": function remove_item(id) { delete context[id]; this.changed += 1; this.save_context(); }, "addContext": function addContext(context){ while (context[this.latest_id.toString()]) { this.latest_id += 1; } var id = this.latest_id.toString(); context[id] = schema.types[this.type].template; console.log('NEW ONE', schema.types[this.type].template ) context[id].name=[{"value": this.id}] this.changed += 1; this.save_context(); } } }); //document.getElementById("files").innerHTML = response['data'].model; }) .catch(function (error) { // handle error console.log(error); }) .then(function () { console.log("done") // always executed }); })})}); </script> </body> </html>