3197 var dataOptions = {}; |
3197 var dataOptions = {}; |
3198 var settings = $.extend({}, dataOptions, data.amsTypeaheadOptions); |
3198 var settings = $.extend({}, dataOptions, data.amsTypeaheadOptions); |
3199 settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings; |
3199 settings = ams.executeFunctionByName(data.amsTypeaheadInitCallback, input, settings) || settings; |
3200 var plugin = input.typeahead(settings); |
3200 var plugin = input.typeahead(settings); |
3201 ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings); |
3201 ams.executeFunctionByName(data.amsTypeaheadAfterInitCallback, input, plugin, settings); |
|
3202 }); |
|
3203 }); |
|
3204 } |
|
3205 }, |
|
3206 |
|
3207 /** |
|
3208 * Treeview plug-in |
|
3209 */ |
|
3210 treeview: function(element) { |
|
3211 var treeviews = $('.treeview', element); |
|
3212 if (treeviews.length > 0) { |
|
3213 ams.ajax.check($.fn.treview, |
|
3214 ams.baseURL + 'ext/bootstrap-treeview' + ams.devext + '.js', |
|
3215 function(first_load) { |
|
3216 if (first_load) { |
|
3217 ams.getCSS(ams.baseURL + '../css/ext/bootstrap-treeview' + ams.devext + '.css', 'bootstrap-treeview'); |
|
3218 } |
|
3219 treeviews.each(function() { |
|
3220 var treeview = $(this); |
|
3221 var data = treeview.data(); |
|
3222 var dataOptions = { |
|
3223 data: data.amsTreeviewData, |
|
3224 levels: data.amsTreeviewLevels, |
|
3225 injectStyle: data.amsTreeviewInjectStyle, |
|
3226 expandIcon: data.amsTreeviewExpandIcon || 'fa fa-fw fa-plus-square-o', |
|
3227 collapseIcon: data.amsTreeviewCollaspeIcon || 'fa fa-fw fa-minus-square-o', |
|
3228 emptyIcon: data.amsTreeviewEmptyIcon || 'fa fa-fw', |
|
3229 nodeIcon: data.amsTreeviewNodeIcon, |
|
3230 selectedIcon: data.amsTreeviewSelectedIcon, |
|
3231 checkedIcon: data.amsTreeviewCheckedIcon || 'fa fa-fw fa-check-square-o', |
|
3232 uncheckedIcon: data.amsTreeviewUncheckedIcon || 'fa fa-fw fa-square-o', |
|
3233 color: data.amsTreeviewColor, |
|
3234 backColor: data.amsTreeviewBackColor, |
|
3235 borderColor: data.amsTreeviewBorderColor, |
|
3236 onHoverColor: data.amsTreeviewHoverColor, |
|
3237 selectedColor: data.amsTreeviewSelectedColor, |
|
3238 selectedBackColor: data.amsTreeviewSelectedBackColor, |
|
3239 unselectableColor: data.amsTreeviewUnselectableColor || 'rgba(1,1,1,0.25)', |
|
3240 unselectableBackColor: data.amsTreeviewUnselectableBackColor || 'rgba(1,1,1,0.25)', |
|
3241 enableLinks: data.amsTreeviewEnableLinks, |
|
3242 highlightSelected: data.amsTreeviewHighlightSelected, |
|
3243 highlightSearchResults: data.amsTreeviewhighlightSearchResults, |
|
3244 showBorder: data.amsTreeviewShowBorder, |
|
3245 showIcon: data.amsTreeviewShowIcon, |
|
3246 showCheckbox: data.amsTreeviewShowCheckbox, |
|
3247 showTags: data.amsTreeviewShowTags, |
|
3248 toggleUnselectable: data.amsTreeviewToggleUnselectable, |
|
3249 multiSelect: data.amsTreeviewMultiSelect, |
|
3250 onNodeChecked: ams.getFunctionByName(data.amsTreeviewNodeChecked), |
|
3251 onNodeCollapsed: ams.getFunctionByName(data.amsTreeviewNodeCollapsed), |
|
3252 onNodeDisabled: ams.getFunctionByName(data.amsTreeviewNodeDisabled), |
|
3253 onNodeEnabled: ams.getFunctionByName(data.amsTreeviewNodeEnabled), |
|
3254 onNodeExpanded: ams.getFunctionByName(data.amsTreeviewNodeExpanded), |
|
3255 onNodeSelected: ams.getFunctionByName(data.amsTreeviewNodeSelected), |
|
3256 onNodeUnchecked: ams.getFunctionByName(data.amsTreeviewNodeUnchecked), |
|
3257 onNodeUnselected: ams.getFunctionByName(data.amsTreeviewNodeUnselected), |
|
3258 onSearchComplete: ams.getFunctionByName(data.amsTreeviewSearchComplete), |
|
3259 onSearchCleared: ams.getFunctionByName(data.amsTreeviewSearchCleared) |
|
3260 }; |
|
3261 var settings = $.extend({}, dataOptions, data.amsTreeviewOptions); |
|
3262 settings = ams.executeFunctionByName(data.amsTreeviewInitcallback, treeview, settings) || settings; |
|
3263 var plugin = treeview.treeview(settings); |
|
3264 ams.executeFunctionByName(data.amsTreeviewAfterInitCallback, treeview, plugin, settings); |
3202 }); |
3265 }); |
3203 }); |
3266 }); |
3204 } |
3267 } |
3205 }, |
3268 }, |
3206 |
3269 |
3968 onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) { |
4031 onDrop: ams.getFunctionByName(data.amsTabledndDrop) || function(dnd_table, row) { |
3969 var target = data.amsTabledndDropTarget; |
4032 var target = data.amsTabledndDropTarget; |
3970 if (target) { |
4033 if (target) { |
3971 // Disable row click handler |
4034 // Disable row click handler |
3972 $(row).data('ams-disabled-handlers', 'click'); |
4035 $(row).data('ams-disabled-handlers', 'click'); |
3973 var rows = []; |
4036 try { |
3974 $(dnd_table.rows).each(function() { |
4037 var rows = []; |
3975 var rowId = $(this).data('ams-element-name'); |
4038 $(dnd_table.rows).each(function() { |
3976 if (rowId) { |
4039 var rowId = $(this).data('ams-element-name'); |
3977 rows.push(rowId); |
4040 if (rowId) { |
|
4041 rows.push(rowId); |
|
4042 } |
|
4043 }); |
|
4044 var localTarget = ams.getFunctionByName(target); |
|
4045 if (typeof(localTarget) === 'function') { |
|
4046 localTarget.call(table, dnd_table, rows); |
|
4047 } else { |
|
4048 if (!target.startsWith(window.location.protocol)) { |
|
4049 var location = data.amsLocation; |
|
4050 if (location) { |
|
4051 target = location + '/' + target; |
|
4052 } |
|
4053 } |
|
4054 ams.ajax.post(target, {names: JSON.stringify(rows)}); |
3978 } |
4055 } |
3979 }); |
4056 } finally { |
3980 var localTarget = ams.getFunctionByName(target); |
4057 // Restore row click handler |
3981 if (typeof(localTarget) === 'function') { |
4058 setTimeout(function() { |
3982 localTarget.call(table, dnd_table, rows); |
4059 $(row).removeData('ams-disabled-handlers'); |
3983 } else { |
4060 }, 50); |
3984 if (!target.startsWith(window.location.protocol)) { |
|
3985 var location = data.amsLocation; |
|
3986 if (location) { |
|
3987 target = location + '/' + target; |
|
3988 } |
|
3989 } |
|
3990 ams.ajax.post(target, {names: JSON.stringify(rows)}); |
|
3991 } |
4061 } |
3992 // Restore row click handler |
|
3993 setTimeout(function() { |
|
3994 $(row).removeData('ams-disabled-handlers'); |
|
3995 }, 50); |
|
3996 } |
4062 } |
3997 return false; |
4063 return false; |
3998 } |
4064 } |
3999 }; |
4065 }; |
4000 var settings = $.extend({}, dataOptions, data.amsTabledndOptions); |
4066 var settings = $.extend({}, dataOptions, data.amsTabledndOptions); |
4550 content: '<i class="text-danger fa fa-fw fa-bell"></i> ' + ams.i18n.DELETE_WARNING, |
4616 content: '<i class="text-danger fa fa-fw fa-bell"></i> ' + ams.i18n.DELETE_WARNING, |
4551 status: 'info', |
4617 status: 'info', |
4552 buttons: ams.i18n.BTN_OK_CANCEL |
4618 buttons: ams.i18n.BTN_OK_CANCEL |
4553 }, function(button) { |
4619 }, function(button) { |
4554 if (button === ams.i18n.BTN_OK) { |
4620 if (button === ams.i18n.BTN_OK) { |
4555 var table = link.parents('table').first(); |
|
4556 var location = table.data('ams-location') || ''; |
|
4557 var tr = link.parents('tr').first(); |
4621 var tr = link.parents('tr').first(); |
|
4622 var table = tr.parents('table').first(); |
|
4623 var location = tr.data('ams-location') || table.data('ams-location') || ''; |
4558 var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json'; |
4624 var deleteTarget = tr.data('ams-delete-target') || table.data('ams-delete-target') || 'delete-element.json'; |
4559 var objectName = tr.data('ams-element-name'); |
4625 var objectName = tr.data('ams-element-name'); |
4560 MyAMS.ajax.post(location + '/' + deleteTarget, {'object_name': objectName}, function(result, status) { |
4626 MyAMS.ajax.post(location + '/' + deleteTarget, {'object_name': objectName}, function(result, status) { |
4561 if (result.status === 'success') { |
4627 if (result.status === 'success') { |
4562 if (table.hasClass('datatable')) { |
4628 if (table.hasClass('datatable')) { |
4577 } |
4643 } |
4578 }; |
4644 }; |
4579 |
4645 |
4580 |
4646 |
4581 /** |
4647 /** |
|
4648 * Tree management |
|
4649 */ |
|
4650 MyAMS.tree = { |
|
4651 |
|
4652 /** |
|
4653 * Open close tree node inside a table |
|
4654 */ |
|
4655 switchTableNode: function() { |
|
4656 |
|
4657 function removeChildNodes(node_id) { |
|
4658 $('tr[data-ams-tree-node-parent-id="' + node_id + '"]').each(function() { |
|
4659 var row = $(this); |
|
4660 removeChildNodes(row.data('ams-tree-node-id')); |
|
4661 row.remove(); |
|
4662 }) |
|
4663 } |
|
4664 |
|
4665 var node = $(this); |
|
4666 var switcher = $('i.switch', node); |
|
4667 var tr = node.parents('tr').first(); |
|
4668 var table = tr.parents('table').first(); |
|
4669 if (switcher.hasClass('fa-minus-square-o')) { |
|
4670 removeChildNodes(tr.data('ams-tree-node-id')); |
|
4671 switcher.removeClass('fa-minus-square-o') |
|
4672 .addClass('fa-plus-square-o'); |
|
4673 } else { |
|
4674 var location = tr.data('ams-location') || table.data('ams-location') || ''; |
|
4675 var treeNodesTarget = tr.data('ams-tree-nodes-target') || table.data('ams-tree-nodes-target') || 'get-tree-nodes.json'; |
|
4676 var sourceName = tr.data('ams-element-name'); |
|
4677 switcher.removeClass('fa-plus-square-o') |
|
4678 .addClass('fa-cog fa-spin'); |
|
4679 MyAMS.ajax.post(location + '/' + sourceName + '/' + treeNodesTarget, { |
|
4680 can_sort: !$('td.sorter', tr).is(':empty') |
|
4681 }, function(result, status) { |
|
4682 if (result.length > 0) { |
|
4683 var old_row = tr; |
|
4684 for (var index = 0; index < result.length; index++) { |
|
4685 var new_row = $(result[index]); |
|
4686 new_row.insertAfter(old_row) |
|
4687 .addClass('no-drag-handle'); |
|
4688 ams.initContent(new_row); |
|
4689 old_row = new_row; |
|
4690 } |
|
4691 if (table.hasClass('table-dnd')) { |
|
4692 table.tableDnDUpdate(); |
|
4693 } |
|
4694 } |
|
4695 switcher.removeClass('fa-cog fa-spin') |
|
4696 .addClass('fa-minus-square-o'); |
|
4697 }); |
|
4698 } |
|
4699 }, |
|
4700 |
|
4701 /** |
|
4702 * Open close all tree nodes |
|
4703 */ |
|
4704 switchTree: function() { |
|
4705 var th = $(this); |
|
4706 var switcher = $('i.switch', th); |
|
4707 var table = $(this).parents('table').first(); |
|
4708 var tableID = table.data('ams-tree-node-id'); |
|
4709 if (switcher.hasClass('fa-minus-square-o')) { |
|
4710 $('tr[data-ams-tree-node-parent-id]').filter('tr[data-ams-tree-node-parent-id!="' + tableID + '"]').remove(); |
|
4711 $('i.switch', table).removeClass('fa-minus-square-o') |
|
4712 .addClass('fa-plus-square-o'); |
|
4713 } else { |
|
4714 var tr = $('tbody tr', table).first(); |
|
4715 var location = table.data('ams-location') || ''; |
|
4716 var target = table.data('ams-tree-nodes-target') || 'get-tree.json'; |
|
4717 switcher.removeClass('fa-plus-square-o') |
|
4718 .addClass('fa-cog fa-spin'); |
|
4719 MyAMS.ajax.post(location + '/' + target, { |
|
4720 can_sort: !$('td.sorter', tr).is(':empty') |
|
4721 }, function(result, status) { |
|
4722 $('tr[data-ams-tree-node-id]', table).remove(); |
|
4723 var old_row = null; |
|
4724 for (var index = 0; index < result.length; index++) { |
|
4725 var new_row = $(result[index]); |
|
4726 if (old_row === null) { |
|
4727 new_row.appendTo($('tbody', table)); |
|
4728 } else { |
|
4729 new_row.insertAfter(old_row); |
|
4730 } |
|
4731 new_row.addClass('no-drag-handle'); |
|
4732 ams.initContent(new_row); |
|
4733 old_row = new_row; |
|
4734 } |
|
4735 if (table.hasClass('table-dnd')) { |
|
4736 table.tableDnDUpdate(); |
|
4737 } |
|
4738 $('i.switch', table).removeClass('fa-plus-square-o') |
|
4739 .addClass('fa-minus-square-o'); |
|
4740 switcher.removeClass('fa-cog fa-spin') |
|
4741 .addClass('fa-minus-square-o'); |
|
4742 }); |
|
4743 } |
|
4744 }, |
|
4745 |
|
4746 /** |
|
4747 * Sort and re-parent tree elements |
|
4748 */ |
|
4749 sortTree: function(dnd_table, row) { |
|
4750 var data = $(dnd_table).data(); |
|
4751 var target = data.amsTabledndDropTarget; |
|
4752 if (target) { |
|
4753 // Disable row click handler |
|
4754 row = $(row); |
|
4755 row.data('ams-disabled-handlers', 'click'); |
|
4756 try { |
|
4757 // Get root ID |
|
4758 var tableID = row.parents('table').first().data('ams-tree-node-id'); |
|
4759 // Get moved row ID |
|
4760 var rowID = row.data('ams-tree-node-id'); |
|
4761 var rowParentID = row.data('ams-tree-node-parent-id'); |
|
4762 // Get new parent ID |
|
4763 var parent = row.prev('tr'); |
|
4764 if (parent.exists()) { |
|
4765 // Move below an existing row |
|
4766 var parentID = parent.data('ams-tree-node-id'); |
|
4767 // Check switcher state |
|
4768 var switcher = $('.switch', parent); |
|
4769 if (switcher.hasClass('fa-minus-square-o')) { |
|
4770 // Opened folder: move as child |
|
4771 if (rowParentID === parentID) { |
|
4772 // Don't change parent |
|
4773 var action = 'reorder'; |
|
4774 } else { |
|
4775 // Change parent |
|
4776 action = 'reparent'; |
|
4777 } |
|
4778 } else { |
|
4779 // Closed folder or simple item: move as sibling |
|
4780 parentID = parent.data('ams-tree-node-parent-id'); |
|
4781 if (rowParentID === parentID) { |
|
4782 // Don't change parent |
|
4783 action = 'reorder'; |
|
4784 } else { |
|
4785 // Change parent |
|
4786 action = 'reparent'; |
|
4787 } |
|
4788 } |
|
4789 } else { |
|
4790 // Move to site root |
|
4791 parentID = tableID; |
|
4792 switcher = null; |
|
4793 if (rowParentID === parentID) { |
|
4794 // Already child of site root |
|
4795 action = 'reorder'; |
|
4796 } else { |
|
4797 // Move from inner folder to site root |
|
4798 action = 'reparent'; |
|
4799 } |
|
4800 } |
|
4801 // Call ordering target |
|
4802 var localTarget = ams.getFunctionByName(target); |
|
4803 if (typeof(localTarget) === 'function') { |
|
4804 localTarget.call(table, dnd_table, post_data); |
|
4805 } else { |
|
4806 if (!target.startsWith(window.location.protocol)) { |
|
4807 var location = data.amsLocation; |
|
4808 if (location) { |
|
4809 target = location + '/' + target; |
|
4810 } |
|
4811 } |
|
4812 var post_data = { |
|
4813 action: action, |
|
4814 child: rowID, |
|
4815 parent: parentID, |
|
4816 order: JSON.stringify($('tr[data-ams-tree-node-id]').listattr('data-ams-tree-node-id')), |
|
4817 can_sort: !$('td.sorter', row).is(':empty') |
|
4818 }; |
|
4819 ams.ajax.post(target, post_data, function(result) { |
|
4820 |
|
4821 function removeChildRows(rowID) { |
|
4822 var childs = $('tr[data-ams-tree-node-parent-id="' + rowID + '"]'); |
|
4823 childs.each(function() { |
|
4824 var childRow = $(this); |
|
4825 var childID = childRow.attr('data-ams-tree-node-id'); |
|
4826 removeChildRows(childID); |
|
4827 childRow.remove(); |
|
4828 }); |
|
4829 } |
|
4830 |
|
4831 // Remove moved row childrens |
|
4832 var body = $(row).parents('tbody').first(); |
|
4833 removeChildRows(rowID); |
|
4834 if (post_data.action === 'reparent') { |
|
4835 // Remove new parent childrens |
|
4836 removeChildRows(parentID); |
|
4837 row.remove(); |
|
4838 var old_row = $('tr[data-ams-tree-node-id="' + parentID + '"]'); |
|
4839 for (var index = 0; index < result.length; index++) { |
|
4840 var new_row = $(result[index]); |
|
4841 if (old_row.exists()) { |
|
4842 new_row.insertAfter(old_row) |
|
4843 .addClass('no-drag-handle'); |
|
4844 } else { |
|
4845 new_row.prependTo(body) |
|
4846 .addClass('no-drag-handle'); |
|
4847 } |
|
4848 ams.initContent(new_row); |
|
4849 old_row = new_row; |
|
4850 } |
|
4851 } |
|
4852 $('tr').parents('table').tableDnDUpdate(); |
|
4853 }); |
|
4854 } |
|
4855 } finally { |
|
4856 // Restore row click handler |
|
4857 setTimeout(function() { |
|
4858 $(row).removeData('ams-disabled-handlers'); |
|
4859 }, 50); |
|
4860 } |
|
4861 } |
|
4862 return false; |
|
4863 } |
|
4864 }; |
|
4865 |
|
4866 |
|
4867 /** |
4582 * Generic skin features |
4868 * Generic skin features |
4583 */ |
4869 */ |
4584 MyAMS.skin = { |
4870 MyAMS.skin = { |
4585 |
4871 |
4586 /** |
4872 /** |
4646 button.addClass('disabled'); |
4932 button.addClass('disabled'); |
4647 $('i', button).addClass('fa-spin'); |
4933 $('i', button).addClass('fa-spin'); |
4648 $('input[name="activity"]:checked', '#user-activity').change(); |
4934 $('input[name="activity"]:checked', '#user-activity').change(); |
4649 $('i', button).removeClass('fa-spin'); |
4935 $('i', button).removeClass('fa-spin'); |
4650 button.removeClass('disabled'); |
4936 button.removeClass('disabled'); |
|
4937 }, |
|
4938 |
|
4939 /** |
|
4940 * Replace given form with new content |
|
4941 */ |
|
4942 refreshContent: function(changes) { |
|
4943 var target = $('[id="' + changes.object_id + '"]'); |
|
4944 target.replaceWith($(changes.content)); |
|
4945 target = $('[id="' + changes.object_id + '"]'); |
|
4946 MyAMS.initContent(target); |
|
4947 return target; |
|
4948 }, |
|
4949 |
|
4950 /** |
|
4951 * Replace given table with new content |
|
4952 */ |
|
4953 refreshTable: function(changes) { |
|
4954 var widget = $('[id="' + changes.object_id + '"]').parent('.ams-widget'); |
|
4955 widget.replaceWith($(changes.table)); |
|
4956 widget = $('[id="' + changes.object_id + '"]').parent('.ams-widget'); |
|
4957 MyAMS.initContent(widget); |
|
4958 return widget; |
|
4959 }, |
|
4960 /** |
|
4961 * Replace given row with new content |
|
4962 */ |
|
4963 refreshRow: function(changes) { |
|
4964 var tr = $('tr[id="' + changes.object_id + '"]'); |
|
4965 var table = tr.parents('table').first(); |
|
4966 tr = tr.replaceWith($(changes.row)); |
|
4967 MyAMS.initContent(tr); |
|
4968 if (table.hasClass('table-dnd')) { |
|
4969 table.tableDnDUpdate(); |
|
4970 } |
|
4971 return tr; |
|
4972 }, |
|
4973 |
|
4974 /** |
|
4975 * Replace given row cell with new content |
|
4976 */ |
|
4977 refreshRowCell: function(changes) { |
|
4978 var tr = $('tr[id="' + changes.object_id + '"]'); |
|
4979 var table = tr.parents('table').first(); |
|
4980 var headRow = $('tr', $('thead', table)); |
|
4981 var headCell = $('th[data-ams-column-name="' + changes.col_name + '"]', headRow); |
|
4982 var index = $('th', headRow).index(headCell); |
|
4983 if (index > -1) { |
|
4984 var cell = $($('td', tr).get(index)); |
|
4985 cell.html(changes.cell); |
|
4986 MyAMS.initContent(cell); |
|
4987 } |
4651 }, |
4988 }, |
4652 |
4989 |
4653 /** |
4990 /** |
4654 * Initialize desktop and mobile widgets |
4991 * Initialize desktop and mobile widgets |
4655 */ |
4992 */ |