X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/cf891d5c934a7d112f3c36ad82b256917a096fca..b899f6803da3511d0658b14458b7b05f6743be6a:/platforma/static/js/main.js diff --git a/platforma/static/js/main.js b/platforma/static/js/main.js index 1a281c40..3f4d30c2 100644 --- a/platforma/static/js/main.js +++ b/platforma/static/js/main.js @@ -4,6 +4,57 @@ if (!window.console) { } } +THEMES = ['Alkohol', 'Ambicja', 'Anioł', 'Antysemityzm', 'Arkadia', 'Artysta', 'Bezdomność', +'Bezpieczeństwo', 'Bieda', 'Bijatyka', 'Błazen', 'Błądzenie', 'Błoto', 'Bogactwo', 'Bóg', 'Brat', +'Bunt', 'Buntownik', 'Burza', 'Car', 'Carpe diem', 'Ciemność', 'Cień', 'Cisza', 'Chciwość', 'Chleb', +'Chłop', 'Choroba', 'Chrystus', 'Chrzest', 'Ciało', 'Cierpienie', 'Cmentarz', 'Cnota', 'Córka', 'Cud', +'Czarownika', 'Czary', 'Czas', 'Czyn', 'Czyściec', 'Dama', 'Danse macabre', 'Deszcz', 'Diabeł', +'Dobro', 'Dom', 'Dorosłość', 'Drzewo', 'Duch', 'Dusza', 'Duma', 'Dworek', 'Dworzanin', 'Dwór', +'Dzieciństwo', 'Dziecko', 'Dziedzictwo', 'Dziewictwo', 'Dźwięk', 'Egzorcyzm', 'Elita', 'Emigrant', +'Fałsz', 'Filozof', 'Fircyk', 'Flirt', 'Głupiec', 'Głupota', 'Głód', 'Gospodarz', 'Gospodyni', 'Gość', +'Gotycyzm', 'Góra', 'Gra', 'Grób', 'Grzech', 'Grzeczność', 'Gwiazda', 'Handel', 'Hańba', 'Historia', +'Honor', 'Idealista', 'Imię', 'Interes', 'Jabłka', 'Jedzenie', 'Jesień', 'Kaleka', 'Kara', 'Karczma', +'Klęska', 'Kłamstwo', 'Kłótnia', 'Kobieta', 'Kobieta demoniczna', 'Kobieta "upadła"', 'Kochanek', +'Kochanek romantyczny', 'Kolonializm', 'Kondycja ludzka', 'Konflikt', 'Konflikt wewnętrzny', 'Koniec świata', +'Koń', 'Korzyść', 'Kot', 'Kradzież', 'Krew', 'Król', 'Krzywda', 'Ksiądz', 'Książka', +'Księżyc', 'Kuchnia', 'Kuszenie', 'Kwiaty', 'Labirynt', 'Las', 'Lato', 'Lekarz', 'Lenistwo', 'List', +'Liberat', 'Los', 'Lud', 'Lustro', 'Łzy', 'Małżeństwo', 'Marzenie', 'Maska', 'Maszyna', 'Matka', +'Matka Boska', 'Mądrość', 'Mąż', 'Melancholia', 'Mędrzec', 'Mężczyzna', 'Miasto', 'Mieszczanin', +'Miłosierdzie', 'Miłość', 'Miłość niespełniona', 'Miłość platoniczna', 'Miłość romantyczna', +'Miłość silniejsza niż śmierć', 'Miłość spełniona', 'Miłość tragiczna', 'Mizoginia', 'Młodość', 'Moda', +'Modlitwa', 'Morderstwo', 'Morze', 'Motyl', 'Mucha', 'Muzyka', 'Narodziny', 'Naród', 'Natura', +'Nauczyciel', 'Nauczycielka', 'Nauka', 'Niebezpieczeństwo', 'Niedziela', 'Niemiec', 'Nienawiść', +'Nieśmiertelność', 'Niewola', 'Noc', 'Nuda', 'Obcy', 'Obłok', 'Obowiązek', 'Obraz świata', 'Obrzędy', +'Obyczaje', 'Obywatel', 'Odrodzenie przez grób', 'Odwaga', 'Ofiara', 'Ogień', 'Ogród', 'Ojciec', +'Ojczyzna', 'Oko', 'Okręt', 'Okrucieństwo', 'Omen', 'Opieka', 'Organizm', 'Otchłań', 'Pająk', 'Pamięć', +'Pan', 'Panna młoda', 'Państwo', 'Patriota', 'Piekło', 'Pielgrzym', 'Pieniądz', 'Pies', 'Piętno', +'Pijaństwo', 'Piwnica', 'Plotka', 'Pobożność', 'Pocałunek', 'Pochlebstwo', 'Poeta', 'Poetka', 'Poezja', +'Podróż', 'Podstęp', 'Pogrzeb', 'Pojedynek', 'Pokora', 'Pokusa', 'Polak', 'Polityka', 'Polowanie', +'Polska', 'Portret', 'Porwanie', 'Poświęcenie', 'Potwór', 'Powstanie', 'Powstaniec', 'Pozory', +'Pozycja społeczna', 'Pożar', 'Pożądanie', 'Praca', 'Praca u podstaw', 'Praca organiczna', 'Prawda', 'Prawnik', +'Prometeusz', 'Proroctwo', 'Prorok', 'Próżność', 'Przebranie', 'Przeczucie', 'Przedmurze chrześcijaństwa', +'Przekleństwo', 'Przekupstwo', 'Przemiana', 'Przemijanie', 'Przemoc', 'Przestrzeń', +'Przyjaźń', 'Przyroda nieożywiona', 'Przysięga', 'Przywódca', 'Ptak', 'Pustynia', 'Pycha', 'Raj', +'Realista', 'Religia', 'Rewolucja', 'Robak', 'Robotnik', 'Rodzina', 'Rosja', 'Rosjanin', 'Rośliny', +'Rozczarowanie', 'Rozpacz', 'Rozstanie', 'Rozum', 'Ruiny', 'Rycerz', 'Rzeka', 'Salon', 'Samobójstwo', +'Samolubstwo', 'Samotnik', 'Samotność', 'Sarmata', 'Sąsiad', 'Sąd', 'Sąd Ostateczny', 'Sen', 'Serce', +'Sędzia', 'Sielanka', 'Sierota', 'Siła', 'Siostra', 'Sława', 'Słońce', 'Słowo', 'Sługa', 'Służalczość', +'Skąpiec', 'Sobowtór', 'Społecznik', 'Spowiedź', 'Sprawiedliwość', 'Starość', 'Strach', 'Strój', +'Stworzenie', 'Sumienie', 'Swaty', 'Syberia', 'Syn', 'Syn marnotrawny', 'Syzyf', 'Szaleniec', +'Szaleństwo', 'Szantaż', 'Szatan', 'Szczęście', 'Szkoła', 'Szlachcic', 'Szpieg', 'Sztuka', 'Ślub', +'Śmiech', 'Śmierć', 'Śmierć bohaterska', 'Śpiew', 'Światło', 'Świętoszek', 'Święty', 'Świt', +'Tajemnica', 'Taniec', 'Tchórzostwo', 'Teatr', 'Testament', 'Tęsknota', 'Theatrum mundi', 'Tłum', +'Trucizna', 'Trup', 'Twórczość', 'Uczeń', 'Uczta', 'Uroda', 'Umiarkowanie', 'Upadek', 'Upiór', +'Urzędnik', 'Vanitas', 'Walka', 'Walka klas', 'Wampir', 'Warszawa', 'Wąż', 'Wdowa', 'Wdowiec', +'Wesele', 'Wiatr', 'Wierność', 'Wierzenia', 'Wieś', 'Wiedza', 'Wieża Babel', 'Więzienie', 'Więzień', +'Wina', 'Wino', 'Wiosna', 'Wizja', 'Władza', 'Własność', 'Woda', 'Wojna', 'Wojna pokoleń', 'Wolność', +'Wróg', 'Wspomnienia', 'Współpraca', 'Wygnanie', 'Wyrzuty sumienia', 'Wyspa', 'Wzrok', 'Zabawa', +'Zabobony', 'Zamek', 'Zaręczyny', 'Zaświaty', 'Zazdrość', 'Zbawienie', 'Zbrodnia', 'Zbrodniarz', +'Zdrada', 'Zdrowie', 'Zemsta', 'Zesłaniec', 'Ziarno', 'Ziemia', 'Zima', 'Zło', 'Złodziej', 'Złoty wiek', +'Zmartwychwstanie', 'Zwątpienie', 'Zwierzęta', 'Zwycięstwo', 'Żałoba', 'Żebrak', 'Żołnierz', +'Żona', 'Życie jako wędrówka', 'Życie snem', 'Żyd', 'Żywioły', 'Oświadczyny'] + + // Teraz nieużywane function highlight(colour) { var range, sel; @@ -43,7 +94,7 @@ function gallery(element, url) { element.data('images', []); function changePage(pageNumber) { - $('img', element).attr('src', element.data('images')[pageNumber - 1]); + $('.gallery-image img', element).attr('src', element.data('images')[pageNumber - 1]); } function normalizeNumber(pageNumber) { @@ -79,7 +130,7 @@ function gallery(element, url) { }); - var image = $('img', element).attr('unselectable', 'on'); + var image = $('.gallery-image img', element).attr('unselectable', 'on'); var origin = {}; var imageOrigin = {}; var zoomFactor = 1; @@ -94,7 +145,7 @@ function gallery(element, url) { }); $('.change-gallery', element).click(function() { $('.chosen-gallery').val($('#document-meta .gallery').html() || '/platforma/gallery/'); - $('.gallery-image').animate({top: 53}, 200); + $('.gallery-image').animate({top: 60}, 200); $('.chosen-gallery').focus(); }); $('.change-gallery-ok', element).click(function() { @@ -103,13 +154,13 @@ function gallery(element, url) { } $('#document-meta .gallery').html($('.chosen-gallery').val()); updateGallery($('.chosen-gallery').val()); - $('.gallery-image').animate({top: 27}, 200); + $('.gallery-image').animate({top: 30}, 200); }); $('.change-gallery-cancel', element).click(function() { - $('.gallery-image').animate({top: 27}, 200); + $('.gallery-image').animate({top: 30}, 200); }); - $('img', element).load(function() { + $('.gallery-image img', element).load(function() { image.css({width: null, height: null}); imageDimensions = { width: $(this).width() * zoomFactor, @@ -121,7 +172,7 @@ function gallery(element, url) { }; if (!(imageDimensions.width && imageDimensions.height)) { - setTimeout(function() { $('img', element).load(); }, 100); + setTimeout(function() { $('.gallery-image img', element).load(); }, 100); } var position = normalizePosition( image.position().left, @@ -218,14 +269,14 @@ function gallery(element, url) { element.data('images', data); pn.val(1); pn.change(); - $('img', element).show(); + $('.gallery-image img', element).show(); }, error: function(data) { element.data('images', []); pn.val(1); pn.change(); - $('img', element).hide(); + $('.gallery-image img', element).hide(); } }); } @@ -236,41 +287,65 @@ function gallery(element, url) { } -function transform(editor) { - $.blockUI({message: 'Ładowanie...'}); +function transform(editor, callback) { + if (!callback) { + $.blockUI({message: 'Ładowanie...'}); + } setTimeout(function() { xml2html({ xml: editor.getCode(), success: function(element) { $('#html-view').html(element); $.unblockUI(); + if (callback) { + callback(); + } }, error: function(text) { - $('#html-view').html('

