--- /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('<a href="oid://' + e.data.oid + '">' + e.data.title + '</a>');
+ }
+ });
+ }
+ })
+ });
+
+ // 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: '<i class="text-danger fa fa-2x fa-bell shake animated"></i> ' + 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('<div class="hidden-mask"></div>');
+ }
+ }
+ },
+
+ /**
+ * 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('<h1 class="loading"><i class="fa fa-2x fa-gear fa-spin"></i></h1>');
+ 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() {
+ $('<option></option>').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);