datahub/wherehows-web/app/components/schema-comment.ts

98 lines
3.2 KiB
TypeScript
Raw Normal View History

2017-10-18 17:38:51 -07:00
import Component from '@ember/component';
import ComputedProperty from '@ember/object/computed';
import MutableArray from '@ember/array/mutable';
2017-10-18 17:38:51 -07:00
import { getProperties, get, set } from '@ember/object';
import { inject } from '@ember/service';
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';
import Notifications, { NotificationEvent } from 'wherehows-web/services/notifications';
2017-10-18 17:38:51 -07:00
enum SchemaCommentActions {
modify = 'modify',
destroy = 'destroy',
add = 'add'
}
interface IGetCommentsTaskArgs {
datasetId: number;
columnId: number;
comments: MutableArray<IDatasetComment>;
2017-10-18 17:38:51 -07:00
}
export class SchemaComment extends Component {
comments = [];
count = 0;
datasetId = 0;
columnId = 0;
isShowingFieldComment = false;
/**
*
*
* @memberof SchemaComment
*/
notifications: ComputedProperty<Notifications> = inject();
2017-10-18 17:38:51 -07:00
SchemaCommentActions = SchemaCommentActions;
getComments = task(function*({ datasetId, columnId, comments }: IGetCommentsTaskArgs) {
const schemaComments: Array<IDatasetComment> = yield readDatasetSchemaComments(datasetId, columnId);
const withHtmlComments = augmentObjectsWithHtmlComments(
schemaComments.map(({ text }) => <IDatasetColumn>{ comment: text })
);
comments.setObjects.call(comments, withHtmlComments);
2017-10-18 17:38:51 -07:00
}).drop();
actions = {
showComments(this: SchemaComment) {
2017-10-18 17:38:51 -07:00
const props = getProperties(this, ['datasetId', 'columnId', 'comments']);
set(this, 'isShowingFieldComment', true);
return get(this, 'getComments').perform(props);
},
hideComments(this: SchemaComment) {
2017-10-18 17:38:51 -07:00
return set(this, 'isShowingFieldComment', false);
},
async handleSchemaComment(this: SchemaComment, strategy: keyof typeof SchemaCommentActions) {
2017-10-18 17:38:51 -07:00
const [, { text }] = arguments;
const { datasetId, columnId, notifications, comments, getComments } = getProperties(this, [
2017-10-18 17:38:51 -07:00
'datasetId',
'columnId',
'notifications',
2017-10-18 17:38:51 -07:00
'comments',
'getComments'
]);
const { notify } = notifications;
2017-10-18 17:38:51 -07:00
assert(`Expected action to be one of ${Object.keys(SchemaCommentActions)}`, strategy in SchemaCommentActions);
const action = {
add: (): Promise<void> => createDatasetSchemaComment(datasetId, columnId, text),
modify: (): Promise<void> => updateDatasetSchemaComment(datasetId, columnId, text),
destroy: (): Promise<void> => deleteDatasetSchemaComment(datasetId, columnId)
}[strategy];
try {
await action();
notify(NotificationEvent.success, { content: 'Success!' });
2017-10-18 17:38:51 -07:00
getComments.perform({ datasetId, columnId, comments });
} catch (e) {
notify(NotificationEvent.error, { content: e.message });
2017-10-18 17:38:51 -07:00
}
return false;
}
};
}