Wystąpił błąd:

' + text + '
'); + var message = $('
');
+				message.text(text);
+                $('#html-view').html('

Wystąpił błąd:

' + 
+				    message.html() + '
'); + $.unblockUI(); + if (callback) { + callback(); + } } }); }, 200); }; -function reverseTransform(editor, cont) { +function reverseTransform(editor, cont, errorCont, dontBlock) { var serializer = new XMLSerializer(); if ($('#html-view .error').length > 0) { + if (errorCont) { + errorCont(); + } return; } - $.blockUI({message: 'Ładowanie...'}); + if (!dontBlock) { + $.blockUI({message: 'Ładowanie...'}); + } setTimeout(function() { - html2xml({ - xml: serializer.serializeToString($('#html-view div').get(0)), + html2text({ + element: $('#html-view div').get(0), success: function(text) { editor.setCode(text); - $.unblockUI(); + if (!dontBlock) { + $.unblockUI(); + } if (cont) { cont(); } }, error: function(text) { $('#source-editor').html('

Wystąpił błąd:

' + text + '
'); - $.unblockUI(); + if (!dontBlock) { + $.unblockUI(); + } + if (errorCont) { + errorCont(); + } } }); }, 200); @@ -308,8 +383,6 @@ function html(element) { return false; } - console.log('Selection point:', node); - node = $(node); var xtype = node.attr('x-node'); @@ -317,10 +390,6 @@ function html(element) { xtype == 'motyw' || xtype == 'begin' || xtype == 'end') { return false; } - - // this is hopefully redundant - //if(! node.is('*.utwor *') ) - // return false; // don't allow themes inside annotations if( node.is('*[x-annotation-box] *') ) @@ -328,13 +397,29 @@ function html(element) { return true; } + + var ANNOT_ALLOWED = ['wyroznienie']; + + function html2plainText(fragment) { + var text = ""; + + $(fragment.childNodes).each(function() { + if(this.nodeType == 3) // textNode + text += this.nodeValue; + else if (this.nodeType == 1 + && $.inArray($(this).attr('x-node'), ANNOT_ALLOWED) != -1 ){ + text += html2plainText(this); + } + }); + + return text; + } function addAnnotation() { var selection = window.getSelection(); var n = selection.rangeCount; - console.log("Range count:", n); if (n == 0) { window.alert("Nie zaznaczono żadnego obszaru"); return false; @@ -354,15 +439,20 @@ function html(element) { return false; } - var text = range.toString(); + // BUG #273 - selected text can contain themes, which should be omited from + // defining term + var text = html2plainText( range.cloneContents() ); + var tag = $(''); range.collapse(false); range.insertNode(tag[0]); xml2html({ - xml: ''+text+'', + xml: ''+text+' --- ', success: function(text) { - tag.replaceWith(text); + var t = $(text); + tag.replaceWith(t); + openForEdit(t); }, error: function() { tag.remove(); @@ -370,13 +460,12 @@ function html(element) { } }) } - + function addTheme() { var selection = window.getSelection(); var n = selection.rangeCount; - console.log("Range count:", n); if(n == 0) { window.alert("Nie zaznaczono żadnego obszaru"); return false; @@ -384,13 +473,20 @@ function html(element) { // for now allow only 1 range if(n > 1) { - window.alert("Zaznacz jeden obszar"); + window.alert("Zaznacz jeden obszar."); return false; } + // remember the selected range var range = selection.getRangeAt(0); - console.log(range.startContainer, range.startOffset, range.endContainer, range.endOffset); + + + if( $(range.startContainer).is('.html-editarea') + || $(range.endContainer).is('.html-editarea') ) { + window.alert("Motywy można oznaczać tylko na tekście nie otwartym do edycji. \n Zamknij edytowany fragment i spróbuj ponownie."); + return false; + } // verify if the start/end points make even sense - // they must be inside a x-node (otherwise they will be discarded) @@ -415,9 +511,6 @@ function html(element) { spoint.setStart(range.startContainer, range.startOffset); epoint.setStart(range.endContainer, range.endOffset); - console.log('spoint', spoint.startContainer, spoint.startOffset, spoint.endContainer, spoint.endOffset); - console.log('epoint', epoint.startContainer, epoint.startOffset, epoint.endContainer, epoint.endOffset); - var mtag, btag, etag, errors; // insert theme-ref @@ -429,8 +522,8 @@ function html(element) { epoint.insertNode(etag[0]); etag.replaceWith(text); xml2html({ - xml: 'motyw', - success: function(text) { + xml: '', + success: function(text) { mtag = $(''); spoint.insertNode(mtag[0]); mtag.replaceWith(text); @@ -441,6 +534,7 @@ function html(element) { spoint.insertNode(btag[0]) btag.replaceWith(text); selection.removeAllRanges(); + openForEdit($('.motyw[theme-class=' + id + ']')); } }); } @@ -456,7 +550,6 @@ function html(element) { // annotations overlay their sub box - not their own box // if($origin.is(".annotation-inline-box")) { $box = $("*[x-annotation-box]", $origin); - console.log('annotation!', $box); } else { $box = $origin; } @@ -466,40 +559,64 @@ function html(element) { var w = $box.outerWidth(); var h = $box.innerHeight(); - console.log('width:', w, 'height:', h); - + if ($origin.is(".annotation-inline-box")) { + w = Math.max(w, 400); + h = Math.max(h, 60); + } + // start edition on this node - var $overlay = $('
').css({ + var $overlay = $('
').css({ position: 'absolute', height: h, left: x, top: y, width: w - // right: 0 - }).appendTo($box[0].offsetParent || element).show(); + }).appendTo($box[0].offsetParent || $box.parent()).show(); + + if ($origin.is('.motyw')) { + $('textarea', $overlay).autocomplete(THEMES, { + autoFill: true, + multiple: true, + selectFirst: true + }); + } + + $('.delete-button', $overlay).click(function() { + if ($origin.is('.motyw')) { + $('[theme-class=' + $origin.attr('theme-class') + ']').remove(); + } else { + $origin.remove(); + } + $overlay.remove(); + $(document).unbind('click.blur-overlay'); + return false; + }) - console.log($overlay, $box[0].offsetParent || element); var serializer = new XMLSerializer(); - - console.log($box.html()); - html2xml({ - xml: serializer.serializeToString($box[0]), - inner: true, + + html2text({ + element: $box[0], + stripOuter: true, success: function(text) { $('textarea', $overlay).val($.trim(text)); - console.log($.trim(text)); setTimeout(function() { - $('textarea', $overlay).focus(); - }, 100); + $('textarea', $overlay).elastic().focus(); + }, 50); - $('textarea', $overlay).one('blur', function(event) { + function save(argument) { var nodeName = $box.attr('x-node') || 'pe'; + var insertedText = $('textarea', $overlay).val(); + + if ($origin.is('.motyw')) { + insertedText = insertedText.replace(/,\s*$/, ''); + } + xml2html({ - xml: '<' + nodeName + '>' + $('textarea', $overlay).val() + '', + xml: '<' + nodeName + '>' + insertedText + '', success: function(element) { - $box.html($(element).html()); + $origin.html($(element).html()); $overlay.remove(); }, error: function(text) { @@ -507,7 +624,21 @@ function html(element) { alert('Błąd! ' + text); } }) + } + + $('.accept-button', $overlay).click(function() { + save(); }); + + $(document).bind('click.blur-overlay', function(event) { + if ($(event.target).parents('.html-editarea').length > 0) { + return; + } + save(); + + $(document).unbind('click.blur-overlay'); + }); + }, error: function(text) { alert('Błąd! ' + text); } @@ -519,6 +650,8 @@ function html(element) { openForEdit($(this).parent()); }); + + var button = $(''); $(element).bind('mousemove', function(event) { var editable = $(event.target).closest('*[x-editable]'); @@ -526,6 +659,13 @@ function html(element) { if (!editable.hasClass('active')) { editable.addClass('active').append(button); } + if (editable.is('.annotation-inline-box')) { + $('*[x-annotation-box]', editable) + .css({position: 'absolute', left: event.clientX - editable.offset().left + 5, top: event.clientY - editable.offset().top + 5}) + .show(); + } else { + $('*[x-annotation-box]').hide(); + } }); $('.motyw').live('click', function() { @@ -543,6 +683,78 @@ function html(element) { }); } +/* + * History + */ + +function refreshHistory(callback){ + $.blockUI({ + message: 'Odświeżanie historii...' + }); + + $.ajax({ + url: document.location.href + '/history', + dataType: 'json', + error: function() { + $('#history-view .message-box').html('Nie udało się odświeżyć historii').show(); + $.unblockUI(); + }, + success: function(data) { + $('#history-view .message-box').hide(); + var changes_list = $('#changes-list'); + changes_list.html(''); + + $.each(data, function() { + var val = this[0]; + changes_list.append('' + +'' + + '' + +''+ this[0]+'' + +''+ this[3]+'' + +''+ this[2]+'' + +''+ this[1]+'') + }); + $.unblockUI(); + callback(); + } + }); +}; + +function historyDiff(callback) { + var changelist = $('#changes-list'); + var rev_a = $("input[name='rev_from']:checked", changelist); + var rev_b = $("input[name='rev_to']:checked", changelist); + + if (rev_a.length != 1 || rev_b.length != 1) { + window.alert("Musisz zaznaczyć dwie wersje do porównania."); + return false; + } + + if (rev_a.val() == rev_b.val()) { + window.alert("Musisz zaznaczyć dwie różne wersje do porównania."); + return false; + } + + $.blockUI({ + message: 'Wczytywanie porównania...' + }); + + $.ajax({ + url: document.location.href + '/diff/'+rev_a.val() + '/'+ rev_b.val(), + dataType: 'html', + error: function() { + $.unblockUI(); + window.alert('Nie udało się wykonać porównania :(.') + }, + success: function(data) { + $.unblockUI(); + var diffview = $('#diff-view'); + diffview.html(data); + diffview.show(); + } + }); +} + $(function() { gallery('#sidebar', $('#document-meta .gallery').html()); @@ -555,8 +767,10 @@ $(function() { parserConfig: { useHTMLKludges: false }, - iframeClass: 'xml-iframe', + iframeClass: 'xml-iframe', textWrapping: true, + lineNumbers: true, + width: "100%", tabMode: 'spaces', indentUnit: 0, initCallback: function(editor) { @@ -579,12 +793,10 @@ $(function() { name: $('#document-name').html(), text: metaComment + editor.getCode(), revision: $('#document-revision').html(), - author: 'annonymous', + author: $('#username').html() || 'annonymous', comment: $('#komentarz').val() }; - console.log(data); - $.ajax({ url: document.location.href, type: "POST", @@ -595,7 +807,6 @@ $(function() { editor.setCode(data.text); $('#document-revision').html(data.revision); } else { - console.log(data.errors); alert(data.errors); } $.unblockUI(); @@ -606,7 +817,7 @@ $(function() { }) } - if ('#simple-view-tab.active') { + if ($('#simple-view-tab').hasClass('active')) { reverseTransform(editor, doSave); } else { doSave(); @@ -616,36 +827,39 @@ $(function() { $('#save-cancel').click(function() { $.unblockUI(); }); - - $('#simple-view-tab').click(function() { - if ($(this).hasClass('active')) { - return; - } - $(this).addClass('active'); - $('#source-view-tab').removeClass('active'); - $('#source-editor').hide(); - $('#simple-editor').show(); - transform(editor); - }); - - $('#source-view-tab').click(function() { - if ($(this).hasClass('active')) { - return; - } - $(this).addClass('active'); - $('#simple-view-tab').removeClass('active'); - $('#simple-editor').hide(); - $('#source-editor').show(); - reverseTransform(editor); + + var tabs = $('ol#tabs li'); + + tabs.click(function(event, callback) { + tabs.removeClass('active'); + $('.editor').hide(); + $(this).addClass('active'); + $('#' + $(this).attr('ui:related')).show(); + $(this).trigger('wl:tabload', callback); + }); + + + $('#simple-view-tab').bind('wl:tabload', function(event, callback) { + transform(editor, callback); }); + + $('#source-view-tab').bind('wl:tabload', function(event, callback) { + reverseTransform(editor, callback); + }); + + $('#history-view-tab').bind('wl:tabload', function(event, callback) { + refreshHistory(callback); + }); + + $('#make-diff-button').click(historyDiff); $('#source-editor .toolbar button').click(function(event) { event.preventDefault(); var params = eval("(" + $(this).attr('ui:action-params') + ")"); scriptletCenter.scriptlets[$(this).attr('ui:action')](editor, params); - }); + }); - $('.toolbar select').change(function() { + $('.toolbar select').change(function(event) { var slug = $(this).val(); $('.toolbar-buttons-container').hide().filter('[data-group=' + slug + ']').show(); @@ -655,7 +869,12 @@ $(function() { $('.toolbar-buttons-container').hide(); $('.toolbar select').change(); - $('#simple-view-tab').click(); + + $('#simple-view-tab').trigger('click', + function() { + $('#loading-overlay').fadeOut(); + return false; + }); } });