| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | import Component from '@ember/component'; | 
					
						
							|  |  |  | import { getProperties, get, set } from '@ember/object'; | 
					
						
							|  |  |  | import { assert } from '@ember/debug'; | 
					
						
							|  |  |  | import { task } from 'ember-concurrency'; | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   readDatasetSchemaComments, | 
					
						
							|  |  |  |   createDatasetSchemaComment, | 
					
						
							|  |  |  |   updateDatasetSchemaComment, | 
					
						
							|  |  |  |   deleteDatasetSchemaComment | 
					
						
							|  |  |  | } from 'wherehows-web/utils/api/datasets/schema-comments'; | 
					
						
							|  |  |  | import { augmentObjectsWithHtmlComments } from 'wherehows-web/utils/api/datasets/columns'; | 
					
						
							|  |  |  | import { IDatasetComment } from 'wherehows-web/typings/api/datasets/comments'; | 
					
						
							|  |  |  | import { IDatasetColumn } from 'wherehows-web/typings/api/datasets/columns'; | 
					
						
							| 
									
										
										
										
											2017-10-23 16:50:48 -07:00
										 |  |  | import Notifications, { NotificationEvent } from 'wherehows-web/services/notifications'; | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  | import { action } from '@ember-decorators/object'; | 
					
						
							|  |  |  | import { service } from '@ember-decorators/service'; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum SchemaCommentActions { | 
					
						
							|  |  |  |   modify = 'modify', | 
					
						
							|  |  |  |   destroy = 'destroy', | 
					
						
							|  |  |  |   add = 'add' | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface IGetCommentsTaskArgs { | 
					
						
							|  |  |  |   datasetId: number; | 
					
						
							|  |  |  |   columnId: number; | 
					
						
							| 
									
										
										
										
											2018-01-20 00:46:47 -08:00
										 |  |  |   comments: Array<IDatasetComment>; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export class SchemaComment extends Component { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:46:47 -08:00
										 |  |  |   comments: Array<IDatasetComment> = []; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |   count = 0; | 
					
						
							|  |  |  |   datasetId = 0; | 
					
						
							|  |  |  |   columnId = 0; | 
					
						
							|  |  |  |   isShowingFieldComment = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							| 
									
										
										
										
											2018-01-20 00:46:47 -08:00
										 |  |  |    * Local reference to the notifications service | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |    * @memberof SchemaComment | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |   @service | 
					
						
							|  |  |  |   notifications: Notifications; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 00:46:47 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Enum of applicable values for schema comment actions | 
					
						
							|  |  |  |    * @type {SchemaCommentActions} | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |   SchemaCommentActions = SchemaCommentActions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 00:46:47 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Task to get related schema comments | 
					
						
							|  |  |  |    * TODO: refactor move to container component | 
					
						
							|  |  |  |    * @type {"ember-concurrency".Task<Promise<Array<IDatasetComment>>, (a?: IGetCommentsTaskArgs) => "ember-concurrency".TaskInstance<Promise<Array<IDatasetComment>>>>} | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   getCommentsTask = task(function*({ datasetId, columnId, comments }: IGetCommentsTaskArgs) { | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |     const schemaComments: Array<IDatasetComment> = yield readDatasetSchemaComments(datasetId, columnId); | 
					
						
							|  |  |  |     const withHtmlComments = augmentObjectsWithHtmlComments( | 
					
						
							|  |  |  |       schemaComments.map(({ text }) => <IDatasetColumn>{ comment: text }) | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2017-10-23 16:50:48 -07:00
										 |  |  |     comments.setObjects.call(comments, withHtmlComments); | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |   }).drop(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |   @action | 
					
						
							|  |  |  |   showComments() { | 
					
						
							|  |  |  |     const props = getProperties(this, ['datasetId', 'columnId', 'comments']); | 
					
						
							|  |  |  |     set(this, 'isShowingFieldComment', true); | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |     // @ts-ignore ts limitation with the ember object model, fixed in ember 3.1 with es5 getters
 | 
					
						
							|  |  |  |     return get(this, 'getComments').perform(props); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |   @action | 
					
						
							|  |  |  |   hideComments() { | 
					
						
							|  |  |  |     return set(this, 'isShowingFieldComment', false); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Given a schema comment action, invokes the related action to process the schema comment | 
					
						
							|  |  |  |    * @param {SchemaCommentActions} strategy | 
					
						
							|  |  |  |    * @return {Promise<boolean>} | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   @action | 
					
						
							|  |  |  |   async handleSchemaComment(strategy: SchemaCommentActions) { | 
					
						
							|  |  |  |     const [, { text }] = arguments; | 
					
						
							|  |  |  |     const { datasetId, columnId, notifications, comments, getCommentsTask } = getProperties(this, [ | 
					
						
							|  |  |  |       'datasetId', | 
					
						
							|  |  |  |       'columnId', | 
					
						
							|  |  |  |       'notifications', | 
					
						
							|  |  |  |       'comments', | 
					
						
							|  |  |  |       'getCommentsTask' | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |     const { notify } = notifications; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |     assert(`Expected action to be one of ${Object.keys(SchemaCommentActions)}`, strategy in SchemaCommentActions); | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |     const action = { | 
					
						
							|  |  |  |       add: (): Promise<void> => createDatasetSchemaComment(datasetId, columnId, text), | 
					
						
							|  |  |  |       modify: (): Promise<void> => updateDatasetSchemaComment(datasetId, columnId, text), | 
					
						
							|  |  |  |       destroy: (): Promise<void> => deleteDatasetSchemaComment(datasetId, columnId) | 
					
						
							|  |  |  |     }[strategy]; | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  |     try { | 
					
						
							|  |  |  |       await action(); | 
					
						
							|  |  |  |       notify(NotificationEvent.success, { content: 'Success!' }); | 
					
						
							|  |  |  |       // @ts-ignore ts limitation with the ember object model, fixed in ember 3.1 with es5 getters
 | 
					
						
							|  |  |  |       getCommentsTask.perform({ datasetId, columnId, comments }); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       notify(NotificationEvent.error, { content: e.message }); | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-08-12 13:02:01 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-18 17:38:51 -07:00
										 |  |  | } |