nexus site path corrected
[portal.git] / ecomp-portal-FE / client / bower_components / jqTree / src / save_state_handler.coffee
1 util = require './util'
2
3 indexOf = util.indexOf
4 isInt = util.isInt
5
6
7 $ = jQuery
8
9
10 class SaveStateHandler
11     constructor: (tree_widget) ->
12         @tree_widget = tree_widget
13
14     saveState: ->
15         state = JSON.stringify(@getState())
16
17         if @tree_widget.options.onSetStateFromStorage
18             @tree_widget.options.onSetStateFromStorage(state)
19         else if @supportsLocalStorage()
20             localStorage.setItem(
21                 @getCookieName(),
22                 state
23             )
24         else if $.cookie
25             $.cookie.raw = true
26             $.cookie(
27                 @getCookieName(),
28                 state,
29                 {path: '/'}
30             )
31
32     getStateFromStorage: ->
33         json_data = @_loadFromStorage()
34
35         if json_data
36             return @_parseState(json_data)
37         else
38             return null
39
40     _parseState: (json_data) ->
41         state = $.parseJSON(json_data)
42
43         # Check if selected_node is an int (instead of an array)
44         if state and state.selected_node and isInt(state.selected_node)
45             # Convert to array
46             state.selected_node = [state.selected_node]
47
48         return state
49
50     _loadFromStorage: ->
51         if @tree_widget.options.onGetStateFromStorage
52             return @tree_widget.options.onGetStateFromStorage()
53         else if @supportsLocalStorage()
54             return localStorage.getItem(
55                 @getCookieName()
56             )
57         else if $.cookie
58             $.cookie.raw = true
59             return $.cookie(@getCookieName())
60         else
61             return null
62
63     getState: ->
64         getOpenNodeIds = =>
65             open_nodes = []
66
67             @tree_widget.tree.iterate((node) ->
68                 if (
69                     node.is_open and
70                     node.id and
71                     node.hasChildren()
72                 )
73                     open_nodes.push(node.id)
74                 return true
75             )
76
77             return open_nodes
78
79         getSelectedNodeIds = =>
80             return (n.id for n in @tree_widget.getSelectedNodes())
81
82         return {
83             open_nodes: getOpenNodeIds(),
84             selected_node: getSelectedNodeIds()
85         }
86
87     # Set initial state
88     # Don't handle nodes that are loaded on demand
89     #
90     # result: must load on demand
91     setInitialState: (state) ->
92         if not state
93             return false
94         else
95             must_load_on_demand = @_openInitialNodes(state.open_nodes)
96
97             @_selectInitialNodes(state.selected_node)
98
99             return must_load_on_demand
100
101     _openInitialNodes: (node_ids) ->
102         must_load_on_demand = false
103
104         for node_id in node_ids
105             node = @tree_widget.getNodeById(node_id)
106
107             if node
108                 if not node.load_on_demand
109                     node.is_open = true
110                 else
111                     must_load_on_demand = true
112
113         return must_load_on_demand
114
115     _selectInitialNodes: (node_ids) ->
116         select_count = 0
117
118         for node_id in node_ids
119             node = @tree_widget.getNodeById(node_id)
120
121             if node
122                 select_count += 1
123
124                 @tree_widget.select_node_handler.addToSelection(node)
125
126         return select_count != 0
127
128     setInitialStateOnDemand: (state, cb_finished) ->
129         if state
130             @_setInitialStateOnDemand(state.open_nodes, state.selected_node, cb_finished)
131         else
132             cb_finished()
133
134     _setInitialStateOnDemand: (node_ids, selected_nodes, cb_finished) ->
135         loading_count = 0
136
137         openNodes = =>
138             new_nodes_ids = []
139
140             for node_id in node_ids
141                 node = @tree_widget.getNodeById(node_id)
142
143                 if not node
144                     new_nodes_ids.push(node_id)
145                 else
146                     if not node.is_loading
147                         if node.load_on_demand
148                             loadAndOpenNode(node)
149                         else
150                             @tree_widget._openNode(node, false)
151
152             node_ids = new_nodes_ids
153
154             if @_selectInitialNodes(selected_nodes)
155                 @tree_widget._refreshElements()
156
157             if loading_count == 0
158                 cb_finished()
159
160         loadAndOpenNode = (node) =>
161             loading_count += 1
162             @tree_widget._openNode(
163                 node,
164                 false,
165                 ->
166                     loading_count -= 1
167                     openNodes()
168             )
169
170         openNodes()
171
172     getCookieName: ->
173         if typeof @tree_widget.options.saveState is 'string'
174             return @tree_widget.options.saveState
175         else
176             return 'tree'
177
178     supportsLocalStorage: ->
179         testSupport = ->
180             # Is local storage supported?
181             if not localStorage?
182                 return false
183             else
184                 # Check if it's possible to store an item. Safari does not allow this in private browsing mode.
185                 try
186                     key = '_storage_test'
187                     sessionStorage.setItem(key, true)
188                     sessionStorage.removeItem(key)
189                 catch error
190                     return false
191
192                 return true
193
194         if not @_supportsLocalStorage?
195             @_supportsLocalStorage = testSupport()
196
197         return @_supportsLocalStorage
198
199     getNodeIdToBeSelected: ->
200         state = @getStateFromStorage()
201
202         if state and state.selected_node
203             return state.selected_node[0]
204         else
205             return null
206
207
208 module.exports = SaveStateHandler