mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-10-31 10:49:00 +00:00 
			
		
		
		
	
		
			
	
	
		
			463 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			463 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | import Ember from 'ember'; | ||
|  | 
 | ||
|  | export default Ember.Component.extend({ | ||
|  |   comments: [], | ||
|  |   page: null, | ||
|  |   pageSize: null, | ||
|  |   totalPages: null, | ||
|  |   count: null, | ||
|  |   loading: false, | ||
|  |   isEdit: false, | ||
|  |   propModal: false, | ||
|  |   comment: {}, | ||
|  |   selectedComment: {}, | ||
|  |   currentTab: '', | ||
|  |   similarComments: [], | ||
|  |   promotionFlow: false, | ||
|  |   multiFields: false, | ||
|  |   similarFlow: false, | ||
|  |   promoteLoading: false, | ||
|  |   promoteDisabled: false, | ||
|  |   similarColumns: { | ||
|  |     page: 1, | ||
|  |     data: [], | ||
|  |     all: [], | ||
|  |     count: 0, | ||
|  |     pageSize: 10, | ||
|  |     totalPages: 1 | ||
|  |   }, | ||
|  |   selectedSimilarColumns: [], | ||
|  |   getSimilarColumns: function () { | ||
|  |     var _this = this; | ||
|  |     this.set('similarColumns.loading', true) | ||
|  |     var datasetId = this.get('datasetId') | ||
|  |     var columnId = this.get('schema.id') | ||
|  |     var url = "/api/v1/datasets/" + datasetId | ||
|  |     url += ("/columns/" + columnId + "/similar") | ||
|  |     $.get | ||
|  |     (url | ||
|  |         , function (data) { | ||
|  |           var columns = data.similar; | ||
|  |           columns.forEach(function (col) { | ||
|  |             col.html = marked(col.comment || "").htmlSafe() | ||
|  |             col.selected = false | ||
|  |           }) | ||
|  |           var page = _this.get('similarColumns.page'); | ||
|  |           if (!page) { | ||
|  |             page = 1; | ||
|  |           } | ||
|  |           var pageSize = _this.get('similarColumns.pageSize'); | ||
|  |           if (!pageSize) { | ||
|  |             pageSize = 10; | ||
|  |           } | ||
|  |           var similarColumns = { | ||
|  |             page: page, | ||
|  |             all: columns, | ||
|  |             count: columns.length, | ||
|  |             pageSize: pageSize, | ||
|  |             totalPages: Math.ceil(columns.length / pageSize), | ||
|  |             data: columns.slice(0, pageSize), | ||
|  |             loading: false | ||
|  |           } | ||
|  |           _this.set('similarColumns', similarColumns) | ||
|  |         } | ||
|  |     ) | ||
|  |   }, | ||
|  |   getSimilarComments: function () { | ||
|  |     var _this = this | ||
|  |     var datasetId = this.get('datasetId') | ||
|  |     var columnId = this.get('schema.id') | ||
|  |     var url = "/api/v1/datasets/" + datasetId | ||
|  |     url += ("/columns/" + columnId + "/comments/similar") | ||
|  |     $.get | ||
|  |     (url | ||
|  |         , function (data) { | ||
|  |           var comments = data.similar; | ||
|  |           comments.forEach(function (cmnt) { | ||
|  |             cmnt.html = marked(cmnt.comment || "").htmlSafe() | ||
|  |           }) | ||
|  |           _this.set('similarComments', comments) | ||
|  |         } | ||
|  |     ) | ||
|  |   }, | ||
|  |   getComments: function (page, size) { | ||
|  |     this.set('loading', true) | ||
|  |     size = size || 3 | ||
|  |     page = page || 1 | ||
|  |     var datasetId = this.get('datasetId') | ||
|  |     var columnId = this.get('schema.id') | ||
|  |     var _this = this | ||
|  |     var url = '/api/v1/datasets/' + datasetId + '/columns/' + columnId + '/comments' | ||
|  |     url += '?page=' + page + '&size=' + size | ||
|  |     $.get | ||
|  |     (url | ||
|  |         , function (data) { | ||
|  |           var comments = data.data.comments | ||
|  |           comments.forEach(function (cmnt) { | ||
|  |             cmnt.html = marked(cmnt.text).htmlSafe(); | ||
|  |           }) | ||
|  |           _this.set('comments', comments) | ||
|  |           _this.set('page', data.data.page) | ||
|  |           _this.set('pageSize', data.data.itemsPerPage) | ||
|  |           _this.set('totalPages', data.data.totalPages) | ||
|  |           _this.set('count', data.data.count) | ||
|  |           _this.set('loading', false) | ||
|  |         } | ||
|  |     ).fail(function () { | ||
|  |       _this.set('comments', []) | ||
|  |       _this.set('loading', false) | ||
|  |     }) | ||
|  |   }, | ||
|  |   defaultCommentText: function () { | ||
|  |     return "#We Support Markdown ([GitHub Flavored][gh])! \n##Secondary Header \n* bullet \n* bullet\n\n\n| Col 1 | Col 2 | Col 3|\n|:--|:--:|--:|\n|Left|Center|Right|\n```sql\nSELECT * FROM ABOOK_DATA WHERE modified_date > 1436830358700;\n```\n[ABOOK_DATA](/#/dataset/1/ABOOK_DATA) All links will open in a new tab\n\n[gh]: https://help.github.com/articles/github-flavored-markdown/" | ||
|  | 
 | ||
|  |   }, | ||
|  |   setDefaultCommentText: function () { | ||
|  |     this.set('comment', {}) | ||
|  |     this.set('comment.text', this.defaultCommentText()) | ||
|  |     $("#datasetSchemaComment-write > textarea").focus() | ||
|  |   }, | ||
|  |   getSelected: function () { | ||
|  |     var isMultifield = this.get('multiFields') | ||
|  |     var isSimilar = this.get('similarFlow') | ||
|  |     if (isMultifield) { | ||
|  |       var similarColumns = this.get('similarColumns') || {} | ||
|  |       similarColumns.all = this.get('similarColumns.all') || [] | ||
|  |       return similarColumns.all.filter(function (row) { | ||
|  |         if (row.selected) | ||
|  |           return row | ||
|  |       }) | ||
|  |     } else if (isSimilar) { | ||
|  |       var selectedIndex = $("input[name='selectedComment']:checked").val() | ||
|  |       var comments = this.get('similarComments') | ||
|  |       return comments[selectedIndex] | ||
|  |     } else { | ||
|  |       return this.get('selectedComment') | ||
|  |     } | ||
|  |   }, | ||
|  |   actions: { | ||
|  |     insertImageOrLink: function (param) { | ||
|  |       var target = $('#datasetschemacomment'); | ||
|  |       insertImageAtCursor(target, param); | ||
|  |       updatePreview(); | ||
|  |     }, | ||
|  |     insertSourcecode: function () { | ||
|  |       var target = $('#datasetschemacomment'); | ||
|  |       insertSourcecodeAtCursor(target); | ||
|  |       updatePreview(); | ||
|  |     }, | ||
|  |     insertList: function (param) { | ||
|  |       var target = $('#datasetschemacomment'); | ||
|  |       var value = "Apple\nBananna\nOrange"; | ||
|  |       insertListAtCursor(target, value, param); | ||
|  |       updatePreview(); | ||
|  |     }, | ||
|  |     insertElement: function (param) { | ||
|  |       var target = $('#datasetschemacomment'); | ||
|  |       var value; | ||
|  |       switch (param) { | ||
|  |         case 'bold': | ||
|  |           value = "**" + param + " text**"; | ||
|  |           break; | ||
|  |         case 'italic': | ||
|  |           value = "*" + param + " text*"; | ||
|  |           break; | ||
|  |         case 'heading_1': | ||
|  |           value = "#" + param + " text#"; | ||
|  |           break; | ||
|  |         case 'heading_2': | ||
|  |           value = "##" + param + " text##"; | ||
|  |           break; | ||
|  |         case 'heading_3': | ||
|  |           value = "###" + param + " text###"; | ||
|  |           break; | ||
|  |       } | ||
|  |       insertAtCursor(target, value, false); | ||
|  |       updatePreview(); | ||
|  |     }, | ||
|  |     importCSVTable: function () { | ||
|  | 
 | ||
|  |       var input = $('#tsv-input'); | ||
|  |       var output = $('#table-output'); | ||
|  | 
 | ||
|  |       var headerCheckbox = $('#has-headers'); | ||
|  |       var delimiterMarker = $('#delimiter-marker'); | ||
|  | 
 | ||
|  |       var getDelimiter = function () { | ||
|  |         var delim = delimiterMarker.val(); | ||
|  |         if (delim == 'tab') { | ||
|  |           delim = "\t"; | ||
|  |         } | ||
|  | 
 | ||
|  |         return delim; | ||
|  |       }; | ||
|  | 
 | ||
|  |       input.keydown(function (e) { | ||
|  |         if (e.key == 'tab') { | ||
|  |           e.stop(); | ||
|  |           insertAtCursor(e.target, "\t"); | ||
|  |         } | ||
|  |       }); | ||
|  | 
 | ||
|  |       var renderTable = function () { | ||
|  |         var value = input.val().trim(); | ||
|  |         var hasHeader = headerCheckbox.is(":checked"); | ||
|  | 
 | ||
|  |         var t = csvToMarkdown(value, getDelimiter(), hasHeader); | ||
|  |         output.val(csvToMarkdown(value, getDelimiter(), hasHeader)); | ||
|  |       }; | ||
|  | 
 | ||
|  |       input.keyup(renderTable); | ||
|  |       headerCheckbox.change(renderTable); | ||
|  |       delimiterMarker.change(renderTable); | ||
|  |       $('#submitConvertForm').click(function () { | ||
|  |         $("#convertTableModal").modal('hide') | ||
|  |         var target = $('#datasetschemacomment'); | ||
|  |         insertAtCursor(target, output.val(), true); | ||
|  |         updatePreview(); | ||
|  |       }); | ||
|  |       renderTable(); | ||
|  |       $("#convertTableModal").modal('show'); | ||
|  |     }, | ||
|  |     create: function () { | ||
|  |       var _this = this; | ||
|  |       var token = $("#csrfToken").val().replace('/', '') | ||
|  |       var cmnt = this.get('comment') | ||
|  |       var dsid = this.get('datasetId') | ||
|  |       var cid = this.get('schema.id') | ||
|  |       var url = '/api/v1/datasets/' + dsid + '/columns/' + cid + '/comments' | ||
|  |       cmnt.csrfToken = token; | ||
|  |       if (this.get('isEdit')) { | ||
|  |         cmnt.id = this.get('commentId'); | ||
|  |       } | ||
|  | 
 | ||
|  |       $.ajax | ||
|  |       ({ | ||
|  |             url: url | ||
|  |             , method: 'POST' | ||
|  |             , headers: { | ||
|  |               'Csrf-Token': token | ||
|  |             } | ||
|  |             , dataType: 'json' | ||
|  |             , data: cmnt | ||
|  |           } | ||
|  |       ).done(function (data, txt, xhr) { | ||
|  |         if (data.status == 'success') { | ||
|  |           _this.set('commentError', false); | ||
|  |           _this.set('errorMsg', ""); | ||
|  |           _this.getComments() | ||
|  |           _this.setDefaultCommentText() | ||
|  |         } | ||
|  |         else if (data.status == 'failed') { | ||
|  |           _this.set('commentError', true); | ||
|  |           _this.set('errorMsg', data.msg); | ||
|  |         } | ||
|  | 
 | ||
|  |       }).fail(function (xhr, txt, err) { | ||
|  |         console.log('Error: Could not update comment') | ||
|  |       }) | ||
|  | 
 | ||
|  |     }, | ||
|  |     editMode: function (comment) { | ||
|  |       this.set('isEdit', true); | ||
|  |       this.set('commentId', comment.id); | ||
|  |       this.set('comment.text', comment.text) | ||
|  |     }, | ||
|  |     remove: function (comment) { | ||
|  |       var _this = this | ||
|  |       var token = $("#csrfToken").val().replace('/', '') | ||
|  |       var dsid = this.get('datasetId') | ||
|  |       var cid = this.get('schema.id') | ||
|  |       var url = '/api/v1/datasets/' + dsid + '/columns/' + cid | ||
|  |       url += '/comments/' + comment.id | ||
|  |       var cmnt = {} | ||
|  |       cmnt.csrfToken = token | ||
|  |       $.ajax | ||
|  |       ({ | ||
|  |             url: url | ||
|  |             , method: 'DELETE' | ||
|  |             , headers: { | ||
|  |               'Csrf-Token': token | ||
|  |             } | ||
|  |             , dataType: 'json' | ||
|  |             , data: cmnt | ||
|  |           } | ||
|  |       ).done(function (data, txt, xhr) { | ||
|  |         _this.getComments() | ||
|  |         _this.setDefaultCommentText() | ||
|  |         _this.set('isEdit', false) | ||
|  |       }).fail(function (xhr, txt, err) { | ||
|  |         console.log('Error: Could not update comment') | ||
|  |       }) | ||
|  |     }, | ||
|  |     cancel: function () { | ||
|  |       this.set('isEdit', false) | ||
|  |       this.setDefaultCommentText() | ||
|  |     }, | ||
|  |     updatePreview: function () { | ||
|  |       var text = $("#datasetSchemaComment-write > textarea").val() | ||
|  |       $("#datasetSchemaComment-preview").html(marked(text)) | ||
|  |     }, | ||
|  |     openModal: function (comment) { | ||
|  |       var _this = this | ||
|  |       this.set('propModal', true) | ||
|  |       setTimeout(function () { | ||
|  |         $("#datasetSchemaColumnCommentModal") | ||
|  |             .modal('show') | ||
|  |             .on('shown.bs.modal', function () { | ||
|  |               $("#datasetSchemaComment-write > textarea").focus() | ||
|  |             }) | ||
|  |             .on('hidden.bs.modal', function () { | ||
|  |               _this.set('propModal', false) | ||
|  |               if (_this.parentView && _this.parentView.controller) { | ||
|  |                 _this.parentView.controller.send('getSchema') | ||
|  |               } | ||
|  |               $("#datasetSchemaColumnCommentModal").modal('hide'); | ||
|  |             }) | ||
|  |       }, 300) | ||
|  |       if (!comment) { | ||
|  |         this.setDefaultCommentText() | ||
|  |       } else { | ||
|  |         this.set('isEdit', true) | ||
|  |         this.set('comment', comment) | ||
|  |       } | ||
|  |       this.getComments() | ||
|  |       this.getSimilarComments() | ||
|  |     }, | ||
|  |     closeModal: function () { | ||
|  |       $("#datasetSchemaColumnCommentModal").modal('hide'); | ||
|  |     }, | ||
|  |     setDefault: function (comment) { | ||
|  |       var _this = this; | ||
|  |       this.set("selectedComment", comment); | ||
|  |       this.set("promotionFlow", true); | ||
|  |       this.set('selectedComment.is_default', true); | ||
|  |       this.set("currentTab", ''); | ||
|  |       var comments = this.get("comments"); | ||
|  |       comments.forEach(function (elem, idx, arr) { | ||
|  |         if (elem.id !== comment.id && elem.isDefault) { | ||
|  |           Ember.set(elem, "isDefault", false); | ||
|  |         } | ||
|  |         if (elem.id === comment.id) { | ||
|  |           Ember.set(elem, "isDefault", true); | ||
|  |         } | ||
|  |       }) | ||
|  |       this.set('comments', comments); | ||
|  |     }, | ||
|  |     promote: function () { | ||
|  |       if (this.get("promoteDisabled")) { | ||
|  |         return; | ||
|  |       } | ||
|  |       var _this = this; | ||
|  |       var selected = this.getSelected(); | ||
|  |       var selectedComment = this.get("selectedComment"); | ||
|  |       var datasetId = this.get("datasetId"); | ||
|  |       var fieldId = this.get("fieldId") | ||
|  |       var similarFlow = this.get('similarFlow') | ||
|  |       if (Array.isArray(selected)) { | ||
|  |         for (var i = 0; i < selected.length; i++) { | ||
|  |           selected[i].commentId = selectedComment.id | ||
|  |         } | ||
|  |       } else if (similarFlow) { | ||
|  |         // Selected comment already set
 | ||
|  |       } else { | ||
|  |         selected.commentId = selectedComment.id | ||
|  |       } | ||
|  |       this.set("promoteDisabled", true) | ||
|  |       this.set("promoteLoading, true") | ||
|  |       var params = | ||
|  |           { | ||
|  |             dataset_id: datasetId | ||
|  |             , field_id: fieldId | ||
|  |           } | ||
|  |       var token = $("#csrfToken").val().replace("/", "") | ||
|  |       var uri = '/api/v1/datasets/' | ||
|  |       uri += params.dataset_id + '/columns/' | ||
|  |       uri += params.field_id + '/comments' | ||
|  |       uri += '?csrfToken=' + token | ||
|  |       $.ajax({ | ||
|  |         type: "PATCH", | ||
|  |         headers: { | ||
|  |           'Csrf-Token': token | ||
|  |         }, | ||
|  |         url: uri, | ||
|  |         data: JSON.stringify(selected), | ||
|  |         dataType: 'json', | ||
|  |         contentType: 'application/json' | ||
|  |       }).done(function (res, txt, xhr) { | ||
|  |         _this.set("promoteDisabled", false); | ||
|  |         _this.set("promoteLoading", false); | ||
|  |         _this.set("multiFields", false); | ||
|  |         _this.set("selectedComment", false); | ||
|  |         _this.set("similarColumns", {}); | ||
|  |         _this.getComments(); | ||
|  |       }).fail(function (xhr, txt, err) { | ||
|  |         console.error('Error: ', err); | ||
|  |         _this.set('promoteDisabled', false); | ||
|  |         _this.set('promoteLoading', false); | ||
|  |       }) | ||
|  |     }, | ||
|  |     setMultifields: function () { | ||
|  |       this.set("multiFields", true) | ||
|  |       this.getSimilarColumns() | ||
|  |     }, | ||
|  |     setTab: function (name) { | ||
|  |       this.set('currentTab', name) | ||
|  |       if (name !== "similar") { | ||
|  |         $("input[name='selectedComment']:checked").each(function () { | ||
|  |           $(this).prop('checked', false) | ||
|  |         }) | ||
|  |       } | ||
|  |       if (name === 'similar') { | ||
|  |         this.set('similarFlow', true); | ||
|  |       } else { | ||
|  |         this.set('similarFlow', false); | ||
|  |       } | ||
|  |     }, | ||
|  |     similarColumnsNextPage: function () { | ||
|  |       var currentPage = this.get('similarColumns.page'); | ||
|  |       if (currentPage++ <= this.get("similarColumns.totalPages")) { | ||
|  |         this.set('similarColumns.page', currentPage++); | ||
|  |         var currentPage = this.get("similarColumns.page"); | ||
|  |         var start = (currentPage - 1) * this.get("similarColumns.pageSize") | ||
|  |         var end = start + this.get("similarColumns.pageSize") | ||
|  |         this.set('similarColumns.data', this.get('similarColumns.all').slice(start, end)) | ||
|  |       } | ||
|  |     }, | ||
|  |     similarColumnsPrevPage: function () { | ||
|  |       var currentPage = this.get('similarColumns.page'); | ||
|  |       if (currentPage-- > 0) { | ||
|  |         this.set('similarColumns.page', currentPage--); | ||
|  |         var currentPage = this.get("similarColumns.page"); | ||
|  |         var start = (currentPage - 1) * this.get("similarColumns.pageSize") | ||
|  |         var end = start + this.get("similarColumns.pageSize") | ||
|  |         this.set('similarColumns.data', this.get('similarColumns.all').slice(start, end)) | ||
|  |       } | ||
|  |     }, | ||
|  |     selectSimilarColumn: function (similar, idx) { | ||
|  |       Ember.set(similar, "selected", !Ember.get(similar, "selected")) | ||
|  |       var page = this.get('similarColumns.page'); | ||
|  |       var pageSize = this.get('similarColumns.pageSize'); | ||
|  |       var index = ((page - 1) * pageSize) + idx | ||
|  |       var all = this.get('similarColumns.all'); | ||
|  |       Ember.set(all[index], "selected", Ember.get(similar, "selected")); | ||
|  |       this.set('selectedSimilarColumns', this.getSelected()) | ||
|  |       this.set('similarColumns.all', all) | ||
|  |     }, | ||
|  |     selectAllSimilarColumn: function (selected) { | ||
|  |       var columns = this.get('similarColumns.all'); | ||
|  |       var model = this.get('similarColumns'); | ||
|  |       Ember.set(model, "selectedAll", selected); | ||
|  |       for (var i = 0; i < columns.length; i++) { | ||
|  |         Ember.set(columns[i], "selected", selected); | ||
|  |       } | ||
|  |       if (selected) { | ||
|  |         this.set('selectedSimilarColumns', columns); | ||
|  |       } | ||
|  |       else { | ||
|  |         this.set('selectedSimilarColumns', []); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | }); |