X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/05a64b9314fac5f613133332d7d0b5b568ab8afc..2de0fde86873c879961365b4b9ce3904a158e84f:/src/redakcja/static/js/wiki/view_properties.js diff --git a/src/redakcja/static/js/wiki/view_properties.js b/src/redakcja/static/js/wiki/view_properties.js index 571dac00..204a4dec 100644 --- a/src/redakcja/static/js/wiki/view_properties.js +++ b/src/redakcja/static/js/wiki/view_properties.js @@ -13,6 +13,19 @@ "name": "alt", "type": "text", }, + { + "name": "szer", + "type": "percent", + }, + { + "name": "wyrownanie", + "type": "select", + "options": ["lewo", "srodek", "prawo"], + }, + { + "name": "oblew", + "type": "bool", + }, ], }, "ref": { @@ -33,20 +46,37 @@ self.$pane = $("#side-properties"); - $(document).on('click', '[x-node]', function(e) { - e.stopPropagation(); - self.edit(this); + $("#simple-editor").on('click', '[x-node]', function(e) { + if (!e.redakcja_edited) { + e.redakcja_edited = true; + self.edit(this); + } }); self.$pane.on('click', '#parents li', function(e) { self.edit($(this).data('node')); }); + $(document).on('click', '#bubbles .badge', function(e) { + self.edit($(this).data('node')); + }); + self.$pane.on('change', '.form-control', function() { let $input = $(this); + let inputval; + if ($input.attr('type') == 'checkbox') { + inputval = $input.is(':checked'); + } else { + inputval = $input.val(); + } + if ($input.data("edited")) { - $input.data("edited").text($input.val()); + if ($input.data("edited-attr")) { + $input.data("edited").attr($input.data("edited-attr"), inputval); + } else { + $input.data("edited").text(inputval); + } return; } @@ -56,7 +86,8 @@ w(222) let $xmlelem = $($.parseXML(xml)); w(333, $xmlelem) - $xmlelem.contents().attr($input.data('property'), $input.val()); + w($input.data('property'), $input.val()); + $xmlelem.contents().attr($input.data('property'), inputval); w(444, $xmlelem) let newxml = (new XMLSerializer()).serializeToString($xmlelem[0]); w(555, newxml) @@ -74,6 +105,60 @@ }); self.$edited; }); + + + self.$pane.on('click', '.meta-add', function() { + // create a metadata item + let $fg = $(this).parent(); + let ns = $fg.data('ns'); + let tag = $fg.data('tag'); + let field = $fg.data('field'); + let span = $(''); + span.attr('x-node', tag); + span.attr('x-ns', ns) + if (field.value_type.hasLanguage) { + span.attr('x-a-xml-lang', 'pl'); + } + + rdf = $("> [x-node='RDF']", self.$edited); + if (!rdf.length) { + rdf = $(""); + self.$edited.prepend(rdf); + self.$edited.prepend('\n '); + + } + rdfdesc = $("> [x-node='Description']", rdf); + if (!rdfdesc.length) { + rdfdesc = $(""); + rdf.prepend(rdfdesc); + rdf.prepend('\n '); + rdfdesc.append('\n '); + rdf.append('\n '); + } + span.appendTo(rdfdesc); + rdfdesc.append('\n '); + + self.displayMetaProperty($fg); + + return false; + }); + + self.$pane.on('click', '.meta-delete', function() { + let $fg = $(this).closest('.form-group'); + $('input', $fg).data('edited').remove(); + self.displayMetaProperty($fg); + return false; + }); + + + + self.$pane.on('click', '.current-convert', function() { + self.convert($(this).attr('data-to')); + }); + self.$pane.on('click', '#current-delete', function() { + self.delete(); + }); + oldCallback.call(this); }; @@ -86,58 +171,194 @@ PropertiesPerspective.prototype.edit = function(element) { let self = this; - let $node = $(element); $("#parents", self.$pane).empty(); + $("#bubbles").empty(); + + $f = $("#properties-form", self.$pane); + $f.empty(); + + if (element === null) { + self.$edited = null; + return; + } + + let $node = $(element); + let b = $("").text($node.attr('x-node')); + b.data('node', element); + $("#bubbles").append(b); + $node.parents('[x-node]').each(function() { let a = $("").text($(this).attr('x-node')); a.data('node', this); $("#parents", self.$pane).prepend(a) + + let b = $("").text($(this).attr('x-node')); + b.data('node', this); + $("#bubbles").append(b); }) + // It's a tag. node = $(element).attr('x-node'); $("h1", self.$pane).text(node); - $f = $("#properties-form", self.$pane); - $f.empty(); self.$edited = $(element); let nodeDef = elementDefs[node]; if (nodeDef && nodeDef.attributes) { $.each(nodeDef.attributes, function(i, a) { - self.addEditField(a.name, a.type, $(element).attr('data-wlf-' + a.name)); // ... + self.addEditField(a, $(element).attr('x-a-wl-' + a.name)); // ... }) } - // Only utwor can has matadata now. if (node == 'utwor') { - // Let's find all the metadata. - $("> .RDF > .Description > [x-node]", $node).each(function() { - $meta = $(this); - self.addEditField( - $meta.attr('x-node'), - null, - $meta.text(), - $meta, - ); + $('').appendTo($("#properties-form", self.$pane)) + META_FIELDS.forEach(function(field) { + let $fg = $(""); + $("").text(field.name).appendTo($fg); + + // if multiple? + $("+").appendTo($fg); + + let match = field.uri.match(/({(.*)})?(.*)/); + ns = match[2]; + tag = match[3]; + + let cont = $(''); + + $fg.data('ns', ns); + $fg.data('tag', tag); + $fg.data('field', field); + cont.appendTo($fg); + + self.displayMetaProperty($fg); + + $fg.appendTo( $("#properties-form", self.$pane)); }); } + + // check node type, find relevant tags + if ($node[0].nodeName == 'DIV') { + $("#current-convert").attr("data-current-type", "div"); + } else if ($node[0].nodeName == 'EM') { + $("#current-convert").attr("data-current-type", "span"); + } }; + + PropertiesPerspective.prototype.addMetaInput = function(cont, field, element) { + let self = this; + + let ig = $(''); + //ig.data('edited', element); + ig.appendTo(cont); + + if (field.value_type.hasLanguage) { + let pp = $(""); + let lang_input = $(""); + lang_input.data('edited', $(element)); + lang_input.data('edited-attr', 'x-a-xml-lang'); + lang_input.val( + $(element).attr('x-a-xml-lang') + ); + lang_input.appendTo(pp); + pp.appendTo(ig); + } + + let $aninput; + if (field.value_type.widget == 'select') { + $aninput = $(""); + $.each(field.value_type.options, function() { + $("").text(this).appendTo($aninput); + }) + } else { + $aninput = $(""); + if (field.value_type.autocomplete) { + let autoOptions = field.value_type.autocomplete; + $aninput.autocomplete(autoOptions).autocomplete('instance')._renderItem = function(ul, item) { + let t = item.label; + if (item.name) t += '' + item.name + ''; + if (item.description) t += '' + item.description + ''; + return $( "" ) + .append( "" + t + "" ) + .appendTo( ul ); + }; + } + } + $aninput.data('edited', $(element)) + $aninput.val( + $(element).text() + ); + $aninput.appendTo(ig); + + let ap = $(""); + ap.appendTo(ig); + $("x").appendTo(ap); - PropertiesPerspective.prototype.addEditField = function(name, type, value, elem) { + // lang + }; + + + PropertiesPerspective.prototype.displayMetaProperty = function($fg) { + let self = this; + let ns = $fg.data('ns'); + let tag = $fg.data('tag'); + let field = $fg.data('field'); + + // clear container + $('.c', $fg).empty(); + + let selector = "> [x-node='RDF'] > [x-node='Description'] > [x-node='"+tag+"']"; + if (ns) { + selector += "[x-ns='"+ns+"']"; + } + $(selector, self.$edited).each(function() { + self.addMetaInput( + $('.c', $fg), + field, + this); + }); + + count = $('.c > .input-group', $fg).length; + if (field.required) { + if (!count) { + $('WYMAGANE').appendTo($('.c', $fg)); + } + } + }; + + + + PropertiesPerspective.prototype.addEditField = function(defn, value, elem) { let self = this; let $form = $("#properties-form", self.$pane); let $fg = $(""); - $("").attr("for", "property-" + name).text(name).appendTo($fg); + $("").attr("for", "property-" + defn.name).text(defn.name).appendTo($fg); let $input; - if (type == 'text') { + switch (defn.type) { + case 'text': $input = $(""); + break; + case 'select': + $input = $(""); + $.each(defn.options, function(i, e) { + $("").text(e).appendTo($input); + }); + break; + case 'bool': + $input = $(""); + break; + default: + $input = $(""); + } + + $input.addClass("form-control").attr("id", "property-" + defn.name).data("property", defn.name); + if ($input.attr('type') == 'checkbox') { + $input.prop('checked', value == 'true'); } else { - $input = $("") + $input.val(value); } - // val? - $input.addClass("form-control").attr("id", "property-" + name).data("property", name).val(value); + if (elem) { $input.data("edited", elem); } @@ -145,7 +366,28 @@ $fg.appendTo($form); } - + + PropertiesPerspective.prototype.convert = function(newtag) { + this.$edited.attr('x-node', newtag); + // TODO: take care of attributes? + } + + PropertiesPerspective.prototype.delete = function(newtag) { + p = this.$edited.parent(); + this.$edited.remove(); + this.edit(p); + } + + PropertiesPerspective.prototype.onEnter = function(success, failure){ + var self = this; + $.wiki.SidebarPerspective.prototype.onEnter.call(this); + + if ($.wiki.activePerspective() != 'VisualPerspective') + $.wiki.switchToTab('#VisualPerspective'); + + self.edit($('[x-node="utwor"]')[0]); + }; + $.wiki.PropertiesPerspective = PropertiesPerspective; })(jQuery);