diff --git a/app/bdd_for_labels.db b/app/bdd_for_labels.db index aa5dc2f70e42b5d8491ff8c53eba0c46138ea005..ee763122af2e27be6948407a451f1efaee6c4ecd 100644 Binary files a/app/bdd_for_labels.db and b/app/bdd_for_labels.db differ diff --git a/app/createBdd.sql b/app/createBdd.sql index 8ec407d522a6d0252056e75880f09c31bc1b9096..6d6a150b1f1394223efcbc6d391201bfd6a4d6e1 100644 --- a/app/createBdd.sql +++ b/app/createBdd.sql @@ -1,14 +1,22 @@ /*CREATE DATABASE labels_tower CHARACTER SET 'utf8'; USE labels_tower;*/ -CREATE TABLE IF NOT EXISTS tutos ( - title VARCHAR(300), - link VARCHAR(500) NOT NULL, - date DEFAULT CURRENT_TIMESTAMP, - prescriber VARCHAR(100), - CONSTRAINT pk_tutos PRIMARY KEY (link) +CREATE TABLE IF NOT EXISTS elements ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + title VARCHAR(400), + authors VARCHAR(500), + institution VARCHAR(300), + format VARCHAR(100), -- ex: journal, livre, lien + booktitle VARCHAR(200), + journal VARCHAR (150), + volume UNSIGNED SMALLINT, + number UNSIGNED SMALLINT, + pages UNSIGNED SMALLINT, + relese_date DATE, + link VARCHAR(500) ); + CREATE TABLE IF NOT EXISTS labels ( id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL, @@ -22,10 +30,10 @@ CREATE TABLE IF NOT EXISTS labels_languages ( CONSTRAINT pk_labels_languages PRIMARY KEY(id_label, country_code) ); -CREATE TABLE IF NOT EXISTS tutos_labels ( - link VARCHAR(200) NOT NULL, - id_label UNSIGNED MEDIUM INT, - CONSTRAINT pk_tutos_labels PRIMARY KEY(link, id_label) +CREATE TABLE IF NOT EXISTS elements_labels ( + id_element UNSIGNED MEDIUM INT NOT NULL, + id_label UNSIGNED MEDIUM INT NOT NULL, + CONSTRAINT pk_tutos_labels PRIMARY KEY(id_element, id_label) -- aucun des 2 ne sont uniques et moi j'utilise les 2 pour mes requêtes ); diff --git a/app/labelsTower.py b/app/labelsTower.py index ad5f1aa0c5864dff8b114976b0c4905c12dca028..9dd7b86fa58396f1b409c6ed7821990ef30fbb9a 100644 --- a/app/labelsTower.py +++ b/app/labelsTower.py @@ -18,6 +18,12 @@ class CustomFlask(Flask): app = CustomFlask(__name__) app.config['DEBUG'] = True +text_component = {"project_name": "LabelsTower", + "labels_title_fr": "Étiquettes", + "labels_title_ang": "Labels", + "result_title_fr": "Tutoriels", + "result_title_ang": "Tutorials"} + @app.route('/') def home(): return search_tuto() @@ -33,32 +39,34 @@ def get_datas(name, id): return (jsonify(send_sql_request("SELECT id_label, labels_languages.name, father_id FROM labels_languages INNER JOIN labels ON labels.id = labels_languages.id_label WHERE labels_languages.country_code IN ('"+id+"', 'U')"))) elif (name == 'main_labels'): return (jsonify(send_sql_request("SELECT * FROM (SELECT id_label, labels_languages.name, father_id FROM labels_languages INNER JOIN labels ON labels.id = labels_languages.id_label WHERE labels_languages.country_code IN ('"+id+"', 'U')) WHERE father_id IS NULL"))) + elif (name == 'labels_lang_id'): + return (jsonify(send_sql_request('SELECT id FROM labels WHERE name IN ("Français", "Anglais")'))) elif (name == 'alias'): return (jsonify(send_sql_request('SELECT * from alias'))) elif (name == 'link'): - return (jsonify(send_sql_request('SELECT link FROM tutos_labels WHERE id_label = '+id))) + return (jsonify(send_sql_request('SELECT id_element FROM elements_labels WHERE id_label = '+id))) elif (name == 'labels_links'): - return (jsonify(send_sql_request('SELECT link FROM tutos_labels WHERE id_label IN ('+id+')'))) + return (jsonify(send_sql_request('SELECT id_element FROM elements_labels WHERE id_label IN ('+id+')'))) elif (name == 'labels_links_unselect'): - return (jsonify(send_sql_request('SELECT link FROM tutos_labels WHERE id_label NOT IN ('+id+')'))) + return (jsonify(send_sql_request('SELECT id_element FROM elements_labels WHERE id_label NOT IN ('+id+')'))) elif (name == 'title_tuto'): #anciennement tuto - return (jsonify(send_sql_request("SELECT title FROM tutos WHERE link = '"+id+"'"))) + return (jsonify(send_sql_request("SELECT title FROM elements WHERE link = '"+id+"'"))) elif (name == 'nb_labels'): return (jsonify(send_sql_request('SELECT COUNT (*) FROM labels'))) elif (name == 'all_tutos'): - return (jsonify(send_sql_request('SELECT * FROM tutos ORDER BY title'))) + return (jsonify(send_sql_request('SELECT * FROM elements ORDER BY title'))) elif (name == 'tutos'): - return (jsonify(send_sql_request('SELECT * FROM tutos WHERE link IN ('+request.form['data']+') ORDER BY title'))) + return (jsonify(send_sql_request('SELECT * FROM elements WHERE id IN ('+id+') ORDER BY title'))) elif (name == 'id_labels_tutos'): - return (jsonify(send_sql_request('SELECT DISTINCT id_label FROM tutos_labels WHERE link IN ('+request.form['data']+')'))) + return (jsonify(send_sql_request('SELECT DISTINCT id_label FROM elements_labels WHERE id_element IN ('+request.form['data']+')'))) elif (name == 'labels_of_a_link'): - return (jsonify(send_sql_request("SELECT id_label FROM tutos_labels WHERE link = '"+id+"'"))) + return (jsonify(send_sql_request("SELECT id_label FROM elements_labels WHERE id_element = '"+id+"'"))) elif (name == 'all_tutos_labels'): - return (jsonify(send_sql_request("SELECT * FROM tutos_labels"))) + return (jsonify(send_sql_request("SELECT * FROM elements_labels"))) elif (name == 'labels_of_a_link_in'): - return (jsonify(send_sql_request('SELECT id_label FROM tutos_labels WHERE link IN ('+id+')'))) + return (jsonify(send_sql_request('SELECT id_label FROM elements_labels WHERE id_element IN ('+id+')'))) elif (name == 'tutos_language'): - return (jsonify(send_sql_request('SELECT link from tutos_labels WHERE id_label = (SELECT id FROM labels WHERE name = "'+id+'")'))) + return (jsonify(send_sql_request('SELECT id_element from elements_labels WHERE id_label = (SELECT id FROM labels WHERE name = "'+id+'")'))) elif (name == 'tuto_family'): ''' Select all links that have the same group of labels. ''' @@ -68,9 +76,9 @@ def get_datas(name, id): nb_labels = len(labels_tab) for id_lab in labels_tab: if (n == nb_labels - 1): - sql_request += 'SELECT link FROM tutos_labels WHERE id_label IN ('+id_lab+')' + sql_request += 'SELECT id_element FROM elements_labels WHERE id_label IN ('+id_lab+')' else: - sql_request += 'SELECT link FROM tutos_labels WHERE id_label IN ('+id_lab+') INTERSECT ' + sql_request += 'SELECT id_element FROM elements_labels WHERE id_label IN ('+id_lab+') INTERSECT ' n += 1 return (jsonify(send_sql_request(sql_request))) return 'Error' @@ -89,7 +97,7 @@ def manage_labels(): @app.route('/browse') def search_tuto(): - return render_template('browse.html') + return render_template('browse.html', txt=text_component) @app.route('/add_new_tuto', methods=['GET', 'POST']) def add_new_tuto(): diff --git a/app/my_datas b/app/my_datas new file mode 100644 index 0000000000000000000000000000000000000000..3222ff6b08435077bf2c3efea7313c696849b450 --- /dev/null +++ b/app/my_datas @@ -0,0 +1,3 @@ +jour:merchredi +mois:octobre +anne:2018 diff --git a/app/static/cookies.js b/app/static/cookies.js deleted file mode 100644 index bffd077997b60a58178a0663602e860f2e00c2c2..0000000000000000000000000000000000000000 --- a/app/static/cookies.js +++ /dev/null @@ -1,70 +0,0 @@ -function setCookie(name, value) { - /** - * Create a cookie for ten years? - */ - var today = new Date(); - var expires = new Date(); - - expires.setTime(today.getTime() + (10*365*24*60*60*1000)); - document.cookie = name + "=" + value + ";expires=" + expires.toGMTString(); -} -//encodeURIComponent(value) - -function getCookie(name) { - /** - * Retrieve the value of a cookie due to it's name. - */ - var regex = new RegExp("(?:; )?" + name + "=([^;]*);?"); - - if (regex.test(document.cookie)) - return (RegExp["$1"]); - else - return null; -} -//return decodeURIComponent(RegExp["$1"]); - -function tab_to_str(tab) { - /** - * Transform 2D tab to string separate by semicolon. - * Ex : [[42, 'test', 5], [56, 'salut', 3]] => - * "42, test, 5|56, salut, 3" - */ - var result = ""; - var inter = []; - for (var i = 0; tab[i]; i++) - inter.push(tab[i]); - result = inter.join('|'); - console.log(result) - return (result); -} - -function str_to_tab(str) { - /** - * Transform string to 2D tab. - * Ex : "42, test, 5|56, salut, 3" => - * [[42, 'test', 5], [56, 'salut', 3]] - */ - var result = []; - var split = str.split('|'); - for (var i = 0; split[i]; i++) - result.push(split[i].split(',')); - return (result); -} - -function save_session() { - /** - * Save old_labels_tab and unselect_tab in Cookies. - */ - setCookie("old_labels_tab", tab_to_str(hierarchy.old_labels_tab)); - setCookie("unselect_labels_tab", tab_to_str(hierarchy.unselect_tab)); - setCookie("language", hierarchy.labels_language); -} - -function setup_session() { - hierarchy.old_labels_tab = str_to_tab(getCookie('old_labels_tab')); - hierarchy.unselect_tab = str_to_tab(getCookie('unselect_labels_tab')); - hierarchy.labels_language = result.labels_language = getCookie('language'); - hierarchy.init_all_labels(); - result.maj_tutos(3); - hierarchy.maj_new_labels_tab(); -} \ No newline at end of file diff --git a/app/static/add_tuto.css b/app/static/css/annimation.css similarity index 100% rename from app/static/add_tuto.css rename to app/static/css/annimation.css diff --git a/app/static/css/hierarchy.css b/app/static/css/hierarchy.css new file mode 100644 index 0000000000000000000000000000000000000000..94cb876fe4b48cc8f68ec8572ec2f0bb3e773bc1 --- /dev/null +++ b/app/static/css/hierarchy.css @@ -0,0 +1,32 @@ +.hierarchy { + padding-top: 5px; + font-size: 18px; + text-align: center; + line-height: 190%; +} + +/* Hierarchy title */ + +#hierarchy-title_ang { + margin-left: 9%; + margin-right: 4%; +} + +#hierarchy-title_fr { + margin-left: -6%; + margin-right: 4%; +} + + +/* Hierarchy language icons */ + +.hierarchy-lang_icon_left { + height:25px; + width:25px; + margin-right: 3%; +} + +.hierarchy-lang_icon_right { + height:25px; + width:25px; +} \ No newline at end of file diff --git a/app/static/test.css b/app/static/css/main.css similarity index 56% rename from app/static/test.css rename to app/static/css/main.css index 06cd0ec5145ed4a7f376b4358386293ba2edd247..878ba184b391990bb3abf08bd294ae0e741e273f 100644 --- a/app/static/test.css +++ b/app/static/css/main.css @@ -1,23 +1,9 @@ -.title { - font-size: 20px; - text-align: center; -} - -.hierarchy { - padding-top: 5px; - font-size: 18px; +#project_title { text-align: center; - line-height: 190%; } -.list-group { - overflow:scroll; - max-height: 470px; -} - -.single_result { - font-size: 16px; - padding-left: 20px; +.title { + font-size: 20px; text-align: center; } @@ -42,5 +28,5 @@ } body { - background-image: url("background_loop.png"); + background-image: url("../img/background_loop.png"); } \ No newline at end of file diff --git a/app/static/css/result.css b/app/static/css/result.css new file mode 100644 index 0000000000000000000000000000000000000000..c886d7e5f8abd5f780aac551032e4768284e9d6e --- /dev/null +++ b/app/static/css/result.css @@ -0,0 +1,37 @@ +#result-title { + margin-left: 9%; + margin-right: 3%; +} + + +/* Result language icons */ + +#result-lang { + margin-left: 0%; +} + +.result-lang_icon_left { + height:25px; + width:25px; + margin-right: 2%; +} + +.result-lang_icon_right { + height:25px; + width:25px; + margin-right: 3%; +} + + +/* Result elements */ + +.list-group { + overflow:scroll; + max-height: 470px; +} + +.single_result { + font-size: 16px; + padding-left: 20px; + text-align: center; +} \ No newline at end of file diff --git a/app/static/background.png b/app/static/img/background.png similarity index 100% rename from app/static/background.png rename to app/static/img/background.png diff --git a/app/static/background_loop.png b/app/static/img/background_loop.png similarity index 100% rename from app/static/background_loop.png rename to app/static/img/background_loop.png diff --git a/app/static/background_loop2.png b/app/static/img/background_loop2.png similarity index 100% rename from app/static/background_loop2.png rename to app/static/img/background_loop2.png diff --git a/app/static/background_loop3.png b/app/static/img/background_loop3.png similarity index 100% rename from app/static/background_loop3.png rename to app/static/img/background_loop3.png diff --git a/app/static/background_origin.png b/app/static/img/background_origin.png similarity index 100% rename from app/static/background_origin.png rename to app/static/img/background_origin.png diff --git a/app/static/boue_france.png b/app/static/img/boue_france.png similarity index 100% rename from app/static/boue_france.png rename to app/static/img/boue_france.png diff --git a/app/static/boue_france_black.png b/app/static/img/boue_france_black.png similarity index 100% rename from app/static/boue_france_black.png rename to app/static/img/boue_france_black.png diff --git a/app/static/boue_usa.png b/app/static/img/boue_usa.png similarity index 100% rename from app/static/boue_usa.png rename to app/static/img/boue_usa.png diff --git a/app/static/boue_usa_black.png b/app/static/img/boue_usa_black.png similarity index 100% rename from app/static/boue_usa_black.png rename to app/static/img/boue_usa_black.png diff --git a/app/static/checked.png b/app/static/img/checked.png similarity index 100% rename from app/static/checked.png rename to app/static/img/checked.png diff --git a/app/static/close.png b/app/static/img/close.png similarity index 100% rename from app/static/close.png rename to app/static/img/close.png diff --git a/app/static/swimming.small.png b/app/static/img/swimming.small.png similarity index 100% rename from app/static/swimming.small.png rename to app/static/img/swimming.small.png diff --git a/app/static/unchecked_swimming.small.png b/app/static/img/unchecked_swimming.small.png similarity index 100% rename from app/static/unchecked_swimming.small.png rename to app/static/img/unchecked_swimming.small.png diff --git a/app/static/ajax.js b/app/static/js/ajax.js similarity index 100% rename from app/static/ajax.js rename to app/static/js/ajax.js diff --git a/app/static/array_opperations.js b/app/static/js/array_opperations.js similarity index 100% rename from app/static/array_opperations.js rename to app/static/js/array_opperations.js diff --git a/app/static/create_arbo.js b/app/static/js/create_arbo.js similarity index 100% rename from app/static/create_arbo.js rename to app/static/js/create_arbo.js diff --git a/app/static/father_child.js b/app/static/js/father_child.js similarity index 100% rename from app/static/father_child.js rename to app/static/js/father_child.js diff --git a/app/static/labels.js b/app/static/js/labels.js similarity index 75% rename from app/static/labels.js rename to app/static/js/labels.js index 7ef7345db6a86005d6de1f3e8b683ce95a7ab7e4..836a5d1f7e99302ed1983dabf3d71af38231c69e 100644 --- a/app/static/labels.js +++ b/app/static/js/labels.js @@ -35,29 +35,22 @@ function get_diff_between_labels(labels_tab) { return (final_tab); } -function remove_labels_language(labels_tab) { +function remove_labels_language(labels_tab, id_labels_lang, line) { /** - * Anglais, Français - * 56, 57 + * deletes labels that correspond to a language. + * if line == 1 => [id_label, name, father_id] is return + * else jsute the ID of the label is return. */ var new_tab = []; + var a = 0; for (var i = 0; labels_tab[i]; i++) { - if (labels_tab[i][0] != "56" && labels_tab[i][0] != "57") - new_tab.push(labels_tab[i][0]); - } - return (new_tab); -} - -function remove_labels_language_from_db(labels_tab) { - /** - * This operation is performed on labels retrieved from the database. - * Anglais, Français - * 56, 57 - */ - var new_tab = []; - for (var i = 0; labels_tab[i]; i++) { - if (labels_tab[i][0] != "56" && labels_tab[i][0] != "57") - new_tab.push(labels_tab[i]); + for (var j = 0; id_labels_lang[j]; j++) { + if (labels_tab[i][0] == id_labels_lang[j]) + a++; + } + if (a == 0) + (line == 1) ? new_tab.push(labels_tab[i]) : new_tab.push(labels_tab[i][0]); + a = 0; } return (new_tab); } diff --git a/app/static/maj_tutorial.js b/app/static/js/maj_tutorial.js similarity index 53% rename from app/static/maj_tutorial.js rename to app/static/js/maj_tutorial.js index 2d11e96a654b69e38e7602c23426867baf695e63..378e5b96444140a8c6778308f2ec054423bbe390 100644 --- a/app/static/maj_tutorial.js +++ b/app/static/js/maj_tutorial.js @@ -11,16 +11,16 @@ function del_unselect_language() { var posi = -2; var result_final = []; - if (result.tutos_language[0] % 2 == 0 && result.tutos_language[1] % 2 == 0) + if (result.results_language[0] % 2 == 0 && result.results_language[1] % 2 == 0) return; for (var i = 0; result.result_tab[i]; i++) { - if (result.tutos_language[0] % 2 == 0) - posi = is_in_tab(result.result_tab[i][1], result.tutos_fr, 0, 1); + if (result.results_language[0] % 2 == 0) + posi = is_in_tab(result.result_tab[i][0], result.results_fr, 0, 1); if (posi >= 0) result_final.push(result.result_tab[i]); posi = -2; - if (result.tutos_language[1] % 2 == 0) - posi = is_in_tab(result.result_tab[i][1], result.tutos_us, 0, 1); + if (result.results_language[1] % 2 == 0) + posi = is_in_tab(result.result_tab[i][0], result.results_us, 0, 1); if (posi >= 0) result_final.push(result.result_tab[i]); posi = -2; @@ -28,27 +28,28 @@ function del_unselect_language() { result.result_tab = result_final; } -function maj_tutos_from_db() { - /** - * Selects links related to labels in 'childs_of_old_labels' - * and labels in old tab and fill 'result_tab' with tutorials - * related to this links. - */ - var all_links = []; - var join_labels = ''; - result.result_tab = []; - if (result.childs_of_old_labels.length != 0) - join_labels = result.childs_of_old_labels.join(','); - else - join_labels = join_labels_from_old_tab(hierarchy.old_labels_tab); - join_labels = add_father_to_child_tab(hierarchy.old_labels_tab, join_labels); - all_links = JSON.parse(request_ajax("labels_links/"+join_labels)); - result.links_of_results = "'"+all_links.join("','")+"'"; - result.result_tab = JSON.parse(request_ajax_post('tutos', result.links_of_results)); - del_unselect_language(); - result.del_unselected_tuto(); - hierarchy.maj_new_labels_tab(); -} +// function maj_results_from_db() { +// /** +// * [NOT USED] +// * Selects links related to labels in 'childs_of_old_labels' +// * and labels in old tab and fill 'result_tab' with tutorials +// * related to this links. +// */ +// var all_links = []; +// var join_labels = ''; +// result.result_tab = []; +// if (result.childs_of_old_labels.length != 0) +// join_labels = result.childs_of_old_labels.join(','); +// else +// join_labels = join_labels_from_old_tab(hierarchy.old_labels_tab); +// join_labels = add_father_to_child_tab(hierarchy.old_labels_tab, join_labels); +// all_links = JSON.parse(request_ajax("labels_links/"+join_labels)); +// result.links_of_results = "'"+all_links.join("','")+"'"; +// result.result_tab = JSON.parse(request_ajax_post('tutos', result.links_of_results)); +// del_unselect_language(); +// result.del_unselected_results(); +// hierarchy.maj_new_labels_tab(); +// } function maj_tutos_after_unselect() { /** @@ -56,7 +57,7 @@ function maj_tutos_after_unselect() { * and labels in old tab and fill 'result_tab' with tutorials * related to this links. */ - var all_links = []; + var all_id_labels = []; var join_labels = ''; result.result_tab = []; @@ -65,15 +66,15 @@ function maj_tutos_after_unselect() { join_labels = hierarchy.unselect_tab[0][0]; else join_labels = unselect_label_childs.join(',')+','+hierarchy.unselect_tab[0][0]; - all_links = JSON.parse(request_ajax("labels_links_unselect/"+join_labels)); - result.links_of_results = "'"+all_links.join("','")+"'"; - result.result_tab = JSON.parse(request_ajax_post('tutos', result.links_of_results)); + all_id_labels = JSON.parse(request_ajax("labels_links_unselect/"+join_labels)); + result.links_of_results = all_id_labels.join(', '); + result.result_tab = JSON.parse(request_ajax("tutos/"+result.links_of_results)); del_unselect_language(); - result.del_unselected_tuto(); + result.del_unselected_results(); hierarchy.maj_new_labels_tab(); } -function maj_tutos_after_remove() { +function maj_results_after_remove() { /** * Select tutos from database but each tuto * returned must have all selected labels. For example, AFTER @@ -81,15 +82,15 @@ function maj_tutos_after_remove() { * selected must have this two labels. */ join_labels = join_labels_from_old_tab(hierarchy.old_labels_tab); - all_links = JSON.parse(request_ajax("tuto_family/"+join_labels)); - result.links_of_results = "'"+all_links.join("','")+"'"; - result.result_tab = JSON.parse(request_ajax_post('tutos', result.links_of_results)); + all_id_labels = JSON.parse(request_ajax("tuto_family/"+join_labels)); + result.links_of_results = all_id_labels.join(', '); + result.result_tab = JSON.parse(request_ajax("tutos/"+result.links_of_results)); del_unselect_language(); - result.del_unselected_tuto(); + result.del_unselected_results(); hierarchy.maj_new_labels_tab(); } -function maj_tutos_for_many_labels() { +function maj_results_for_many_labels() { /** * If there is several labels (after left click on one label from hierachy) * in old_tab we select just the last and we keep @@ -101,11 +102,11 @@ function maj_tutos_for_many_labels() { var tuto_links_last_label = JSON.parse(request_ajax("link/"+last_label)); for (var i = 0; result.result_tab[i]; i++) { - if (is_in_tab(result.result_tab[i][1], tuto_links_last_label, null, 1) != -1) + if (is_in_tab(result.result_tab[i][0], tuto_links_last_label, null, 1) != -1) final_tab.push(result.result_tab[i]); } result.result_tab = final_tab; del_unselect_language(); - result.del_unselected_tuto(); + result.del_unselected_results(); hierarchy.maj_new_labels_tab(); } \ No newline at end of file diff --git a/app/static/vue.js b/app/static/js/vue.js similarity index 100% rename from app/static/vue.js rename to app/static/js/vue.js diff --git a/app/templates/add_new_tuto.html b/app/templates/add_new_tuto.html index 261a6fface145b41cf65620b883351e245c35daa..836466b86df0b08fc9f82e19ebabc6268046dc26 100644 --- a/app/templates/add_new_tuto.html +++ b/app/templates/add_new_tuto.html @@ -5,7 +5,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Add tutos</title> - <link rel="stylesheet" href="static/add_tuto.css"> + <link rel="stylesheet" href="static/css/annimation.css"> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- Bootstrap --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> @@ -57,9 +57,9 @@ </body> - <script src="static/create_arbo.js"></script> - <script src="static/array_opperations.js"></script> - <script src="static/ajax.js"></script> + <script src="static/js/create_arbo.js"></script> + <script src="static/js/array_opperations.js"></script> + <script src="static/js/ajax.js"></script> <script> function create_empty_tab(size) { diff --git a/app/templates/browse.html b/app/templates/browse.html index 4087d358719f4012f9b3bae9856a25c4d288dfac..698bd9b57805912ab28247b8ecdec0eb2c45bec3 100644 --- a/app/templates/browse.html +++ b/app/templates/browse.html @@ -5,12 +5,14 @@ <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Browse</title> - <link rel="stylesheet" href="static/add_tuto.css"> - <link rel="stylesheet" href="static/test.css"> + <link rel="stylesheet" href="static/css/annimation.css"> + <link rel="stylesheet" href="static/css/main.css"> + <link rel="stylesheet" href="static/css/hierarchy.css"> + <link rel="stylesheet" href="static/css/result.css"> <!-- Bootstrap --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- VueJs --> - <script src="static/vue.js"></script> + <script src="static/js/vue.js"></script> <style type="text/css">[v-cloak] {display: none;}</style> </head> @@ -18,58 +20,72 @@ <div class='container'> - <br> + <br> <div class="row"> - <br><br><br> + <div class="col-md-12" id="project_title"> + <h1><b>[[ txt['project_name'] ]]</b></h1> + </div> + </div> + <br> + + <div class="row"> + <br><br> <div class="col-md-4"> <div id='hierarchy' class="panel panel-primary" v-cloak> - <div class="panel-heading title"> - <span v-if="this.labels_language == 'US'" style="margin-left: 9%; margin-right: 4%"><span class="glyphicon glyphicon-tags"></span>Labels</span> - <span v-else style="margin-left: -6%; margin-right: 4%;"><span class="glyphicon glyphicon-tags"></span>Étiquettes</span> + <span v-if="this.labels_language == 'US'" id="hierarchy-title_ang"><span class="glyphicon glyphicon-tags"></span>[[ txt['labels_title_ang'] ]]</span> + <span v-else id="hierarchy-title_fr"><span class="glyphicon glyphicon-tags"></span>[[ txt['labels_title_fr'] ]]</span> <span style="margin-right: -10%;"> <span v-if='this.labels_language == "FR"'> - <img style="height:25px; width:25px; margin-right: 3%;" src="static/boue_france.png"> - <img title="Passe le nom des étiquettes en Anglais" @click="change_labels_language('US')" style="height:25px; width:25px;" src="static/boue_usa_black.png" onmouseover="this.src='static/boue_usa.png'" onmouseout="this.src='static/boue_usa_black.png'"> + <img class="hierarchy-lang_icon_left" src="static/img/boue_france.png"> + <img title="Passe le nom des étiquettes en Anglais" @click="change_labels_language('US')" class="hierarchy-lang_icon_right" src="static/img/boue_usa_black.png" onmouseover="this.src='static/img/boue_usa.png'" onmouseout="this.src='static/img/boue_usa_black.png'"> </span> <span v-else> - <img title="Pass the name of the labels in French" @click="change_labels_language('FR')" style="height:25px; width:25px; margin-right: 3%;" src="static/boue_france_black.png" onmouseover="this.src='static/boue_france.png'" onmouseout="this.src='static/boue_france_black.png'"> - <img style="height:25px; width:25px;" src="static/boue_usa.png"> + <img title="Pass the name of the labels in French" @click="change_labels_language('FR')" class="hierarchy-lang_icon_left" src="static/img/boue_france_black.png" onmouseover="this.src='static/img/boue_france.png'" onmouseout="this.src='static/img/boue_france_black.png'"> + <img class="hierarchy-lang_icon_right" src="static/img/boue_usa.png"> </span> </span> </div> <div class="pannel-body hierarchy"> + <!-- HIERARCHY.OLD_LABELS_TAB --> <span v-for='(value, index) in old_labels_tab'> - <img v-if="labels_language == 'FR'" title="Désélectionne les éléments portant cette étiquette" class="icone_left" @click="rm_label_of_old_tab(index)" src="static/swimming.small.png" onmouseover="this.src='static/unchecked_swimming.small.png'" onmouseout="this.src='static/swimming.small.png'"> - <img v-else-if="labels_language == 'US'" title="Deselect the elements bearing this label" class="icone_left" @click="rm_label_of_old_tab(index)" src="static/swimming.small.png" onmouseover="this.src='static/unchecked_swimming.small.png'" onmouseout="this.src='static/swimming.small.png'"> - <span v-if="value[1].length <= 13"><b>{{ value[1] }}</b></span> - <span v-else v-bind:title="value[1]"><b>{{ value[1].slice(0, 12)+"..." }}</b></span> - <img class="icone_right" src="static/swimming.small.png" style="visibility: hidden;"><br> + <img v-if="labels_language == 'FR'" title="Désélectionne les éléments portant cette étiquette" class="icone_left" @click="rm_label_of_old_tab(index)" src="static/img/swimming.small.png" onmouseover="this.src='static/img/unchecked_swimming.small.png'" onmouseout="this.src='static/img/swimming.small.png'"> + <img v-else-if="labels_language == 'US'" title="Deselect the elements bearing this label" class="icone_left" @click="rm_label_of_old_tab(index)" src="static/img/swimming.small.png" onmouseover="this.src='static/img/unchecked_swimming.small.png'" onmouseout="this.src='static/img/swimming.small.png'"> + <span v-if="(value[1].length <= 23)"><b>{{ value[1] }}</b></span> + <span v-else v-bind:title="value[1]"><b>{{ value[1].slice(0, 17)+"..." }}</b></span> + <img class="icone_right" src="static/img/swimming.small.png" style="visibility: hidden;"><br> </span> + <!-- HIERARCHY.OLD_LABELS_TAB --> + + <!-- HIERARCHY.UNSELECT_TAB --> <span v-for='(value, index) in unselect_tab'> - <img class="icone_left" src="static/swimming.small.png" style="visibility: hidden;"> - <span v-if="value[1].length <= 13"><b>{{ value[1] }}</b></span> - <span v-else v-bind:title="value[1]"><b>{{ value[1].slice(0, 12)+"..." }}</b></span> - <img v-if="labels_language == 'FR'" title="Autorise les éléments portant cette étiquette" class="icone_right" @click="rm_label_to_unselect_tab(index)" src="static/swimming.small.png" onmouseover="this.src='static/unchecked_swimming.small.png'" onmouseout="this.src='static/swimming.small.png'"> - <img v-if="labels_language == 'US'" title="Authorizes elements bearing this label" class="icone_right" @click="rm_label_to_unselect_tab(index)" src="static/swimming.small.png" onmouseover="this.src='static/unchecked_swimming.small.png'" onmouseout="this.src='static/swimming.small.png'"> + <img class="icone_left" src="static/img/swimming.small.png" style="visibility: hidden;"> + <span v-if="(value[1].length <= 23)"><b>{{ value[1] }}</b></span> + <span v-else v-bind:title="value[1]"><b>{{ value[1].slice(0, 17)+"..." }}</b></span> + <img v-if="labels_language == 'FR'" title="Autorise les éléments portant cette étiquette" class="icone_right" @click="rm_label_to_unselect_tab(index)" src="static/img/swimming.small.png" onmouseover="this.src='static/img/unchecked_swimming.small.png'" onmouseout="this.src='static/img/swimming.small.png'"> + <img v-if="labels_language == 'US'" title="Authorizes elements bearing this label" class="icone_right" @click="rm_label_to_unselect_tab(index)" src="static/img/swimming.small.png" onmouseover="this.src='static/img/unchecked_swimming.small.png'" onmouseout="this.src='static/img/swimming.small.png'"> <br> </span> + <!-- HIERARCHY.UNSELECT_TAB --> + + <!-- HIERARCHY.NEW_LABELS_TAB --> <div v-if="this.loading == 1"> <hr v-if="(this.old_labels_tab.length > 0 || this.unselect_tab.length > 0) && this.new_labels_tab.length > 0"/> <transition-group name="new_labels"> <span v-for='(label, index) in new_labels_tab' v-bind:key="label"> - <img v-if="labels_language == 'FR'" title="Sélectionne les éléments possèdant cette étiquette" class="icone_left" @click="add_label_to_old_tab(index, 1)" src="static/unchecked_swimming.small.png" onmouseover="this.src='static/swimming.small.png'" onmouseout="this.src='static/unchecked_swimming.small.png'"> - <img v-else-if="labels_language == 'US'" title="Selects elements with this label" class="icone_left" @click="add_label_to_old_tab(index, 1)" src="static/unchecked_swimming.small.png" onmouseover="this.src='static/swimming.small.png'" onmouseout="this.src='static/unchecked_swimming.small.png'"> + <img v-if="labels_language == 'FR'" title="Sélectionne les éléments possèdant cette étiquette" class="icone_left" @click="add_label_to_old_tab(index, 1)" src="static/img/unchecked_swimming.small.png" onmouseover="this.src='static/img/swimming.small.png'" onmouseout="this.src='static/img/unchecked_swimming.small.png'"> + <img v-else-if="labels_language == 'US'" title="Selects elements with this label" class="icone_left" @click="add_label_to_old_tab(index, 1)" src="static/img/unchecked_swimming.small.png" onmouseover="this.src='static/img/swimming.small.png'" onmouseout="this.src='static/img/unchecked_swimming.small.png'"> <span v-if="(label[1].length <= 23)"><b>{{ label[1] }}</b></span> <span v-else v-bind:title="label[1]"><b>{{ label[1].slice(0, 17)+"..." }}</b></span> - <img v-if="labels_language == 'FR'" title="Interdit les éléments possèdant cette étiquette" class="icone_right" @click="add_label_to_unselect_tab(index)" src="static/unchecked_swimming.small.png" onmouseover="this.src='static/swimming.small.png'" onmouseout="this.src='static/unchecked_swimming.small.png'"> - <img v-if="labels_language == 'US'" title="Prohibits elements with this label" class="icone_right" @click="add_label_to_unselect_tab(index)" src="static/unchecked_swimming.small.png" onmouseover="this.src='static/swimming.small.png'" onmouseout="this.src='static/unchecked_swimming.small.png'"> + <img v-if="labels_language == 'FR'" title="Interdit les éléments possèdant cette étiquette" class="icone_right" @click="add_label_to_unselect_tab(index)" src="static/img/unchecked_swimming.small.png" onmouseover="this.src='static/img/swimming.small.png'" onmouseout="this.src='static/img/unchecked_swimming.small.png'"> + <img v-if="labels_language == 'US'" title="Prohibits elements with this label" class="icone_right" @click="add_label_to_unselect_tab(index)" src="static/img/unchecked_swimming.small.png" onmouseover="this.src='static/img/swimming.small.png'" onmouseout="this.src='static/img/unchecked_swimming.small.png'"> <br> </span> </transition-group> </div> + <!-- HIERARCHY.NEW_LABELS_TAB --> </div> </div> @@ -79,32 +95,37 @@ <div class="col-md-8" id="result" v-cloak> <div class="panel panel-primary"> <div class="panel-heading title"> - <span style="margin-left: 9%; margin-right: 3%;"> + <span id="result-title"> <span class="glyphicon glyphicon-book"></span> - <span v-if="this.labels_language == 'FR'">Tutoriels</span> - <span v-else="this.labels_language == 'US'">Tutorials</span> + <span v-if="this.labels_language == 'FR'">[[ txt['result_title_fr'] ]]</span> + <span v-else="this.labels_language == 'US'">[[ txt['result_title_ang'] ]]</span> </span> - <span style="margin-left: 0%"> - <span v-if="this.tutos_language[0] % 2 == 0 && this.tutos_language[1] % 2 == 0"> - <img :title="(labels_language == 'FR') ? 'Enlève les tutoriels en langue française' : 'Removes french language tutorials'" style="height:25px; width:25px; margin-right: 2%;" @click="change_tutos_language([1, 0])" src="static/boue_france.png" onmouseover="this.src='static/boue_france_black.png'" onmouseout="this.src='static/boue_france.png'"> - <img :title="(labels_language == 'FR') ? 'Enlève les tutoriels en langue anglaise' : 'Removes english language tutorials'" style="height:25px; width:25px; margin-right: 3%;" @click="change_tutos_language([0, 1])" src="static/boue_usa.png" onmouseover="this.src='static/boue_usa_black.png'" onmouseout="this.src='static/boue_usa.png'"> + <!-- RESULT LANG ICONS --> + <span id="result-lang"> + <span v-if="this.results_language[0] % 2 == 0 && this.results_language[1] % 2 == 0"> + <img title="Enlève les tutoriels en langue française" class="result-lang_icon_left" @click="change_results_language([1, 0])" src="static/img/boue_france.png" onmouseover="this.src='static/img/boue_france_black.png'" onmouseout="this.src='static/img/boue_france.png'"> + <img title="Enlève les tutoriels en langue anglaise" class="result-lang_icon_right" @click="change_results_language([0, 1])" src="static/img/boue_usa.png" onmouseover="this.src='static/img/boue_usa_black.png'" onmouseout="this.src='static/img/boue_usa.png'"> </span> - <span v-if="this.tutos_language[0] % 2 != 0 && this.tutos_language[1] % 2 == 0"> - <img :title="(labels_language == 'FR') ? 'Remet les tutoriels en langue française' : 'Provide tutorials in french'" style="height:25px; width:25px; margin-right: 2%;" @click="change_tutos_language([1, 0])" src="static/boue_france_black.png" onmouseover="this.src='static/boue_france.png'" onmouseout="this.src='static/boue_france_black.png'"> - <img style="height:25px; width:25px; margin-right: 3%;" src="static/boue_usa.png"> + <span v-if="this.results_language[0] % 2 != 0 && this.results_language[1] % 2 == 0"> + <img title="Remet les tutoriels en langue française" class="result-lang_icon_left" @click="change_results_language([1, 0])" src="static/img/boue_france_black.png" onmouseover="this.src='static/img/boue_france.png'" onmouseout="this.src='static/img/boue_france_black.png'"> + <img class="result-lang_icon_right" src="static/img/boue_usa.png"> </span> - <span v-if="this.tutos_language[0] % 2 == 0 && this.tutos_language[1] % 2 != 0"> - <img style="height:25px; width:25px; margin-right: 2%;" src="static/boue_france.png"> - <img :title="(labels_language == 'FR') ? 'Remet les tutoriels en langue anglaise' : 'Provide tutorials in english'" style="height:25px; width:25px; margin-right: 3%;" @click="change_tutos_language([0, 1])" src="static/boue_usa_black.png" onmouseover="this.src='static/boue_usa.png'" onmouseout="this.src='static/boue_usa_black.png'"> + <span v-if="this.results_language[0] % 2 == 0 && this.results_language[1] % 2 != 0"> + <img class="result-lang_icon_left" src="static/img/boue_france.png"> + <img title="Remet les tutoriels en langue anglaise" class="result-lang_icon_right" @click="change_results_language([0, 1])" src="static/img/boue_usa_black.png" onmouseover="this.src='static/img/boue_usa.png'" onmouseout="this.src='static/img/boue_usa_black.png'"> </span> </span> + <!-- RESULT LANG ICONS --> </div> - <!-- <transition-group name="tutos"> --> - <ul v-if="this.loading == 1" class="list-group" > - <li class="list-group-item" v-for='tuto in result_tab' v-bind:key="tuto"><b class="single_result"><a :href='tuto[1]' target="_blank">{{ tuto[0] }}</a></b></li> - </ul> - <!-- </transition-group> --> + + <!-- PRINT ELEMENTS --> + <ul v-if="this.loading == 1" class="list-group" > + <li class="list-group-item" v-for='element in result_tab' v-bind:key="element"> + <b class="single_result"><a v-bind:href="element[2]">{{ element[1] }}</a></b> + </li> + </ul> + <!-- PRINT ELEMENTS --> </div> </div> @@ -114,12 +135,11 @@ </body> - <script src="static/ajax.js"></script> - <script src="static/array_opperations.js"></script> - <script src="static/father_child.js"></script> - <script src="static/labels.js"></script> - <script src="static/maj_tutorial.js"></script> - <script src="static/cookies.js"></script> + <script src="static/js/ajax.js"></script> + <script src="static/js/array_opperations.js"></script> + <script src="static/js/father_child.js"></script> + <script src="static/js/labels.js"></script> + <script src="static/js/maj_tutorial.js"></script> <script> function init_research() { @@ -148,10 +168,13 @@ result.loading = value; } - function create_tab_of_id(all_tuto_labels, link) { + function create_tab_of_id(all_tuto_labels, id_element) { + /** + * Create a tab of all id_label associate to this element. + */ var result = []; for (var i = 0; i < all_tuto_labels.length; i++) { - if (all_tuto_labels[i][0].localeCompare(link) == 0) + if (all_tuto_labels[i][0] == id_element) result.push(all_tuto_labels[i][1]); } return (result) @@ -173,7 +196,8 @@ new_labels_tab: [], unselect_tab: [], loading: 1, - labels_language: "FR" + labels_language: "FR", + labels_language_id: JSON.parse(request_ajax("labels_lang_id")) }, methods: { init_all_labels: function() { @@ -188,7 +212,7 @@ * that don't have a father. */ this.new_labels_tab = JSON.parse(request_ajax("main_labels/"+this.labels_language)); - this.new_labels_tab = remove_labels_language_from_db(this.new_labels_tab); + this.new_labels_tab = remove_labels_language(this.new_labels_tab, this.labels_language_id, 1); }, reset : function() { /** @@ -242,12 +266,12 @@ this.old_labels_tab.push(this.new_labels_tab[index]); update_loading(0); this.new_labels_tab.splice(index, 1); - result.maj_tutos(2); + result.maj_results(2); } else if (source == 2) { this.old_labels_tab.push(this.unselect_tab[index]); update_loading(0); this.unselect_tab.splice(index, 1); - result.maj_tutos(3); + result.maj_results(3); } save_session(); update_loading(1); @@ -262,30 +286,27 @@ this.old_labels_tab.splice(this.old_labels_tab.indexOf(this.old_labels_tab[index]), 1); if (this.old_labels_tab.length == 0 && this.unselect_tab.length > 0) { result.result_tab = JSON.parse(request_ajax("all_tutos")); - result.del_unselected_tuto(); + result.del_unselected_results(); hierarchy.maj_new_labels_tab(); } else if (this.old_labels_tab.length == 0) { this.reset(); } else - result.maj_tutos(3); - save_session(); + result.maj_results(3); update_loading(1); }, add_label_to_unselect_tab: function(index) { /** - * After click on cross of a label from old_labels_tab ot new_labels_tab. + * After click on cross of new_labels_tab. * This label is add to unselect_tab and it is remove from previous tab (). * Next the list of tutos is updated. */ update_loading(0); - var posi = is_in_tab(this.new_labels_tab[index][0], this.all_labels, 0, 2); - hierarchy.unselect_tab.push(this.all_labels[posi]); - this.new_labels_tab.splice(index, 1); + hierarchy.unselect_tab.push(this.new_labels_tab[index]); + hierarchy.new_labels_tab.splice(index, 1); if (this.old_labels_tab.length == 0) - result.maj_tutos(4); + result.maj_results(4); else - result.maj_tutos(3); - save_session(); + result.maj_results(3); update_loading(1); }, rm_label_to_unselect_tab: function(index) { @@ -299,11 +320,10 @@ this.reset(); else if (this.old_labels_tab.length == 0 && this.unselect_tab.length > 0) { result.result_tab = JSON.parse(request_ajax("all_tutos")); - result.del_unselected_tuto(); + result.del_unselected_results(); hierarchy.maj_new_labels_tab(); } else - result.maj_tutos(3); - save_session(); + result.maj_results(3); update_loading(1); }, maj_new_labels_tab: function() { @@ -320,17 +340,17 @@ var len_tab = result.result_tab.length; if (result.result_tab.length != 1) { var inter_labels = ''; - var all_links = ""; + var all_id_elements = ""; for (var i = 0; i < len_tab; i++) { - all_links += '"'+result.result_tab[i][1]+'"'; - (i != len_tab - 1) ? all_links += ',' : all_links += ''; + all_id_elements += result.result_tab[i][0]; + (i != len_tab - 1) ? all_id_elements+= ',' : all_id_elements += ''; } - all_labels = JSON.parse(request_ajax('labels_of_a_link_in/'+all_links)); - all_labels = remove_labels_language(all_labels); + all_labels = JSON.parse(request_ajax('labels_of_a_link_in/'+all_id_elements)); + all_labels = remove_labels_language(all_labels, this.labels_language_id, 0); var diff_labels = get_diff_between_labels(all_labels); diff_labels = remove_childs_of_tab(diff_labels, this.all_labels); this.new_labels_tab = create_tab_of_labels(diff_labels, this.all_labels); - result.del_unselected_tuto(); + result.del_unselected_results(); this.new_labels_tab = sort_tab_of_labels(this.new_labels_tab); } } @@ -354,12 +374,11 @@ links_of_results: '', loading: 1, labels_language: hierarchy.labels_language, - tutos_language: [0, 0], + results_language: [0, 0], local_change: 0, - previous_tutos: [], - tutos_fr: JSON.parse(request_ajax("tutos_language/Français")), - tutos_us: JSON.parse(request_ajax("tutos_language/Anglais")), - all_tutos_labels: JSON.parse(request_ajax("all_tutos_labels")) + results_fr: JSON.parse(request_ajax("tutos_language/Français")), + results_us: JSON.parse(request_ajax("tutos_language/Anglais")), + all_results_labels: JSON.parse(request_ajax("all_tutos_labels")) }, methods: { init_result_tab: function() { @@ -369,26 +388,26 @@ */ this.result_tab = JSON.parse(request_ajax("all_tutos")); }, - change_tutos_language: function(lang) { + change_results_language: function(lang) { /** * lang[0] value for 'Français'. lang[1] value for 'Anglais' * If on of this value is pair => this language is selected. * At eatch click we increase this value for unselect and select. */ if (lang[0] == 1) - Vue.set(this.tutos_language, 0, this.tutos_language[0] + 1); + Vue.set(this.results_language, 0, this.results_language[0] + 1); if (lang[1] == 1) - Vue.set(this.tutos_language, 1, this.tutos_language[1] + 1); + Vue.set(this.results_language, 1, this.results_language[1] + 1); update_loading(0); if (hierarchy.old_labels_tab.length == 0) hierarchy.reset(); if (hierarchy.old_labels_tab.length > 0) - result.maj_tutos(3); + result.maj_results(3); del_unselect_language(); hierarchy.maj_new_labels_tab(); update_loading(1); }, - del_unselected_tuto: function() { + del_unselected_results: function() { /** * Delete all tutos from result.result_tab that have the * same labels contain in hierarchy.unselect_tab. @@ -397,7 +416,7 @@ var tab_tutos_final = []; var nb_diff_labels = 0; for (var i = 0; result.result_tab[i]; i++) { - labels_tab = create_tab_of_id(this.all_tutos_labels, result.result_tab[i][1]); + labels_tab = create_tab_of_id(this.all_results_labels, result.result_tab[i][0]); for (var j = 0; labels_tab[j]; j++) { if (is_in_tab(labels_tab[j], hierarchy.unselect_tab, 0, 2) == -1) nb_diff_labels++; @@ -410,7 +429,7 @@ } result.result_tab = tab_tutos_final; }, - maj_tutos: function(type) { + maj_results: function(type) { /** * Update tutorials. */ @@ -419,14 +438,15 @@ console.log("AFTER to unselect"); maj_tutos_after_unselect(); } else if (type == 1) {// || hierarchy.old_labels_tab.length == 1) { + // [NOT USED] console.log("SEARCH FROM DB"); - maj_tutos_from_db(); + maj_results_from_db(); } else if (type == 3) { console.log('MAJ AFTER RM') - maj_tutos_after_remove(); + maj_results_after_remove(); } else if (type == 2 || hierarchy.old_labels_tab.length >= 1) { console.log("PLUSIEURS label dans OLD") - maj_tutos_for_many_labels(); + maj_results_for_many_labels(); } else { console.log("NOTHING"); this.result_tab = []; diff --git a/app/templates/manage_labels.html b/app/templates/manage_labels.html index 22b5b4cd46a8e1ec609c46d8959b37e024ffa341..a196b7522740d701738a58b94c863d4d58c7e690 100644 --- a/app/templates/manage_labels.html +++ b/app/templates/manage_labels.html @@ -9,7 +9,7 @@ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- VueJS --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> - <script src="static/ajax.js"></script> + <script src="static/js/ajax.js"></script> </head> <body>