src/pyams_thesaurus/zmi/resources/js/pyams_thesaurus.js
changeset 0 47700a43ef3f
child 2 de33539c2db2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_thesaurus/zmi/resources/js/pyams_thesaurus.js	Tue Apr 14 17:52:05 2015 +0200
@@ -0,0 +1,195 @@
+(function($) {
+
+	PyAMS_thesaurus = {
+
+		tree: {
+
+			/**
+			 * Display term sub-nodes
+			 */
+			displaySubNodes: function(term, nodes, source) {
+				if (source === undefined)
+					source = $('span.term:withtext("' + term + '")').siblings('i[data-ams-click-handler]');
+				var group = source.parents('span.label').siblings('ul.group');
+				var parent = group.closest('ul.group').closest('li');
+				group.empty();
+				for (var index in nodes) {
+					var node = nodes[index];
+					var li = $('<li></li>');
+					node.extracts.reverse();
+					for (var ext_index in node.extracts) {
+						var extract = node.extracts[ext_index];
+						var div = $('<div></div>').addClass('pull-right margin-right-2')
+												  .appendTo(li);
+						var square = $('<i></i>').attr('data-ams-extract-name', extract.name)
+												 .addClass('fa fa-fw fa-square extract-checker')
+												 .css('color', '#' + extract.color)
+												 .appendTo(div);
+						var parent_checker = $('>div i.extract-checker[data-ams-extract-name="' + extract.name + '"]', parent);
+						if (parent_checker.hasClass('used')) {
+							if (extract.used) {
+								square.addClass('used');
+							} else {
+								square.removeClass('fa-square')
+									.addClass('fa-square-o');
+							}
+							var switcher = $('i.switcher', 'table.extracts tr[data-ams-element-name="' + extract.name + '"]');
+							if (!switcher.hasClass('fa-eye')) {
+								square.css('visibility', 'hidden');
+							}
+						} else {
+							square.addClass('disabled')
+								  .css('color', 'silver');
+						}
+					}
+					var span = $('<span></span>').addClass('label label-success')
+												 .addClass(node.css_class)
+												 .attr('data-ams-url', node.view)
+												 .attr('data-toggle', 'modal');
+					if (node.expand)
+						$('<i></i>').addClass('fa fa-lg fa-plus-circle')
+									.attr('data-ams-click-handler', 'PyAMS_thesaurus.tree.expand')
+									.attr('data-ams-stop-propagation', true)
+									.appendTo(span);
+					$('<span></span>').addClass('term')
+									  .html(node.label)
+									  .appendTo(span);
+					span.appendTo(li);
+					$('<ul></ul>').addClass('hidden group')
+								  .appendTo(li);
+					li.appendTo(group);
+					if (node.subnodes)
+						PyAMS_thesaurus.tree.displaySubNodes(node.label, node.subnodes);
+				}
+				group.removeClass('hidden');
+				source.removeClass('fa-gear')
+					  .addClass('fa-minus-circle');
+			},
+
+			/**
+			 * Expand thesaurus node
+			 */
+			expand: function() {
+				var source = $(this);
+				if (source.hasClass('fa-plus-circle')) {
+					source.removeClass('fa-plus-circle')
+						  .addClass('fa-gear');
+					var label = source.siblings('span.term').text();
+					var context = source.closest('div.tree').data('ams-tree-context');
+					MyAMS.ajax.post(context + '/get-nodes.json', {term: label}, function(data) {
+						PyAMS_thesaurus.tree.displaySubNodes(label, data.nodes, source);
+					});
+				} else {
+					PyAMS_thesaurus.tree.collapse.call(this);
+				}
+			},
+
+			/**
+			 * Collapse thesaurus node
+			 */
+			collapse: function() {
+				var source = $(this);
+				source.parents('span.label').siblings('ul.group').addClass('hidden');
+				source.removeClass('fa-minus-circle')
+					  .addClass('fa-plus-circle');
+			},
+
+			/**
+			 * Update term label or status
+			 */
+			updateTerm: function(options) {
+				var element = $('span.term:withtext("' + options.term + '")').siblings('i[data-ams-click-handler]');
+				if (element.hasClass('fa-minus-circle'))
+					PyAMS_thesaurus.tree.collapse.call(element);
+				PyAMS_thesaurus.tree.expand.call(element);
+			},
+
+			/**
+			 * Find ans display term in thesaurus tree
+			 */
+			findTerm: function(options) {
+				MyAMS.ajax.post('get-parent-nodes.json', {term: options.term}, function(data) {
+					PyAMS_thesaurus.tree.displaySubNodes(data.parent, data.nodes);
+					var element = $('span.term:withtext("' + data.term + '")').parents('span.label');
+					$('html,body').animate({scrollTop: element.offset().top - 100}, 1000);
+					element.css('background-color', 'darkgreen')
+						   .on('mouseover', function() {
+								$(this).css('background-color', '');
+						   })
+				});
+			},
+
+			/**
+			 * Extract display switcher
+			 *
+			 * This function is called via HREF reference so only returns a function
+			 * which will actually do the job...
+			 */
+			switchExtract: function() {
+				return function() {
+					var switcher = $('i.fa', $(this));
+					var extract = switcher.parents('tr:first').data('ams-element-name');
+					if (switcher.hasClass('fa-eye-slash'))
+						PyAMS_thesaurus.tree.showExtract.call(this, extract, switcher);
+					else
+						PyAMS_thesaurus.tree.hideExtract.call(this, extract, switcher);
+				}
+			},
+
+			/**
+			 * Show extract
+			 */
+			showExtract: function(extract, switcher) {
+				$('i.extract-checker[data-ams-extract-name="' + extract + '"]').css('visibility', '');
+				switcher.removeClass('fa-eye-slash')
+						.removeClass('text-danger')
+						.addClass('fa-eye');
+			},
+
+			/**
+			 * Hide extract
+			 */
+			hideExtract: function(extract, switcher) {
+				$('i.extract-checker[data-ams-extract-name="' + extract + '"]').css('visibility', 'hidden');
+				switcher.removeClass('fa-eye')
+						.addClass('fa-eye-slash')
+						.addClass('text-danger');
+			}
+		},
+
+
+		/**
+		 * Search terms in tree
+		 */
+		search: function() {
+			var label = $(this).val();
+			PyAMS_thesaurus.tree.findTerm({term: label});
+		}
+	};
+
+	$(document).on('click', 'i.extract-checker', function(e) {
+		var checker = $(this);
+		if (checker.hasClass('disabled'))
+			return;
+		var term = $('span.term', checker.closest('div').siblings('span'));
+		MyAMS.ajax.post('switch-extract.json', {term: term.text(),
+												extract: checker.data('ams-extract-name')}, function(data) {
+			if (data.used) {
+				checker.removeClass('fa-square-o')
+					   .addClass('fa-square used');
+				$('>li >div i.extract-checker[data-ams-extract-name="' + data.extract + '"]',
+				  checker.closest('div').siblings('ul.group')).removeClass('fa-square disabled')
+															  .addClass('fa-square-o')
+															  .css('color', '#' + data.color);
+			} else {
+				checker.removeClass('fa-square used')
+					   .addClass('fa-square-o');
+				$('i.extract-checker[data-ams-extract-name="' + data.extract + '"]',
+				  checker.closest('div').siblings('ul.group')).removeClass('fa-square-o')
+															  .addClass('fa-square disabled')
+															  .css('color', 'silver');
+			}
+		});
+	});
+
+})(jQuery);