2016-08-04 17:44:47 -07:00
function setOwnerNameAutocomplete ( controller )
{
if ( ! controller )
{
return ;
}
$ ( '.userEntity' ) . blur ( function ( data ) {
var userEntitiesMaps = controller . get ( "userEntitiesMaps" ) ;
var value = this . value ;
if ( userEntitiesMaps [ value ] )
{
controller . set ( "showMsg" , false ) ;
var owners = controller . get ( "owners" ) ;
for ( var i = 0 ; i < owners . length ; i ++ )
{
if ( owners [ i ] . userName == value )
{
Ember . set ( owners [ i ] , "name" , userEntitiesMaps [ value ] ) ;
if ( userEntitiesMaps [ value ] )
{
Ember . set ( owners [ i ] , "isGroup" , false ) ;
}
else
{
Ember . set ( owners [ i ] , "isGroup" , true ) ;
}
}
}
}
else
{
controller . set ( "showMsg" , true ) ;
controller . set ( "alertType" , "alert-danger" ) ;
controller . set ( "ownerMessage" , "The user name '" + value + "' is invalid" ) ;
}
} ) ;
$ ( '.userEntity' ) . autocomplete ( {
select : function ( event , ui )
{
var userEntitiesMaps = controller . get ( "userEntitiesMaps" ) ;
var value = ui . item . value ;
if ( value in userEntitiesMaps )
{
var owners = controller . get ( "owners" ) ;
for ( var i = 0 ; i < owners . length ; i ++ )
{
if ( owners [ i ] . userName == value )
{
controller . set ( "showMsg" , false ) ;
Ember . set ( owners [ i ] , "name" , userEntitiesMaps [ value ] ) ;
if ( userEntitiesMaps [ value ] )
{
Ember . set ( owners [ i ] , "isGroup" , false ) ;
}
else
{
Ember . set ( owners [ i ] , "isGroup" , true ) ;
}
}
}
}
} ,
source : function ( request , response ) {
var userEntitiesSource = controller . get ( "userEntitiesSource" ) ;
var results = $ . ui . autocomplete . filter ( userEntitiesSource , request . term ) ;
response ( results . slice ( 0 , 20 ) ) ;
}
} ) ;
}
App . EmberSelectorComponent = Ember . Component . extend ( {
2016-10-10 09:29:16 -07:00
class : 'form-control' ,
content : [ ] ,
init ( ) {
this . _super ( ... arguments ) ;
this . updateContent ( ) ;
} ,
onSelectionChanged : Ember . observer ( 'selected' , function ( ) {
this . updateContent ( ) ;
} ) ,
/ * *
* Parse and transform the values list into a list of objects with the currently
* selected option flagged as ` isSelected `
* /
updateContent ( ) {
let selected = this . get ( 'selected' ) || '' ;
selected && ( selected = String ( selected ) . toLowerCase ( ) ) ;
const options = this . get ( 'values' ) || [ ] ;
const content = options . map ( option => {
if ( typeof option === 'object' && typeof option . value !== 'undefined' ) {
const isSelected = String ( option . value ) . toLowerCase ( ) === selected ;
return { value : option . value , label : option . label , isSelected } ;
2016-08-04 17:44:47 -07:00
}
2016-10-10 09:29:16 -07:00
return { value : option , isSelected : String ( option ) . toLowerCase ( ) === selected } ;
} ) ;
this . set ( 'content' , content ) ;
} ,
actions : {
// Reflect UI changes in the component and bubble the `selectionDidChange` action
change ( ) {
const { selectedIndex } = this . $ ( 'select' ) [ 0 ] ;
const values = this . get ( 'values' ) ;
const _selected = values [ selectedIndex ] ;
const selected = typeof _selected . value !== 'undefined' ? _selected . value : _selected ;
this . set ( 'selected' , selected ) ;
this . sendAction ( 'selectionDidChange' , _selected ) ;
2016-08-04 17:44:47 -07:00
}
2016-10-10 09:29:16 -07:00
}
} ) ;
// Component wrapper for a droppable DOM region
App . DropRegionComponent = Ember . Component . extend ( {
classNames : [ 'drop-region' ] ,
classNameBindings : [ 'dragClass' ] ,
dragClass : 'deactivated' ,
dragLeave ( e ) {
e . preventDefault ( ) ;
this . set ( 'dragClass' , 'deactivated' ) ;
} ,
dragOver ( e ) {
e . preventDefault ( ) ;
this . set ( 'dragClass' , 'activated' ) ;
} ,
drop ( e ) {
const data = e . dataTransfer . getData ( 'text/data' ) ;
this . sendAction ( 'dropped' , data , this . get ( 'param' ) ) ;
this . set ( 'dragClass' , 'deactivated' ) ;
}
} ) ;
// Component wrapper for a draggable item
App . DraggableItemComponent = Ember . Component . extend ( {
tagName : 'span' ,
classNames : [ 'draggable-item' ] ,
attributeBindings : [ 'draggable' ] ,
draggable : 'true' ,
dragStart ( e ) {
return e . dataTransfer . setData ( 'text/data' , this . get ( 'content' ) ) ;
2016-08-04 17:44:47 -07:00
}
} ) ;
App . DatasetPropertyComponent = Ember . Component . extend ( {
} ) ;
App . DatasetSchemaComponent = Ember . Component . extend ( {
buildJsonView : function ( ) {
var dataset = this . get ( "dataset" ) ;
var schema = JSON . parse ( dataset . schema )
setTimeout ( function ( ) {
$ ( "#json-viewer" ) . JSONView ( schema )
} , 500 ) ;
} ,
actions : {
2016-08-31 16:50:20 -07:00
getSchema : function ( ) {
var _this = this
var id = _this . get ( 'dataset.id' )
var columnUrl = 'api/v1/datasets/' + id + "/columns" ;
_this . set ( "isTable" , true ) ;
_this . set ( "isJSON" , false ) ;
$ . get ( columnUrl , function ( data ) {
if ( data && data . status == "ok" )
{
if ( data . columns && ( data . columns . length > 0 ) )
{
_this . set ( "hasSchemas" , true ) ;
data . columns = data . columns . map ( function ( item , idx ) {
item . commentHtml = marked ( item . comment ) . htmlSafe ( )
return item
} )
_this . set ( "schemas" , data . columns ) ;
setTimeout ( initializeColumnTreeGrid , 500 ) ;
}
else
{
_this . set ( "hasSchemas" , false ) ;
}
}
else
{
_this . set ( "hasSchemas" , false ) ;
}
} ) ;
} ,
2016-08-04 17:44:47 -07:00
setView : function ( view ) {
switch ( view ) {
case "tabular" :
this . set ( 'isTable' , true ) ;
this . set ( 'isJSON' , false ) ;
$ ( '#json-viewer' ) . hide ( ) ;
$ ( '#json-table' ) . show ( ) ;
break ;
case "json" :
this . set ( 'isTable' , false ) ;
this . set ( 'isJSON' , true ) ;
this . buildJsonView ( ) ;
$ ( '#json-table' ) . hide ( ) ;
$ ( '#json-viewer' ) . show ( ) ;
break ;
default :
this . set ( 'isTable' , true ) ;
this . set ( 'isJSON' , false ) ;
$ ( '#json-viewer' ) . hide ( ) ;
$ ( '#json-table' ) . show ( ) ;
}
}
}
} ) ;
App . DatasetSampleComponent = Ember . Component . extend ( {
} ) ;
2016-08-09 11:34:46 -07:00
App . DatasetAccessComponent = Ember . Component . extend ( {
} ) ;
2016-08-04 17:44:47 -07:00
App . DatasetImpactComponent = Ember . Component . extend ( {
} ) ;
2016-11-23 15:19:29 -08:00
App . DatasetOwnerListComponent = Ember . Component . extend ( {
tagName : 'section' ,
2016-11-30 14:31:03 -08:00
classNames : [ 'dataset-owner-list' ] ,
ownersEmailList : Ember . computed ( 'owners' , function ( ) {
// Reduce owner email to a string containing emails, each separated by comma
return this . get ( 'owners' ) . mapBy ( 'email' ) . filter ( email => email ) . join ( ', ' ) ;
} ) ,
2016-11-23 15:19:29 -08:00
} ) ;
2016-10-10 09:29:16 -07:00
App . DatasetComplianceComponent = Ember . Component . extend ( {
searchTerm : '' ,
complianceType : Ember . computed . alias ( 'privacyCompliancePolicy.complianceType' ) ,
get complianceTypes ( ) {
return [ 'CUSTOM_PURGE' , 'AUTO_PURGE' , 'RETENTION_PURGE' , 'NOT_APPLICABLE' ] . map ( complianceType => ( {
value : complianceType ,
label : complianceType . replace ( '_' , ' ' ) . toLowerCase ( ) . capitalize ( )
} ) )
} ,
// Cached list of dataset field names
datasetSchemaFieldNames : Ember . computed ( 'datasetSchemaFieldsAndTypes' , function ( ) {
return this . get ( 'datasetSchemaFieldsAndTypes' ) . mapBy ( 'name' ) ;
} ) ,
matchingFields : Ember . computed ( 'searchTerm' , 'datasetSchemaFieldsAndTypes' , function ( ) {
if ( this . get ( 'datasetSchemaFieldsAndTypes' ) ) {
const searchTerm = this . get ( 'searchTerm' ) ;
const matches = $ . ui . autocomplete . filter ( this . get ( 'datasetSchemaFieldNames' ) , searchTerm ) ;
return matches . map ( value => {
const { type } = this . get ( 'datasetSchemaFieldsAndTypes' ) . filterBy ( 'name' , value ) . get ( 'firstObject' ) ;
const dataType = Array . isArray ( type ) && type . toString ( ) . toUpperCase ( ) ;
return {
value ,
dataType
} ;
} ) ;
}
} ) ,
/ * *
* Aliases compliancePurgeEntities on privacyCompliancePolicy , and transforms each nested comma - delimited identifierField string
* into an array of fields that can easily be iterated over . Dependency on each identifierField will update
* UI on updates
* /
purgeEntities : Ember . computed ( 'privacyCompliancePolicy.compliancePurgeEntities.@each.identifierField' , function ( ) {
const compliancePurgeEntities = this . get ( 'privacyCompliancePolicy.compliancePurgeEntities' ) ;
// Type ENUM is locally saved in the client.
// The user is able to add a values to the identifier types that are not provided in the schema returned by the server.
// Values are manually extracted from Nuage schema at develop time
const purgeableEntityFieldIdentifierTypes = [
'MEMBER_ID' , 'SUBJECT_MEMBER_ID' , 'URN' , 'SUBJECT_URN' , 'COMPANY_ID' , 'GROUP_ID' , 'CUSTOMER_ID'
] ;
// Create an object list for each purgeableEntityFieldIdentifier with a mapping to label and identifierField value
return purgeableEntityFieldIdentifierTypes . map ( identifierType => {
// Find entity with matching identifierType that has been remotely persisted
const savedPurgeEntity = compliancePurgeEntities . filterBy ( 'identifierType' , identifierType ) . shift ( ) ;
const label = identifierType . replace ( /_/g , ' ' ) . toLowerCase ( ) . capitalize ( ) ;
return {
identifierType ,
label ,
identifierField : savedPurgeEntity ? savedPurgeEntity . identifierField . split ( ',' ) : [ ]
} ;
} ) ;
} ) ,
didRender ( ) {
const $typeahead = this . $ ( '#compliance-typeahead' ) || [ ] ;
if ( $typeahead . length ) {
this . enableTypeaheadOn ( $typeahead ) ;
}
} ,
enableTypeaheadOn ( selector ) {
selector . autocomplete ( {
minLength : 0 ,
source : request => {
const { term = '' } = request ;
this . set ( 'searchTerm' , term ) ;
}
} ) ;
} ,
/ * *
* Returns a compliancePurgeEntity matching the given Id .
* @ param { string } id value representing the identifierType
* @ returns { * }
* /
getPurgeEntity ( id ) {
// There should be only one match in the resulting array
return this . get ( 'privacyCompliancePolicy.compliancePurgeEntities' )
. filterBy ( 'identifierType' , id )
. get ( 'firstObject' ) ;
} ,
addPurgeEntityToComplianceEntities ( identifierType ) {
this . get ( 'privacyCompliancePolicy.compliancePurgeEntities' ) . addObject ( { identifierType , identifierField : '' } ) ;
return this . getPurgeEntity ( identifierType ) ;
} ,
/ * *
* Internal abstraction for adding and removing an Id from an identifierField
* @ param { string } fieldValue name of identifier to add / remove from identifier type
* @ param { string } idType the identifierType for a compliancePurgeEntity
* @ param { string } toggleOperation string representing the operation to be performed
* @ returns { boolean | * } true on success
* @ private
* /
_togglePurgeIdOnIdentifierField ( fieldValue , idType , toggleOperation ) {
function updateIdentifierFieldOn ( entity , updatedValue ) {
return Ember . set ( entity , 'identifierField' , updatedValue ) ;
}
const op = {
/ * *
* Adds the fieldValue to the specified idType if available , otherwise creates a new compliancePurgeEntity
* @ param purgeableEntityField
* @ returns { * | Object } the updated compliancePurgeEntity
* /
add : ( purgeableEntityField = this . addPurgeEntityToComplianceEntities ( idType ) ) => {
const currentId = purgeableEntityField . identifierField ;
const updatedIds = currentId . length ? currentId . split ( ',' ) . addObject ( fieldValue ) . join ( ',' ) : fieldValue ;
return updateIdentifierFieldOn ( purgeableEntityField , updatedIds ) ;
} ,
/ * *
* Removes the fieldValue from the specified idType if available , otherwise function is no - op
* @ param purgeableEntityField
* @ returns { * | Object } the updated compliancePurgeEntity
* /
remove : ( purgeableEntityField ) => {
if ( purgeableEntityField ) {
const currentId = purgeableEntityField . identifierField ;
const updatedIds = currentId . length ? currentId . split ( ',' ) . removeObject ( fieldValue ) . join ( ',' ) : '' ;
return updateIdentifierFieldOn ( purgeableEntityField , updatedIds ) ;
}
}
} [ toggleOperation ] ;
return typeof op === 'function' && op ( this . getPurgeEntity ( idType ) ) ;
} ,
actions : {
addPurgeId ( name , idType ) {
this . _togglePurgeIdOnIdentifierField ( name , idType , ` add ` ) ;
} ,
removePurgeId ( name , idType ) {
this . _togglePurgeIdOnIdentifierField ( name , idType , ` remove ` ) ;
} ,
updateComplianceType ( { value } ) {
this . set ( 'privacyCompliancePolicy.complianceType' , value ) ;
} ,
saveCompliance ( ) {
this . get ( 'onSave' ) ( ) ;
return false ;
} ,
// Rolls back changes made to the compliance spec to current
// server state
resetCompliance ( ) {
this . get ( 'onReset' ) ( ) ;
}
}
} ) ;
App . DatasetConfidentialComponent = Ember . Component . extend ( {
searchTerm : '' ,
retention : Ember . computed . alias ( 'securitySpecification.retentionPolicy.retentionType' ) ,
geographicAffinity : Ember . computed . alias ( 'securitySpecification.geographicAffinity.affinity' ) ,
recordOwnerType : Ember . computed . alias ( 'securitySpecification.recordOwnerType' ) ,
datasetSchemaFieldNames : Ember . computed ( 'datasetSchemaFieldsAndTypes' , function ( ) {
return this . get ( 'datasetSchemaFieldsAndTypes' ) . mapBy ( 'name' ) ;
} ) ,
matchingFields : Ember . computed ( 'searchTerm' , 'datasetSchemaFieldsAndTypes' , function ( ) {
if ( this . get ( 'datasetSchemaFieldsAndTypes' ) ) {
const searchTerm = this . get ( 'searchTerm' ) ;
const matches = $ . ui . autocomplete . filter ( this . get ( 'datasetSchemaFieldNames' ) , searchTerm ) ;
return matches . map ( value => {
const { type } = this . get ( 'datasetSchemaFieldsAndTypes' ) . filterBy ( 'name' , value ) . get ( 'firstObject' ) ;
const dataType = Array . isArray ( type ) && type . toString ( ) . toUpperCase ( ) ;
return {
value ,
dataType
} ;
} ) ;
}
} ) ,
didRender ( ) {
const $typeahead = this . $ ( '#confidential-typeahead' ) || [ ] ;
if ( $typeahead . length ) {
this . enableTypeaheadOn ( $typeahead ) ;
}
} ,
enableTypeaheadOn ( selector ) {
selector . autocomplete ( {
minLength : 0 ,
source : request => {
const { term = '' } = request ;
this . set ( 'searchTerm' , term ) ;
}
} ) ;
} ,
get recordOwnerTypes ( ) {
return [ 'MEMBER' , 'CUSTOMER' , 'JOINT' , 'INTERNAL' , 'COMPANY' ] . map ( ownerType => ( {
value : ownerType ,
label : ownerType . toLowerCase ( ) . capitalize ( )
} ) ) ;
} ,
get retentionTypes ( ) {
return [ 'LIMITED' , 'LEGAL_HOLD' , 'UNLIMITED' ] . map ( retention => ( {
value : retention ,
label : retention . replace ( '_' , ' ' ) . toLowerCase ( ) . capitalize ( )
} ) ) ;
} ,
get affinityTypes ( ) {
return [ 'LIMITED' , 'EXCLUDED' ] . map ( affinity => ( {
value : affinity ,
label : affinity . toLowerCase ( ) . capitalize ( )
} ) ) ;
} ,
classification : Ember . computed ( 'securitySpecification.classification' , function ( ) {
const confidentialClassification = this . get ( 'securitySpecification.classification' ) ;
const formatAsCapitalizedStringWithSpaces = string => string . replace ( /[A-Z]/g , match => ` ${ match } ` ) . capitalize ( ) ;
return Object . keys ( confidentialClassification ) . map ( classifier => ( {
key : classifier ,
label : formatAsCapitalizedStringWithSpaces ( classifier ) ,
values : Ember . get ( confidentialClassification , classifier )
} ) ) ;
} ) ,
_toggleOnClassification ( classifier , key , operation ) {
this . get ( ` securitySpecification.classification. ${ key } ` ) [ ` ${ operation } Object ` ] ( classifier ) ;
} ,
actions : {
addToClassification ( classifier , classifierKey ) {
this . _toggleOnClassification ( classifier , classifierKey , ` add ` ) ;
} ,
removeFromClassification ( classifier , classifierKey ) {
this . _toggleOnClassification ( classifier , classifierKey , ` remove ` ) ;
} ,
updateRetentionType ( { value } ) {
this . set ( 'securitySpecification.retentionPolicy.retentionType' , value ) ;
} ,
updateGeographicAffinity ( { value } ) {
this . set ( 'securitySpecification.geographicAffinity.affinity' , value ) ;
} ,
updateRecordOwnerType ( { value } ) {
this . set ( 'securitySpecification.recordOwnerType' , value ) ;
} ,
saveSecuritySpecification ( ) {
this . get ( 'onSave' ) ( ) ;
return false ;
} ,
approveCompliance ( ) {
//TODO: not implemented
} ,
disapproveCompliance ( ) {
//TODO: not implemented
} ,
// Rolls back changes made to the compliance spec to current
// server state
resetSecuritySpecification ( ) {
this . get ( 'onReset' ) ( ) ;
}
}
} ) ;
2016-08-04 17:44:47 -07:00
App . DatasetAuthorComponent = Ember . Component . extend ( {
2016-11-23 15:19:29 -08:00
$ownerTable : null ,
2016-11-23 01:11:03 -08:00
didInsertElement ( ) {
this . _super ( ... arguments ) ;
2016-11-23 15:19:29 -08:00
// Cache reference to element on component
this . set ( '$ownerTable' , this . $ ( '[data-attribute=owner-table]' ) ) ;
2016-11-23 01:11:03 -08:00
// Apply jQuery sortable plugin to element
2016-11-23 15:19:29 -08:00
this . get ( '$ownerTable' )
2016-11-23 01:11:03 -08:00
. sortable ( {
start : ( e , { item } ) => this . set ( 'startPosition' , item . index ( ) ) ,
update : ( e , { item } ) => {
const startPosition = this . get ( 'startPosition' ) ;
const endPosition = item . index ( ) ; // New position where UI element was dropped
const owners = this . get ( 'owners' ) || [ ] ;
// Updates the owners array to reflect the UI position changes
if ( owners . length ) {
const _owners = owners . slice ( 0 ) ;
const updatedOwner = _owners . splice ( startPosition , 1 ) . pop ( ) ;
_owners . splice ( endPosition , 0 , updatedOwner ) ;
owners . setObjects ( _owners ) ;
setOwnerNameAutocomplete ( this . controller ) ;
}
}
} ) ;
} ,
2016-11-23 15:19:29 -08:00
willDestroyElement ( ) {
this . _super ( ... arguments ) ;
// Removes the sortable functionality from the cached DOM element reference
this . get ( '$ownerTable' ) . sortable ( 'destroy' ) ;
} ,
2016-08-04 17:44:47 -07:00
actions : {
addOwner : function ( data ) {
var owners = data ;
var controller = this . get ( "parentController" ) ;
var currentUser = this . get ( "currentUser" ) ;
var addedOwner = { "userName" : "Owner" , "email" : null , "name" : "" , "isGroup" : false ,
"namespace" : "urn:li:griduser" , "type" : "Producer" , "subType" : null , "sortId" : 0 } ;
var userEntitiesSource = controller . get ( "userEntitiesSource" ) ;
var userEntitiesMaps = controller . get ( "userEntitiesMaps" ) ;
var exist = false ;
if ( owners && owners . length > 0 )
{
owners . forEach ( function ( owner ) {
if ( owner . userName == addedOwner . userName )
{
exist = true ;
}
} ) ;
}
if ( ! exist )
{
owners . unshiftObject ( addedOwner ) ;
setTimeout ( function ( ) {
setOwnerNameAutocomplete ( controller )
} , 500 ) ;
}
else
{
console . log ( "The owner is already exist" ) ;
}
} ,
removeOwner : function ( owners , owner ) {
if ( owners && owner )
{
owners . removeObject ( owner ) ;
}
} ,
2016-09-19 16:10:23 -07:00
confirmOwner : function ( owner , confirm ) {
var obj = $ ( '#loggedInUser' ) ;
if ( obj )
{
var loggedInUser = obj . attr ( "title" ) ;
if ( loggedInUser && owner )
{
if ( confirm )
{
Ember . set ( owner , "confirmedBy" , loggedInUser ) ;
}
else
{
Ember . set ( owner , "confirmedBy" , null ) ;
}
}
}
} ,
2016-08-04 17:44:47 -07:00
updateOwners : function ( owners ) {
_this = this ;
controller = this . get ( "parentController" ) ;
var showMsg = controller . get ( "showMsg" ) ;
if ( showMsg )
{
return ;
}
var model = controller . get ( "model" ) ;
if ( ! model || ! model . id )
{
return ;
}
var url = "/api/v1/datasets/" + model . id + "/owners" ;
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' ) ;
$ . ajax ( {
url : url ,
method : 'POST' ,
header : {
'Csrf-Token' : token
} ,
data : {
csrfToken : token ,
owners : JSON . stringify ( owners )
}
} ) . done ( function ( data , txt , xhr ) {
if ( data . status == "success" )
{
_this . set ( 'showMsg' , true ) ;
_this . set ( 'alertType' , "alert-success" ) ;
_this . set ( 'ownerMessage' , "Ownership successfully updated." ) ;
}
else
{
_this . set ( 'showMsg' , true ) ;
_this . set ( 'alertType' , "alert-danger" ) ;
_this . set ( 'ownerMessage' , "Ownership update failed." ) ;
}
} ) . fail ( function ( xhr , txt , error ) {
_this . set ( 'showMsg' , true ) ;
_this . set ( 'alertType' , "alert-danger" ) ;
_this . set ( 'ownerMessage' , "Ownership update failed." ) ;
} )
}
}
} ) ;
App . DatasetRelationsComponent = Ember . Component . extend ( {
} ) ;
App . MetricDetailComponent = Ember . Component . extend ( {
} ) ;
2015-11-19 14:39:21 -08:00
App . DatasetFavoriteComponent = Ember . Component . extend ( {
actions : {
favorites : function ( dataset ) {
var url = '/api/v1/datasets/' + dataset . id + '/favorite'
var method = ! dataset . isFavorite ? 'POST' : 'DELETE'
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' )
var _this = this
$ . ajax ( {
url : url ,
method : method ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : {
csrfToken : token
}
} ) . done ( function ( data , txt , xhr ) {
_this . set ( 'dataset.isFavorite' , ! dataset . isFavorite )
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not update dataset favorite.' )
} )
}
}
} )
2016-02-04 04:59:58 -08:00
App . DatasetOwnerComponent = Ember . Component . extend ( {
actions : {
owned : function ( dataset ) {
var url = '/api/v1/datasets/' + dataset . id + '/own' ;
var method = ! dataset . isOwned ? 'POST' : 'DELETE' ;
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' ) ;
var _this = this ;
$ . ajax ( {
url : url ,
method : method ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : {
csrfToken : token
}
} ) . done ( function ( data , txt , xhr ) {
if ( data . status == 'success' )
{
_this . set ( 'dataset.isOwned' , ! dataset . isOwned ) ;
_this . set ( 'dataset.owners' , data . owners ) ;
}
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not update dataset owner.' )
} )
}
}
} )
2016-02-08 02:41:06 -08:00
var insertAtCursor = function ( myField , myValue , newline ) {
if ( myField [ 0 ] . selectionStart || myField [ 0 ] . selectionStart == '0' ) {
var startPos = myField [ 0 ] . selectionStart ;
var endPos = myField [ 0 ] . selectionEnd ;
var value ;
if ( newline )
{
value = myField . val ( ) . substring ( 0 , startPos ) + '\n' +
myValue + myField . val ( ) . substring ( endPos , myField . val ( ) . length ) ;
}
else
{
value = myField . val ( ) . substring ( 0 , startPos ) +
myValue + myField . val ( ) . substring ( endPos , myField . val ( ) . length ) ;
}
myField . val ( value ) ;
myField [ 0 ] . selectionEnd = myField . selectionStart = startPos + myValue . length ;
} else {
var value ;
if ( newline )
{
value = myField . val ( ) + '\n' + myValue ;
}
else
{
value = myField . val ( ) + myValue ;
}
myField . val ( value ) ;
}
} ;
var insertListAtCursor = function ( myField , myValue , number ) {
if ( myField [ 0 ] . selectionStart || myField [ 0 ] . selectionStart == '0' ) {
var startPos = myField [ 0 ] . selectionStart ;
var endPos = myField [ 0 ] . selectionEnd ;
var selection ;
var value ;
if ( endPos > startPos )
{
selection = myField . val ( ) . substring ( startPos , endPos ) ;
}
var insertvalue = "" ;
if ( selection )
{
var lines = selection . split ( '\n' ) ;
for ( var i = 0 ; i < lines . length ; i ++ )
{
if ( number == 'numbered' )
{
insertvalue += ( i + 1 ) + "." ;
}
else if ( number == 'bulleted' )
{
insertvalue += "-" ;
}
else if ( number == 'blockquote' )
{
insertvalue += "> " ;
}
insertvalue += " " + lines [ i ] ;
if ( i < lines . length )
{
insertvalue += "\n" ;
}
}
value = myField . val ( ) . substring ( 0 , startPos ) + insertvalue + myField . val ( ) . substring ( endPos , myField . val ( ) . length ) ;
myField . val ( value ) ;
myField [ 0 ] . selectionEnd = myField . selectionStart = startPos + insertvalue . length ;
return ;
}
}
var lines = myValue . split ( '\n' ) ;
for ( var i = 0 ; i < lines . length ; i ++ )
{
if ( number == 'numbered' )
{
insertvalue += ( i + 1 ) + "." ;
}
else if ( number == 'bulleted' )
{
insertvalue += "-" ;
}
else if ( number == 'blockquote' )
{
insertvalue += ">" ;
}
insertvalue += " " + lines [ i ] ;
if ( i < lines . length )
{
insertvalue += "\n" ;
}
}
value = myField . val ( ) + '\n' + insertvalue ;
myField . val ( value ) ;
} ;
var insertSourcecodeAtCursor = function ( myField ) {
if ( myField [ 0 ] . selectionStart || myField [ 0 ] . selectionStart == '0' ) {
var startPos = myField [ 0 ] . selectionStart ;
var endPos = myField [ 0 ] . selectionEnd ;
var selection ;
var value ;
if ( endPos > startPos )
{
selection = myField . val ( ) . substring ( startPos , endPos ) ;
}
var insertvalue = "```\n" ;
if ( selection ) {
insertvalue += selection + '\n```' ;
}
else {
insertvalue += 'code text' + '\n```\n' ;
}
value = myField . val ( ) . substring ( 0 , startPos ) + insertvalue + myField . val ( ) . substring ( endPos , myField . val ( ) . length ) ;
myField . val ( value ) ;
myField [ 0 ] . selectionEnd = myField . selectionStart = startPos + insertvalue . length ;
return ;
}
var insertvalue = "```\n" ;
insertvalue += 'code text' + '\n```\n' ;
value = myField . val ( ) + '\n' + insertvalue ;
myField . val ( value ) ;
} ;
var insertImageAtCursor = function ( myField , param ) {
if ( myField [ 0 ] . selectionStart || myField [ 0 ] . selectionStart == '0' ) {
var startPos = myField [ 0 ] . selectionStart ;
var endPos = myField [ 0 ] . selectionEnd ;
var selection ;
var value ;
if ( endPos > startPos )
{
selection = myField . val ( ) . substring ( startPos , endPos ) ;
}
var insertvalue = "" ;
if ( selection && selection . length > 0 &&
( selection . substr ( 0 , 7 ) == 'http://' || selection . substr ( 0 , 7 ) == 'https:/' ) ) {
if ( param == 'image' )
{
insertvalue = "[alt text](" + selection + ")" ;
}
else
{
insertvalue = "[" + selection + "](" + selection + ")" ;
}
}
else {
if ( param == 'image' )
{
insertvalue = "" ;
}
else
{
insertvalue = "[example link](http://example.com/)" ;
}
}
value = myField . val ( ) . substring ( 0 , startPos ) + insertvalue + myField . val ( ) . substring ( endPos , myField . val ( ) . length ) ;
myField . val ( value ) ;
myField [ 0 ] . selectionEnd = myField . selectionStart = startPos + insertvalue . length ;
return ;
}
if ( param == 'image' )
{
insertvalue = "" ;
}
else
{
insertvalue = "[example link](http://example.com/)" ;
}
value = myField . val ( ) + '\n' + insertvalue ;
myField . val ( value ) ;
} ;
2015-11-19 14:39:21 -08:00
var datasetCommentsComponent = null ;
App . DatasetCommentsComponent = Ember . Component . extend ( {
totalPages : null ,
commentsLoading : true ,
itemsPerPage : 3 ,
page : 1 ,
count : null ,
comments : [ ] ,
comment : { } ,
isEdit : false ,
commentTypes : [
'Comment' ,
'Question' ,
'Description' ,
'Partition' ,
'ETL Schedule' ,
'Grain' ,
'DQ Issue'
] ,
getComments : function ( params ) {
if ( this . isDestroyed || this . isDestroying )
{
return ;
}
var _this = this ;
datasetCommentsComponent = this ;
var datasetId = this . get ( 'dataset.model.id' )
var url = '/api/v1/datasets/' + datasetId + '/comments'
params =
{ size : ( params || { } ) . size || this . get ( 'itemsPerPage' )
, page : ( params || { } ) . page || this . get ( 'page' )
}
url += '?' + $ . param ( params )
$ . get
( url
, function ( data ) {
if ( _this . isDestroyed || _this . isDestroying )
{
return ;
}
_this . set ( 'totalPages' , data . data . totalPages )
_this . set ( 'page' , data . data . page )
_this . set ( 'count' , data . data . count )
_this . set ( 'itemsPerPage' , data . data . itemsPerPage )
_this . set ( 'commentsLoading' , false )
var comments = data . data . comments
comments . forEach ( function ( cmnt ) {
2016-09-09 10:42:46 -07:00
cmnt . html = marked ( cmnt . text ) . htmlSafe ( ) ;
2015-11-19 14:39:21 -08:00
} )
2016-02-08 02:15:58 -08:00
_this . set ( 'comments' , comments ) ;
2015-11-19 14:39:21 -08:00
}
)
. fail ( function ( ) {
_this . set ( 'comments' , [ ] )
_this . set ( 'commentsLoading' , false )
} )
} . on ( 'init' ) ,
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' , { type : 'Comment' } ) ;
this . set ( 'comment.text' , this . defaultCommentText ( ) ) ;
} ,
actions : {
2016-02-08 02:41:06 -08:00
insertImageOrLink : function ( param ) {
var target = $ ( '#datasetcomment' ) ;
insertImageAtCursor ( target , param ) ;
var text = $ ( "#datasetComment-write > textarea" ) . val ( )
$ ( "#datasetComment-preview" ) . html ( marked ( text ) )
} ,
insertSourcecode : function ( ) {
var target = $ ( '#datasetcomment' ) ;
insertSourcecodeAtCursor ( target ) ;
var text = $ ( "#datasetComment-write > textarea" ) . val ( )
$ ( "#datasetComment-preview" ) . html ( marked ( text ) )
} ,
insertList : function ( param ) {
var target = $ ( '#datasetcomment' ) ;
var value = "Apple\nBananna\nOrange" ;
insertListAtCursor ( target , value , param ) ;
var text = $ ( "#datasetComment-write > textarea" ) . val ( )
$ ( "#datasetComment-preview" ) . html ( marked ( text ) )
} ,
insertElement : function ( param ) {
var target = $ ( '#datasetcomment' ) ;
var value ;
var selectedValue ;
if ( target [ 0 ] . selectionStart || target [ 0 ] . selectionStart == '0' ) {
var startPos = target [ 0 ] . selectionStart ;
var endPos = target [ 0 ] . selectionEnd ;
selectedValue = target . val ( ) . substring ( startPos , endPos ) ;
}
var insertedValue ;
if ( selectedValue )
{
insertedValue = selectedValue ;
}
else
{
insertedValue = param + " text" ;
}
switch ( param )
{
case 'bold' :
value = "**" + insertedValue + "**" ;
break ;
case 'italic' :
value = "*" + insertedValue + "*" ;
break ;
case 'heading_1' :
value = "#" + insertedValue + "#" ;
break ;
case 'heading_2' :
value = "##" + insertedValue + "##" ;
break ;
case 'heading_3' :
value = "###" + insertedValue + "###" ;
break ;
}
insertAtCursor ( target , value , false ) ;
var text = $ ( "#datasetComment-write > textarea" ) . val ( )
$ ( "#datasetComment-preview" ) . html ( marked ( text ) )
} ,
2016-02-08 02:15:58 -08:00
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 = $ ( '#datasetcomment' ) ;
2016-02-08 02:41:06 -08:00
insertAtCursor ( target , output . val ( ) , true ) ;
2016-02-08 02:15:58 -08:00
var text = $ ( "#datasetComment-write > textarea" ) . val ( ) ;
$ ( "#datasetComment-preview" ) . html ( marked ( text ) ) ;
} ) ;
renderTable ( ) ;
$ ( "#convertTableModal" ) . modal ( 'show' ) ;
} ,
2015-11-19 14:39:21 -08:00
remove : function ( comment ) {
var url = '/api/v1/datasets/' + comment . datasetId + '/comments/' + comment . id
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' )
var _this = this
$ . ajax ( {
url : url ,
method : 'DELETE' ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : {
csrfToken : token
}
} ) . done ( function ( data , txt , xhr ) {
_this . getComments ( )
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not remove comment.' )
} )
} ,
updatePreview : function ( ) {
var text = $ ( "#datasetComment-write > textarea" ) . val ( )
$ ( "#datasetComment-preview" ) . html ( marked ( text ) )
} ,
update : function ( ) {
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' )
var _this = this ;
comment . datasetId = this . get ( 'dataset.id' )
var cmnt = { }
cmnt . text = comment . text
cmnt . type = comment . type
var url = '/api/v1/datasets/' + comment . datasetId + '/comments/' + comment . id
cmnt . csrfToken = token
$ . ajax ( {
url : url ,
method : 'PUT' ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : {
csrfToken : token
}
} ) . done ( function ( data , txt , xhr ) {
_this . getComments ( )
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not update comment.' )
} )
} ,
create : function ( comment ) {
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' )
var _this = this ;
var cmnt = { }
var isEdit = this . get ( 'isEdit' )
cmnt . datasetId = this . get ( 'dataset.model.id' )
cmnt . text = comment . text
cmnt . type = comment . type
cmnt . id = comment . id
var url = '/api/v1/datasets/' + cmnt . datasetId + '/comments'
cmnt . csrfToken = token
console . log ( 'comment data: ' , cmnt )
$ . ajax ( {
url : url ,
method : 'POST' ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : cmnt
} ) . done ( function ( data , txt , xhr ) {
_this . getComments ( )
_this . send ( 'hideModal' )
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not create comment.' )
} )
} ,
showModal : function ( comment ) {
if ( comment ) {
this . set ( 'comment' , comment )
this . set ( 'isEdit' , true )
this . set ( 'isEdit' , false )
} else {
//this.set('comment', {type: 'Comment'})
this . setDefaultCommentText ( ) ;
$ ( "#datasetComment-preview" ) . html ( marked ( this . defaultCommentText ( ) ) ) ;
}
$ ( "#datasetCommentModal" ) . modal ( 'show' )
} ,
hideModal : function ( ) {
this . set ( 'isEdit' , false )
this . set ( 'comment' , { } )
$ ( "#datasetCommentModal" ) . modal ( 'hide' )
} ,
pageForward : function ( ) {
var totalPages = this . get ( 'totalPages' ) ;
var currentPage = this . get ( 'page' ) ;
if ( currentPage < totalPages )
{
this . getComments ( { page : this . get ( 'page' ) + 1 } ) ;
}
} ,
pageBack : function ( ) {
var currentPage = this . get ( 'page' ) ;
if ( currentPage > 1 )
{
this . getComments ( { page : this . get ( 'page' ) - 1 } ) ;
}
}
}
} )
App . DatasetWatchComponent = Ember . Component . extend ( {
actions : {
watch : function ( dataset ) {
var url = '/api/v1/datasets/' + dataset . id + '/watch'
var method = ! dataset . watchId ? 'POST' : 'DELETE'
if ( method . toLowerCase ( ) === 'delete' )
url += '/' + dataset . watchId
var token = $ ( "#csrfToken" ) . val ( ) . replace ( '/' , '' )
var _this = this
$ . ajax ( {
url : url ,
method : method ,
headers : {
'Csrf-Token' : token
} ,
dataType : 'json' ,
data : {
csrfToken : token ,
item _type : 'dataset' ,
notification _type : 'weekly'
}
} ) . done ( function ( data , txt , xhr ) {
_this . set ( 'dataset.isWatched' , ! dataset . isWatched )
_this . sendAction ( 'getDatasets' )
} ) . fail ( function ( xhr , txt , err ) {
console . log ( 'Error: Could not watch dataset.' )
} )
}
}
2016-10-10 09:29:16 -07:00
} ) ;