diff -r abd11be23718 -r ea0c7ac589c4 src/pyams_content/zmi/resources/js/pyams_content.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_content/zmi/resources/js/pyams_content.js Thu Nov 08 10:50:52 2018 +0100 @@ -0,0 +1,665 @@ +(function($, globals) { + + "use strict"; + + var MyAMS = globals.MyAMS; + + var PyAMS_content = { + + /** + * Custom widgets management + */ + widget: { + + /** Treeview widget */ + treeview: { + + selectFolder: function(event, node) { + var target = $(event.target); + target.siblings('input[type="hidden"]').val(node.id); + }, + + unselectFolder: function(event, node) { + var target = $(event.target); + target.siblings('input[type="hidden"]').val(null); + } + } + }, + + /** + * TinyMCE editor configuration + */ + TinyMCE: { + + initEditor: function(settings) { + + // Update TinyMCE translations + tinyMCE.addI18n('fr', { + "Link list": "Liste de liens", + "Toggle h3 header": "En-tête H3", + "Toggle h4 header": "En-tête H4", + "Insert internal link": "Insérer un lien interne", + "Link title": "Texte à afficher", + "Internal number": "N° interne" + }); + + // Declare internal link input plug-in + tinymce.PluginManager.add('internal_links', function(editor, url) { + editor.addButton('internal_links', { + icon: 'cloud-check', + tooltip: "Insert internal link", + image: '/--static--/pyams_content/img/internal-link.png', + onclick: function() { + editor.windowManager.open({ + title: "Insert internal link", + body: [ + { + type: 'textbox', + name: 'oid', + label:'Internal number' + }, { + type: 'textbox', + name: 'title', + label: 'Link title', + value: editor.selection.getContent() + } + ], + onsubmit: function(e) { + editor.insertContent('' + e.data.title + ''); + } + }); + } + }) + }); + + // Declare direct H3 and H4 style formatter + tinyMCE.PluginManager.add('headers', function (editor, url) { + ['h3', 'h4'].forEach(function (name) { + editor.addButton("header-" + name, { + tooltip: "Toggle " + name + " header", + text: name.toUpperCase(), + onClick: function () { + editor.execCommand('mceToggleFormat', false, name); + }, + onPostRender: function () { + var self = this, + setup = function () { + editor.formatter.formatChanged(name, function (state) { + self.active(state); + }); + }; + editor.formatter ? setup() : editor.on('init', setup); + } + }) + }); + }); + + // Update TinyMCE settings + settings.image_list = PyAMS_content.TinyMCE.getImagesList; + settings.link_list = PyAMS_content.TinyMCE.getLinksList; + settings.style_formats = [ + { + title: 'Inline', + items: [ + {title: 'Bold', icon: 'bold', format: 'bold'}, + {title: 'Italic', icon: 'italic', format: 'italic'}, + {title: 'Underline', icon: 'underline', format: 'underline'}, + {title: 'Strikethrough', icon: 'strikethrough', format: 'strikethrough'}, + {title: 'Superscript', icon: 'superscript', format: 'superscript'}, + {title: 'Subscript', icon: 'subscript', format: 'subscript'}, + {title: 'Code', icon: 'code', format: 'code'} + ] + }, + { + title: 'Blocks', + items: [ + {title: 'Paragraph', format: 'p'}, + {title: 'Blockquote', format: 'blockquote'}, + {title: 'Div', format: 'div'}, + {title: 'Pre', format: 'pre'} + ] + }, + { + title: 'Alignment', + items: [ + {title: 'Left', icon: 'alignleft', format: 'alignleft'}, + {title: 'Center', icon: 'aligncenter', format: 'aligncenter'}, + {title: 'Right', icon: 'alignright', format: 'alignright'}, + {title: 'Justify', icon: 'alignjustify', format: 'alignjustify'} + ] + } + ]; + settings.plugins += ' internal_links headers'; + if (settings.toolbar1) { + settings.toolbar1 = "undo redo | header-h3 header-h4 styleselect | bold italic | " + + "alignleft aligncenter alignright alignjustify | bullist numlist outdent indent"; + } + if (settings.toolbar2) { + settings.toolbar2 = "forecolor backcolor | charmap internal_links link | fullscreen preview print | code"; + } + return settings; + }, + + getImagesList: function(callback) { + var form = $(document.activeElement).parents('form'); + if (form.exists()) { + var base = form.attr('data-ams-form-handler') || form.attr('action'); + var target = base.substr(0, base.lastIndexOf('/') + 1); + return MyAMS.ajax.post(target + 'get-images-list.json', {}, callback); + } + }, + + getLinksList: function(callback) { + var form = $(document.activeElement).parents('form'); + if (form.exists()) { + var base = form.attr('data-ams-form-handler') || form.attr('action'); + var target = base.substr(0, base.lastIndexOf('/')+1); + return MyAMS.ajax.post(target + 'get-links-list.json', {}, callback); + } + } + }, + + /** + * Galleries management + */ + galleries: { + + addMediaCallback: function(options) { + var gallery = $('.gallery', $('[id="' + options.parent + '"]')); + var switcher = gallery.siblings('.switcher'); + if (switcher.parents('fieldset:first').hasClass('switched')) { + switcher.click(); + } + for (var i=0; i < options.medias.length; i++) { + gallery.append(options.medias[i]); + } + gallery.sortable({ + helper: 'clone', + stop: PyAMS_content.galleries.setOrder + }) + }, + + updateMediaTitle: function(options) { + $('img[id="' + options.media_id + '"]').attr('original-title', options.title); + }, + + switchMediaVisibility: function(element) { + return function() { + var source = $(this); + var media = source.parents('.media'); + var gallery = media.parents('.gallery'); + $('i', source).attr('class', 'fa fa-fw fa-spinner fa-pulse'); + MyAMS.ajax.post(gallery.data('ams-location') + '/set-media-visibility.json', + {object_name: media.data('ams-element-name')}, + function(result, status) { + if (result.visible) { + $('i', source).attr('class', 'fa fa-fw fa-eye'); + source.parents('.btn-group').siblings('a.fancyimg').removeClass('not-visible'); + } else { + $('i', source).attr('class', 'fa fa-fw fa-eye-slash text-danger'); + source.parents('.btn-group').siblings('a.fancyimg').addClass('not-visible'); + } + }); + }; + }, + + setOrder: function(event, ui) { + if (ui && ui.item.hasClass('already-dropped')) { + return; + } + var gallery = ui.item.parents('.gallery'); + var ids = $('.media', gallery).listattr('data-ams-element-name'); + MyAMS.ajax.post(gallery.data('ams-location') + '/set-medias-order.json', + {medias: JSON.stringify(ids)}); + }, + + removeMedia: function(element) { + return function() { + var link = $(this); + MyAMS.skin.bigBox({ + title: MyAMS.i18n.WARNING, + content: '  ' + MyAMS.i18n.DELETE_WARNING, + buttons: MyAMS.i18n.BTN_OK_CANCEL + }, function(button) { + if (button === MyAMS.i18n.BTN_OK) { + var gallery = link.parents('.gallery'); + var location = gallery.data('ams-location'); + var media = link.parents('.media'); + var object_name = media.data('ams-element-name'); + MyAMS.ajax.post(location + '/delete-element.json', + {object_name: object_name}, + function(result, status) { + media.remove(); + if (result.handle_json) { + MyAMS.ajax.handleJSON(result); + } + }); + } + }); + }; + }, + + afterFancyboxLoad: function(current, previous) { + var element = current.element; + if (element.hasClass('not-visible')) { + current.inner.prepend('
'); + } + } + }, + + /** + * Illustrations management + */ + illustration: { + + addIllustration: function() { + var source = $(this); + var group = source.parents('.btn-group'); + var legend = group.siblings('legend.switcher'); + $('i.fa-plus', legend).click(); + source.hide(); + $('input[type="file"]', legend.siblings('.form-group:first')).click(); + } + }, + + /** + * Paragraphs management + */ + paragraphs: { + + /* Store and restore paragraphs state on reload */ + preReload: function() { + PyAMS_content.paragraphs.switched = $('i.switch.fa-minus-square-o', '#paragraphs_list').parents('tr').listattr('id'); + }, + + postReload: function() { + $(PyAMS_content.paragraphs.switched).each(function() { + $('i.switch.fa-plus-square-o', '[id="' + this + '"]').parents('div').first().click(); + }); + delete PyAMS_content.paragraphs.switched; + }, + + refreshParagraph: function(changes) { + var para = $('tr[id="' + changes.object_id + '"]'); + $('span.title', para).html(changes.title || ' - - - - - - - -'); + }, + + switchEditor: function(element) { + var source = $(this); + var switcher = $('i.switch', source); + var td = source.parents('td'); + var editor = $('.editor', td); + var para = source.parents('tr'); + if (switcher.hasClass('fa-plus-square-o')) { + var container = para.parents('table'); + editor.html('

'); + MyAMS.ajax.post(container.data('ams-location') + '/get-paragraph-editor.json', + {object_name: para.data('ams-element-name')}, + function(result) { + editor.html(result); + if (result) { + MyAMS.initContent(editor); + switcher.removeClass('fa-plus-square-o') + .addClass('fa-minus-square-o'); + para.data('ams-disabled-handlers', true); + MyAMS.skin.scrollTo(editor, { + offset: editor.height() - para.height() + }); + } + }); + } else { + MyAMS.skin.cleanContainer(editor); + editor.empty(); + switcher.removeClass('fa-minus-square-o') + .addClass('fa-plus-square-o'); + para.removeData('ams-disabled-handlers'); + } + }, + + switchLastEditor: function(table_id) { + var table = $('table[id="' + table_id + '"]'); + var tr = $('tr:last', table); + $('[data-ams-click-handler="PyAMS_content.paragraphs.switchEditor"]', tr).click(); + }, + + switchAllEditors: function(element) { + var source = $(this); + var switcher = $('i', source); + var container = source.parents('table'); + if (switcher.hasClass('fa-plus-square-o')) { + switcher.removeClass('fa-plus-square-o') + .addClass('fa-cog fa-spin'); + MyAMS.ajax.post(container.data('ams-location') + '/get-paragraphs-editors.json', + {}, + function(result) { + for (var para_id in result) { + if (!result.hasOwnProperty(para_id)) { + continue; + } + var para = $('tr[data-ams-element-name="' + para_id + '"]', container); + var editor = $('.editor', para); + if (editor.is(':empty')) { + editor.html(result[para_id]); + } + $('.fa-plus-square-o', para).removeClass('fa-plus-square-o') + .addClass('fa-minus-square-o'); + para.data('ams-disabled-handlers', true); + } + if (!$('i.fa-plus-square-o', $('tbody', container)).exists()) { + switcher.removeClass('fa-cog fa-spin') + .addClass('fa-minus-square-o'); + } + MyAMS.initContent(container); + }); + } else { + $('.editor', container).each(function() { + MyAMS.skin.cleanContainer($(this)); + $(this).empty(); + }); + $('.fa-minus-square-o', container).removeClass('fa-minus-square-o') + .addClass('fa-plus-square-o'); + $('tr', container).removeData('ams-disabled-handlers'); + } + }, + + updateToolbar: function(settings) { + var para = $('tr[id="' + settings.object_id + '"]'); + var toolbar = $('.title-toolbar', para); + toolbar.replaceWith(settings.toolbar_tag); + toolbar = $('.title-toolbar', para); + MyAMS.initContent(toolbar); + }, + + updateMarkers: function(settings) { + var para = $('tr[id="' + settings.object_id + '"]'); + var toolbar = $('.title-toolbar', para); + var marker = $('DIV.action.' + settings.marker_type, toolbar); + if (marker.exists()) { + marker.replaceWith(settings.marker_tag); + } else { + $(settings.marker_tag).appendTo(toolbar); + } + if (settings.marker_tag) { + marker = $('DIV.action.' + settings.marker_type, toolbar); + MyAMS.initContent(marker); + } + MyAMS.helpers.sort(toolbar, 'weight'); + } + }, + + /** + * Pictograms management + */ + pictograms: { + + initManagerSelection: function() { + var form = $(this); + var selected = $('input[type="hidden"]', $('.selected-pictograms', form)).listattr('value'); + return { + selected: JSON.stringify(selected) + }; + }, + + switchPictogram: function() { + var pictogram = $(this); + var parent = pictogram.parents('.pictograms'); + var manager = parent.parents('.pictograms-manager'); + if (parent.hasClass('available-pictograms')) { + $('.selected-pictograms', manager).append(pictogram); + } else { + $('.available-pictograms', manager).append(pictogram); + } + } + }, + + /** + * Themes management + */ + themes: { + + initExtracts: function(element) { + var thesaurus = $('select[name="manager_themes.widgets.thesaurus_name:list"]', element); + var thesaurus_name = thesaurus.val(); + var extract = $('select[name="manager_themes.widgets.extract_name:list"]', element); + var extract_name = extract.val(); + if (thesaurus_name) { + MyAMS.jsonrpc.post('getExtracts', + {thesaurus_name: thesaurus_name}, + {url: '/api/thesaurus/json'}, + function(data) { + extract.empty(); + $(data.result).each(function() { + $('').attr('value', this.id) + .attr('selected', this.id === extract_name) + .text(this.text) + .appendTo(extract); + }); + }); + } + }, + + getExtracts: function(event) { + var select = $(event.currentTarget); + var form = select.parents('form'); + var thesaurus_name = $('select[name="manager_themes.widgets.thesaurus_name:list"]', form).val(); + var extract = $('select[name="manager_themes.widgets.extract_name:list"]', form); + var plugin = extract.data('select2'); + if (thesaurus_name && (thesaurus_name !== '--NOVALUE--')) { + MyAMS.jsonrpc.post('getExtracts', + {thesaurus_name: thesaurus_name}, + {url: '/api/thesaurus/json'}, + function(data) { + plugin.results.empty(); + plugin.opts.populateResults.call(plugin, plugin.results, data.result, + {term: ''}); + }); + } else { + extract.select2('data', null); + plugin.results.empty(); + plugin.opts.populateResults.call(plugin, plugin.results, [], {term: ''}); + } + } + }, + + /** + * Form fields management + */ + fields: { + + refreshField: function(changes) { + var container = $('table[id="form_fields_list"]'); + var para = $('tr[data-ams-element-name="' + changes.object_name + '"]', container); + $('td:nth-child(4)', para).html(changes.title); + } + }, + + /** + * Image map management + */ + imgmap: { + + init: function() { + var image = $(this); + MyAMS.ajax.check($.fn.canvasAreaDraw, + '/--static--/pyams_content/js/jquery-canvasAreaDraw' + MyAMS.devext + '.js', + function() { + image.canvasAreaDraw({imageUrl: image.data('ams-image-url')}); + }); + }, + + initPreview: function() { + var image = $(this); + MyAMS.ajax.check($.fn.mapster, + '/--static--/pyams_content/js/jquery-imagemapster-1.2.10' + MyAMS.devext + '.js', + function() { + image.mapster({ + fillColor: 'ff0000', + fillOpacity: 0.35, + selected: true, + highlight: true, + staticState: true + }); + }); + } + }, + + /** + * Site management + */ + site: { + + switchVisibility: function() { + return function() { + var source = $(this); + var content = source.parents('tr').first(); + MyAMS.ajax.post(content.data('ams-location') + '/switch-content-visibility.json', + {object_name: content.data('ams-element-name')}, + function(result, status) { + var klass = 'fa-eye'; + if (!result.visible) { + klass += '-slash'; + } + if (!result.published) { + klass += ' text-danger'; + } + $('i', source).attr('class', 'fa fa-fw ' + klass); + }); + }; + } + }, + + /** + * Review comments management + */ + review: { + + timer: null, + timer_duration: { + general: 30000, + chat: 5000 + }, + + initComments: function(element) { + var chat = $('.chat-body', element); + chat.animate({scrollTop: chat[0].scrollHeight}, 1000); + clearInterval(PyAMS_content.review.timer); + PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments, + PyAMS_content.review.timer_duration.chat); + MyAMS.skin.registerCleanCallback(PyAMS_content.review.cleanCommentsCallback); + }, + + cleanCommentsCallback: function() { + clearInterval(PyAMS_content.review.timer); + PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments, + PyAMS_content.review.timer_duration.general); + }, + + updateComments: function() { + var badge = $('.badge', 'nav a[href="#review-comments.html"]'), + count; + var chat = $('.chat-body', '.widget-body'); + if (chat.exists()) { + count = $('.message', chat).length; + } else { + count = parseInt(badge.text()); + } + MyAMS.ajax.post('get-last-review-comments.json', {count: count}, function(result) { + if (chat.exists()) { + badge.removeClass('bg-color-danger') + .addClass('bg-color-info'); + } + if (count !== result.count) { + badge.text(result.count).removeClass('hidden'); + if (chat.exists()) { + $('.messages', chat).append(result.content); + chat.animate({scrollTop: chat[0].scrollHeight}, 1000); + } + if (!chat.exists()) { + badge.removeClass('bg-color-info') + .addClass('bg-color-danger') + .animate({'padding': '3px 12px 2px', + 'margin-right': '9px'}, 'slow', function() { + $(this).animate({'padding': '3px 6px 2px', + 'margin-right': '15px'}, 'slow'); + }); + } + } + }); + }, + + initCommentData: function(veto) { + var chat = $('.chat-body', '.widget-body'); + return {count: $('.message', chat).length}; + }, + + addCommentAction: function() { + return function() { + $('textarea[name="comment"]').focus(); + }; + }, + + addCommentCallback: function(options) { + var form = $(this); + var widget = form.parents('.widget-body'); + $('.messages', widget).append(options.content); + $('textarea[name="comment"]', form).val(''); + var chat = $('.chat-body', widget); + chat.animate({scrollTop: chat[0].scrollHeight}, 1000); + $('.badge', 'nav a[href="#review-comments.html"]').text(options.count).removeClass('hidden'); + } + }, + + /** + * Header management + */ + header: { + + submitEditForm: function() { + var form = $(this).parents('form').first(); + MyAMS.form.submit(form, {form_data: {'autosubmit': true}}); + } + }, + + /** + * Footer management + */ + footer: { + + submitEditForm: function() { + var form = $(this).parents('form').first(); + MyAMS.form.submit(form, {form_data: {'autosubmit': true}}); + } + }, + + /** + * User profile management + */ + profile: { + + switchFavorite: function() { + var star = $(this); + var oid = star.data('sequence-oid'); + MyAMS.ajax.post('switch-user-favorite.json', + {oid: oid}, + function(result, status) { + if (result.favorite) { + star.removeClass('fa-star-o') + .addClass('fa-star'); + } else { + star.removeClass('fa-star') + .addClass('fa-star-o'); + } + }); + } + } + }; + + var badge = $('.badge', 'nav a[href="#review-comments.html"]'); + if (badge.exists()) { + PyAMS_content.review.timer = setInterval(PyAMS_content.review.updateComments, + PyAMS_content.review.timer_duration.general); + } + + globals.PyAMS_content = PyAMS_content; + +})(jQuery, this);