@@ -8,21 +8,29 @@ var $osf = require('js/osfHelpers');
88
99var MESSAGE_TIMEOUT = 5000 ;
1010
11- var DEFAULT_FORWARD_BOOL = true ;
12-
1311/**
1412 * Knockout view model for the Forward node settings widget.
1513 */
16- var ViewModel = function ( url , nodeId ) {
14+ var ViewModel = function ( node , enabled , url , label ) {
1715
1816 var self = this ;
1917
20- // Forward configuration
21- self . url = ko . observable ( ) . extend ( {
18+ var forwardUrl = $osf . apiV2Url ( 'nodes/' + node . id + '/addons/forward/' ) ;
19+
20+ self . enabled = ko . observable ( enabled ) ;
21+ self . label = koHelpers . sanitizedObservable ( label ) ;
22+ self . url = ko . observable ( url ) . extend ( {
2223 ensureHttp : true ,
2324 url : true ,
2425 required : true
2526 } ) ;
27+
28+ // Flashed messages
29+ self . message = ko . observable ( '' ) ;
30+ self . messageClass = ko . observable ( 'text-info' ) ;
31+
32+ self . pendingRequest = ko . observable ( false ) ;
33+
2634 ko . validation . addAnonymousRule (
2735 self . url ,
2836 koHelpers . makeRegexValidator (
@@ -31,50 +39,54 @@ var ViewModel = function(url, nodeId) {
3139 false
3240 )
3341 ) ;
34- self . label = koHelpers . sanitizedObservable ( ) ;
35-
36- // Flashed messages
37- self . message = ko . observable ( '' ) ;
38- self . messageClass = ko . observable ( 'text-info' ) ;
3942
4043 self . validators = ko . validatedObservable ( {
4144 url : self . url ,
4245 } ) ;
4346
44-
45- /**
46- * Update the view model from data returned from the server.
47- */
48- self . updateFromData = function ( data ) {
49- self . url ( data . url ) ;
50- self . label ( data . label ) ;
51- } ;
52-
53- self . fetchFromServer = function ( ) {
54- $ . ajax ( {
55- type : 'GET' ,
56- url : url ,
57- dataType : 'json'
58- } ) . done ( function ( response ) {
59- self . updateFromData ( response ) ;
60- } ) . fail ( function ( xhr , textStatus , error ) {
61- self . changeMessage ( 'Could not retrieve Forward settings at ' +
62- 'this time. Please refresh ' +
63- 'the page. If the problem persists, email ' +
64- '<a href="mailto:support@osf.io">support@osf.io</a>.' ,
65- 'text-danger' ) ;
66- Raven . captureMessage ( 'Could not GET get Forward addon settings.' , {
67- extra : {
68- url : url ,
69- textStatus : textStatus ,
70- error : error
47+ self . enabled . subscribe ( function ( newValue ) {
48+ self . pendingRequest ( true ) ;
49+ if ( ! newValue ) {
50+ $osf . ajaxJSON (
51+ 'delete' ,
52+ forwardUrl ,
53+ { 'isCors' : true }
54+ ) . done ( function ( response ) {
55+ self . pendingRequest ( false ) ;
56+ } ) . fail ( function ( xhr , status , error ) {
57+ $osf . growl ( 'Error' , 'Unable to disable redirect link.' ) ;
58+ Raven . captureMessage ( 'Error disabling redirect link.' , {
59+ extra : {
60+ url : forwardUrl , status : status , error : error
61+ }
62+ } ) ;
63+ } ) ;
64+ } else {
65+ $osf . ajaxJSON (
66+ 'post' ,
67+ forwardUrl ,
68+ {
69+ 'data' : {
70+ 'data' : {
71+ 'id' : 'forward' ,
72+ 'type' : 'node_addons' ,
73+ 'attributes' : { }
74+ }
75+ } ,
76+ 'isCors' : true
7177 }
78+ ) . done ( function ( response ) {
79+ self . pendingRequest ( false ) ;
80+ } ) . fail ( function ( xhr , status , error ) {
81+ $osf . growl ( 'Error' , 'Unable to enable redirect link.' ) ;
82+ Raven . captureMessage ( 'Error enabling redirect link.' , {
83+ extra : {
84+ url : forwardUrl , status : status , error : error
85+ }
86+ } ) ;
7287 } ) ;
73- } ) ;
74- } ;
75-
76- // Initial fetch from server
77- self . fetchFromServer ( ) ;
88+ }
89+ } ) ;
7890
7991 function onSubmitSuccess ( ) {
8092 if ( self . url ( ) == null ) {
@@ -103,24 +115,45 @@ var ViewModel = function(url, nodeId) {
103115 }
104116 else {
105117 self . changeMessage (
106- 'Could not change settings. Please try again later.' ,
118+ 'Could not change redirect link settings. Please try again later.' ,
107119 'text-danger'
108120 ) ;
121+ Raven . captureMessage ( 'Error updating redirect link.' , {
122+ extra : {
123+ url : forwardUrl , status : status , error : error
124+ }
125+ } ) ;
109126 }
110127 }
111128
112129 /**
113130 * Submit new settings.
114131 */
115132 self . submitSettings = function ( ) {
116- $osf . putJSON (
117- url ,
118- ko . toJS ( self )
119- ) . done (
120- onSubmitSuccess
121- ) . fail (
122- onSubmitError
123- ) ;
133+ self . pendingRequest ( true ) ;
134+ $osf . ajaxJSON (
135+ 'put' ,
136+ forwardUrl ,
137+ {
138+ 'data' : {
139+ 'data' : {
140+ 'id' : 'forward' ,
141+ 'type' : 'node_addons' ,
142+ 'attributes' : {
143+ 'url' : self . url ( ) ,
144+ 'label' : self . label ( )
145+ }
146+ }
147+ } ,
148+ 'isCors' : true
149+ }
150+ ) . done ( function ( response ) {
151+ onSubmitSuccess ( )
152+ self . pendingRequest ( false ) ;
153+ } ) . fail ( function ( response ) {
154+ onSubmitError ( )
155+ self . pendingRequest ( false ) ;
156+ } ) ;
124157 } ;
125158
126159 /** Change the flashed message. */
@@ -140,9 +173,9 @@ var ViewModel = function(url, nodeId) {
140173} ;
141174
142175// Public API
143- function ForwardConfig ( selector , url , nodeId ) {
176+ function ForwardConfig ( selector , node , enabled , url , label ) {
144177 var self = this ;
145- self . viewModel = new ViewModel ( url , nodeId ) ;
178+ self . viewModel = new ViewModel ( node , enabled , url , label ) ;
146179 $osf . applyBindings ( self . viewModel , selector ) ;
147180}
148181
0 commit comments