1 util = require './util'
10 class SaveStateHandler
11 constructor: (tree_widget) ->
12 @tree_widget = tree_widget
15 state = JSON.stringify(@getState())
17 if @tree_widget.options.onSetStateFromStorage
18 @tree_widget.options.onSetStateFromStorage(state)
19 else if @supportsLocalStorage()
32 getStateFromStorage: ->
33 json_data = @_loadFromStorage()
36 return @_parseState(json_data)
40 _parseState: (json_data) ->
41 state = $.parseJSON(json_data)
43 # Check if selected_node is an int (instead of an array)
44 if state and state.selected_node and isInt(state.selected_node)
46 state.selected_node = [state.selected_node]
51 if @tree_widget.options.onGetStateFromStorage
52 return @tree_widget.options.onGetStateFromStorage()
53 else if @supportsLocalStorage()
54 return localStorage.getItem(
59 return $.cookie(@getCookieName())
67 @tree_widget.tree.iterate((node) ->
73 open_nodes.push(node.id)
79 getSelectedNodeIds = =>
80 return (n.id for n in @tree_widget.getSelectedNodes())
83 open_nodes: getOpenNodeIds(),
84 selected_node: getSelectedNodeIds()
88 # Don't handle nodes that are loaded on demand
90 # result: must load on demand
91 setInitialState: (state) ->
95 must_load_on_demand = @_openInitialNodes(state.open_nodes)
97 @_selectInitialNodes(state.selected_node)
99 return must_load_on_demand
101 _openInitialNodes: (node_ids) ->
102 must_load_on_demand = false
104 for node_id in node_ids
105 node = @tree_widget.getNodeById(node_id)
108 if not node.load_on_demand
111 must_load_on_demand = true
113 return must_load_on_demand
115 _selectInitialNodes: (node_ids) ->
118 for node_id in node_ids
119 node = @tree_widget.getNodeById(node_id)
124 @tree_widget.select_node_handler.addToSelection(node)
126 return select_count != 0
128 setInitialStateOnDemand: (state, cb_finished) ->
130 @_setInitialStateOnDemand(state.open_nodes, state.selected_node, cb_finished)
134 _setInitialStateOnDemand: (node_ids, selected_nodes, cb_finished) ->
140 for node_id in node_ids
141 node = @tree_widget.getNodeById(node_id)
144 new_nodes_ids.push(node_id)
146 if not node.is_loading
147 if node.load_on_demand
148 loadAndOpenNode(node)
150 @tree_widget._openNode(node, false)
152 node_ids = new_nodes_ids
154 if @_selectInitialNodes(selected_nodes)
155 @tree_widget._refreshElements()
157 if loading_count == 0
160 loadAndOpenNode = (node) =>
162 @tree_widget._openNode(
173 if typeof @tree_widget.options.saveState is 'string'
174 return @tree_widget.options.saveState
178 supportsLocalStorage: ->
180 # Is local storage supported?
184 # Check if it's possible to store an item. Safari does not allow this in private browsing mode.
186 key = '_storage_test'
187 sessionStorage.setItem(key, true)
188 sessionStorage.removeItem(key)
194 if not @_supportsLocalStorage?
195 @_supportsLocalStorage = testSupport()
197 return @_supportsLocalStorage
199 getNodeIdToBeSelected: ->
200 state = @getStateFromStorage()
202 if state and state.selected_node
203 return state.selected_node[0]
208 module.exports = SaveStateHandler