{"id":3581,"date":"2025-01-31T18:37:21","date_gmt":"2025-01-31T17:37:21","guid":{"rendered":"https:\/\/cga.dev.kneib.fr:7001\/?page_id=3581"},"modified":"2025-01-31T19:38:15","modified_gmt":"2025-01-31T18:38:15","slug":"3581-2","status":"publish","type":"page","link":"https:\/\/alsace-genealogie.com\/?page_id=3581","title":{"rendered":"Lexique"},"content":{"rendered":"<link rel=\"stylesheet\" href=\"https:\/\/alsace-genealogie.com\/wp-content\/plugins\/cga\/styles\/front-lexique.css\">\n<link href=\"https:\/\/unpkg.com\/tabulator-tables@6.3.0\/dist\/css\/tabulator_simple.min.css\" rel=\"stylesheet\">\n<script type=\"text\/javascript\" src=\"https:\/\/unpkg.com\/tabulator-tables@6.3.0\/dist\/js\/tabulator.min.js\"><\/script>\n\n\n<script type=\"module\">\n\nwindow.ajaxurl = \"https:\/\/alsace-genealogie.com\/wp-admin\/admin-ajax.php\";\nconst all_fields = [{\"name\":\"id\",\"type\":\"bigint unsigned\",\"nullable\":false,\"default\":null,\"human_name\":null,\"import_column_optional\":true,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"latin\",\"type\":\"varchar(120)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"latin_v1\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"latin_genitif\",\"type\":\"varchar(30)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"french\",\"type\":\"varchar(120)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"french_v1\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"french_v2\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"french_v3\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"german\",\"type\":\"varchar(120)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"german_v1\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false},{\"name\":\"german_v2\",\"type\":\"varchar(60)\",\"nullable\":true,\"default\":null,\"human_name\":null,\"import_column_optional\":false,\"editable\":true,\"opts\":null,\"idx\":false,\"fts\":false}];\nimport { Index_Validator } from \"https:\/\/alsace-genealogie.com\/wp-content\/plugins\/cga\/js\/back\/\/nmd_import\/validation\/nmd_bib.js\";\nconst fields_validator = new Index_Validator(\n    all_fields\n)\nvar default_row = {};\nall_fields.forEach(f=>{\n    if(f.name==\"id\") return\n    default_row[f.name]=\"\"\n})\nconst CAN_EDIT = false;\nimport { createApp, inject, ref, reactive , watch} from \"https:\/\/unpkg.com\/vue@3\/dist\/vue.esm-browser.js\";\n\nconst app = createApp({\n    components: {\n    },\n    setup() {\n        const table = ref(null); \/\/reference to your table element\n        const tabulator = ref(null); \/\/variable to hold your table\n        var data = []; \/\/data for table to display\n        var orig_data = []; \/\/data for table to display\n        const edition_mode = ref(false);\n        const modified_rows = ref([]);\n        const deleted_rows = ref([]);\n        const update_status = ref({});\n        const added_rows = ref([]);\n\n        watch(edition_mode, () => {\n            if(edition_mode.value==true) tabulator.value.showColumn(\"delete\")\n            else tabulator.value.hideColumn(\"delete\")\n        })\n\n        function reset_filters(){\n            \/\/ Object.keys(localStorage)\n            \/\/ .filter(x =>\n            \/\/     x.startsWith('tabulator-lexique-table-'))\n            \/\/ .forEach(x => \n            \/\/     localStorage.removeItem(x))\n            \/\/ location.reload();\n            tabulator.value.clearHeaderFilter();\n            tabulator.value.clearSort();\n            tabulator.value.setPage(1);\n        }\n\n        function validate_edition(){\n            edition_mode.value = false;\n            update_status.value={status:\"envoi\", msg:\"Envoi en cours...\"}\n            fetch(\n                window.ajaxurl, {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8',\n                        'Cache-Control': 'no-cache',\n                    },\n                    body: new URLSearchParams({\n                        action: \"cga_lexique_update\",\n                        updated: JSON.stringify(modified_rows.value),\n                        added: JSON.stringify(added_rows.value),\n                        deleted: JSON.stringify(deleted_rows.value),\n                    })\n                }\n            )\n            .then(res => {\n                return res.json()\n            })\n            .then(body => {\n                if(body.status==\"success\") {\n                    tabulator.value.replaceData(structuredClone(body.updated_object));\n                    orig_data = structuredClone(body.updated_object)\n                    modified_rows.value = []\n                    added_rows.value = []\n                    deleted_rows.value = []\n                    update_status.value = body\n                    setTimeout(() => {\n                        update_status.value = null\n                    }, 5000);\n                }\n                else{\n                    console.log(body)\n                    update_status.value = body\n                }\n            })\n        }\n\n        function cancel_edition(){\n            tabulator.value.replaceData(structuredClone(orig_data));\n            modified_rows.value = []\n            added_rows.value = []\n            deleted_rows.value = []\n            edition_mode.value = false;\n        }\n\n        function handle_modification(action,cell,valid){\n            if(cell._added === true) return\n            const id = cell.getData().id\n            const field_name = cell.getField()\n            let modified_row = this.modified_rows.find(r=>r.id==id)\n            if(modified_row==undefined){\n                modified_row = {id:id}\n                this.modified_rows.push(modified_row)\n            }\n            if(action=='changed' && valid==true){\n                modified_row[field_name] = cell.getValue()\n            } else { \/\/action == \"reset\" or valid!=true\n                delete modified_row[field_name]\n            }\n            if(Object.keys(modified_row).length==1){\n                this.modified_rows = this.modified_rows.filter(mr=>mr.id!=id)\n            }\n        }\n\n        function add_row(){\n            tabulator.value.clearHeaderFilter();\n            tabulator.value.clearSort();\n            var newRow = {}\n            Object.assign(newRow, default_row)\n            tabulator.value.addRow(newRow, true).then(function(row){\n                added_rows.value.push(row.getData())\n                row.getCells().forEach(c=>{\n                    c._added = true\n                    c.getElement().classList.add('added')\n                })\n            });\n        }\n\n        function handle_delete_row(e,cell){\n            const id = cell.getData().id\n            if(cell._added){\n                cell.getRow().delete()\n                added_rows.value = added_rows.value.filter(ar=>ar.id!=id)\n            } \n            else{\n                if(cell._deleted){\n                    deleted_rows.value = deleted_rows.value.filter(dr=>dr!=id)\n                    cell.getRow().getCells().forEach(c=>{\n                        delete c._deleted\n                        c.getElement().classList.remove('deleted')\n                    })\n                } else {\n                    deleted_rows.value.push(id)\n                    cell.getRow().getCells().forEach(c=>{\n                        c._deleted = true\n                        c.getElement().classList.add('deleted')\n                    })\n                }\n            }\n        }\n \n        function cellsFormatter(cell) {\n            if(cell._added===true){\n                const el = cell.getElement()\n                el.classList.add('added')\n            }\n            if(cell._deleted===true){\n                const el = cell.getElement()\n                el.classList.add('deleted')\n            }\n            return cell.getValue()\n        }\n\n        return {\n            table,\n            tabulator,\n            data,\n            CAN_EDIT,\n            reset_filters,\n            edition_mode,\n            validate_edition,\n            cancel_edition,\n            modified_rows,\n            deleted_rows,\n            handle_modification,\n            handle_delete_row,\n            update_status,\n            add_row,\n            added_rows,\n            cellsFormatter,\n        }\n    },\n    mounted(){\n        const default_filters_params = {headerFilter:\"input\", formatter:this.cellsFormatter, resizable:true, tooltip:true, editor:\"input\", editable: ()=>this.edition_mode}\n        this.tabulator = new Tabulator(this.table, {\n            height: \"100%\", \/\/necessary to avoid bug on columns resize\n            rowHeight:32,\n            layout:\"fitColumns\",\n            data: this.data, \/\/link data to table\n            reactiveData:true, \/\/enable data reactivity\n            pagination:\"local\",\n            paginationAddRow:\"page\",\n            paginationSize:20,\n            paginationCounter:function(pageSize, currentRow, currentPage, totalRows, totalPages){\n                return currentRow + ' - ' + currentPage*pageSize + \" \/ \" + totalRows;\n            },\n            paginationButtonCount:10,\n            \/\/ paginationElement:document.querySelector('.table-pagination'),\n            locale: 'fr-fr',\n            langs:{\n                \"fr-fr\":{\n                    \"columns\":{\n                        \"name\":\"Nom\",\n                        \"progress\":\"Progression\",\n                        \"gender\":\"Genre\",\n                        \"rating\":\"\u00c9valuation\",\n                        \"col\":\"Couleur\",\n                        \"dob\":\"Date de Naissance\",\n                    },\n                    \"pagination\":{\n                        \"first\":\"Premier\",\n                        \"first_title\":\"Premi\u00e8re Page\",\n                        \"last\":\"Dernier\",\n                        \"last_title\":\"Derni\u00e8re Page\",\n                        \"prev\":\"Pr\u00e9c\u00e9dent\",\n                        \"prev_title\":\"Page Pr\u00e9c\u00e9dente\",\n                        \"next\":\"Suivant\",\n                        \"next_title\":\"Page Suivante\",\n                        \"all\":\"Toute\",\n                    },\n                },\n            },\n            persistence:{\n                sort: true, \/\/persist column sorting\n                filter: true, \/\/persist filters\n                headerFilter: true, \/\/persist header filters\n                page: true, \/\/persist page\n            },\n            persistenceMode:\"local\",\n            columns: [\n                { title: \"\ud83d\uddd1\", field:\"delete\", formatter:\"buttonCross\", width:25, visible:false, cellClick: this.handle_delete_row, headerSort:false, headerHozAlign:\"center\", hozAlign:\"center\"},\n                {...{title:'Latin', field:'latin'}, ...default_filters_params},\n                {...{title:'Lat. v.', field:'latin_v1'}, ...default_filters_params},\n                {...{title:'Genitif', field:'latin_genitif', width:85}, ...default_filters_params},\n                {...{title:'Fran\u00e7ais', field:'french'}, ...default_filters_params},\n                {...{title:'Fra. v. 1', field:'french_v1'}, ...default_filters_params},\n                {...{title:'Fra. v. 2', field:'french_v2'}, ...default_filters_params},\n                {...{title:'Fra. v. 3', field:'french_v3'}, ...default_filters_params},\n                {...{title:'Allemand', field:'german'}, ...default_filters_params},\n                {...{title:'All. v. 1', field:'german_v1'}, ...default_filters_params},\n                {...{title:'All. v. 2', field:'german_v2'}, ...default_filters_params},\n            ], \/\/define table columns\n        });\n\n        this.tabulator.on(\"cellEdited\", function(cell){\n            const el = cell.getElement()\n            const value = cell.getValue()\n            const valid = fields_validator.validate_field_by_name(cell.getField(), value)\n            \n            if(value!=cell.getInitialValue()){\n                el.classList.add('changed')\n                this.handle_modification('changed', cell, valid)\n            } else {\n                el.classList.remove('changed')\n                this.handle_modification('reset', cell, valid)\n            }\n            if(valid!=true){\n                el.classList.add('invalid')\n                el.setAttribute('title',valid.message)\n            } else {\n                el.classList.remove('invalid')\n                el.removeAttribute('title')\n            }\n        }.bind(this));\n    }\n})\nwindow.addEventListener(\"load\", ()=> app.mount('#lexique-main-container'));\n<\/script>\n\n<div id=\"lexique-main-container\">\n    <div v-if=\"data.length==0\">\n        La consultation du lexique est r\u00e9serv\u00e9 aux membres du CGA. <a href=\"https:\/\/alsace-genealogie.com\/?page_id=1066\">Voir les options d'adh\u00e9sion.<\/a>\n    <\/div>\n    <div class=\"header-buttons\">\n        <button v-if=\"!edition_mode\" @click=\"reset_filters\" class=\"reinit\">R\u00e9initialiser les filtres<\/button>\n        <template v-if=\"CAN_EDIT\">\n            <button v-if=\"edition_mode==false\" @click=\"edition_mode=true\" class=\"edition\">Mode \u00e9dition<\/button>\n            <div style=\"display:contents;\" v-if=\"edition_mode==true\">\n                <button @click=\"validate_edition\" class=\"accept\">Accepter les changements<\/button>\n                <button @click=\"add_row\" class=\"add\">Ajouter une traduction<\/button>\n                <button @click=\"cancel_edition\" class=\"cancel\">Annuler les changements<\/button>\n                <div class=\"counters\">\n                    <span class=\"modified\" :class=\"{highlight:modified_rows.length}\"><span class=\"number\">{{modified_rows.length}}<\/span> ligne(s) modifi\u00e9e(s), <\/span>\n                    <span class=\"added\" :class=\"{highlight:added_rows.length}\"><span class=\"number\">{{added_rows.length}}<\/span> ligne(s) ajout\u00e9e(s), <\/span>\n                    <span class=\"deleted\" :class=\"{highlight:deleted_rows.length}\"><span class=\"number\">{{deleted_rows.length}}<\/span> ligne(s) supprim\u00e9e(s)<\/span>\n                <\/div>\n            <\/div>\n            <span v-if=\"update_status!=null\" class=\"update_status\" :class=\"update_status.status\">{{update_status.msg}}<\/span>\n        <\/template>\n    <\/div>\n    <div ref=\"table\" id=\"lexique-table\">\n    <\/div>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[],"class_list":["post-3581","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/pages\/3581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3581"}],"version-history":[{"count":4,"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/pages\/3581\/revisions"}],"predecessor-version":[{"id":3609,"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=\/wp\/v2\/pages\/3581\/revisions\/3609"}],"wp:attachment":[{"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alsace-genealogie.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}