rwiki 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/features/delete_page.feature +4 -7
- data/features/display_page.feature +20 -22
- data/features/fuzzy_finder.feature +8 -1
- data/features/history.feature +24 -13
- data/features/rename_page.feature +0 -2
- data/features/step_definitions/common_steps.rb +4 -0
- data/features/step_definitions/dialog_box_steps.rb +8 -1
- data/features/step_definitions/fuzzy_finder_steps.rb +4 -0
- data/features/step_definitions/tab_panel_steps.rb +4 -0
- data/features/step_definitions/tree_panel_steps.rb +23 -0
- data/features/step_definitions/wait_steps.rb +1 -1
- data/features/support/env.rb +4 -5
- data/features/tab_panel.feature +5 -5
- data/lib/rwiki/models/node.rb +4 -2
- data/public/javascripts/Rwiki.js +25 -30
- data/public/javascripts/Rwiki/EditorPanel.js +6 -3
- data/public/javascripts/Rwiki/EditorWindow.js +12 -5
- data/public/javascripts/Rwiki/Node.js +37 -0
- data/public/javascripts/Rwiki/NodeManager.js +15 -8
- data/public/javascripts/Rwiki/TabPanel.js +42 -31
- data/public/javascripts/Rwiki/TabPanel/PageTab.js +16 -4
- data/public/javascripts/Rwiki/TreePanel.js +24 -20
- data/rwiki.gemspec +4 -2
- data/views/layout.erb +1 -0
- metadata +6 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
@@ -16,19 +16,16 @@ Feature: Delete a page
|
|
16
16
|
Then I should not see the node titled "home"
|
17
17
|
|
18
18
|
@javascript
|
19
|
-
Scenario: Delete a page when tab is open
|
20
|
-
When I
|
21
|
-
And I
|
22
|
-
And I double click the node with path "./folder/subfolder"
|
23
|
-
And I click the node with path "./folder/subfolder/ruby.txt"
|
19
|
+
Scenario: Delete a page when a tab is open
|
20
|
+
When I open the page for the tree node with path "./home.txt"
|
21
|
+
And I open the page for the tree node with path "./folder/subfolder/ruby.txt"
|
24
22
|
And I right click the node with path "./home.txt"
|
25
23
|
And I follow "Delete node"
|
26
24
|
Then I should see dialog box titled "Confirm"
|
27
25
|
|
28
26
|
When I press "Yes" within the dialog box
|
29
27
|
Then I should not see the node titled "home"
|
30
|
-
And I should
|
31
|
-
| ruby |
|
28
|
+
And I should see active tab titled "ruby"
|
32
29
|
And I should see page title "Rwiki ./folder/subfolder/ruby.txt"
|
33
30
|
|
34
31
|
When I right click the node with path "./folder/subfolder/ruby.txt"
|
@@ -4,32 +4,30 @@ Feature: Display a page
|
|
4
4
|
Given I open the application
|
5
5
|
|
6
6
|
@javascript
|
7
|
-
Scenario: Display the
|
8
|
-
When I
|
7
|
+
Scenario Outline: Display the page
|
8
|
+
When I open the page for the tree node with path "<path>"
|
9
|
+
Then I should see active tab titled "<title>"
|
10
|
+
And I should see generated content for the node with path "<path>"
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
And I click the node with path "./folder/test.txt"
|
19
|
-
|
20
|
-
Then I should have the following open tabs:
|
21
|
-
| test |
|
22
|
-
And I should see page title "Rwiki ./folder/test.txt"
|
23
|
-
And I should see generated content for the node with path "./folder/test.txt"
|
12
|
+
Examples:
|
13
|
+
| path | title |
|
14
|
+
| ./home.txt | home |
|
15
|
+
| ./test.txt | test |
|
16
|
+
| ./folder/test.txt | test |
|
17
|
+
| ./folder/test 1.txt | test 1 |
|
18
|
+
| ./folder/test 2.txt | test 2 |
|
19
|
+
| ./folder/subfolder/ruby.txt | ruby |
|
24
20
|
|
25
21
|
@javascript
|
26
|
-
Scenario: Display the several
|
27
|
-
When I
|
28
|
-
And I
|
29
|
-
And I
|
22
|
+
Scenario: Display the several pages
|
23
|
+
When I open the page for the tree node with path "./home.txt"
|
24
|
+
And I open the page for the tree node with path "./folder/test.txt"
|
25
|
+
And I open the page for the tree node with path "./folder/subfolder/ruby.txt"
|
30
26
|
|
31
27
|
Then I should have the following open tabs:
|
32
28
|
| home |
|
33
29
|
| test |
|
34
|
-
|
35
|
-
|
30
|
+
| ruby |
|
31
|
+
Then I should see active tab titled "ruby"
|
32
|
+
And I should see page title "Rwiki ./folder/subfolder/ruby.txt"
|
33
|
+
And I should see generated content for the node with path "./folder/subfolder/ruby.txt"
|
@@ -5,6 +5,13 @@ Feature: Tree Panel
|
|
5
5
|
|
6
6
|
@javascript
|
7
7
|
Scenario: Find a page
|
8
|
+
Given this scenario is pending
|
9
|
+
|
8
10
|
When I press "Find page"
|
9
11
|
And I fill in the input with "test" within the dialog box
|
10
|
-
|
12
|
+
And I select the first search result
|
13
|
+
|
14
|
+
Then I should have the following open tabs:
|
15
|
+
| home |
|
16
|
+
And I should see page title "Rwiki ./test.txt"
|
17
|
+
And I should see generated content for the node with path "./test.txt"
|
data/features/history.feature
CHANGED
@@ -14,38 +14,49 @@ Feature: History
|
|
14
14
|
And I should see generated content for the node with path "./home.txt"
|
15
15
|
|
16
16
|
@javascript
|
17
|
-
Scenario: After reload the application last opened page should be loaded
|
18
|
-
When I
|
19
|
-
And I click the node with path "./folder/test.txt"
|
17
|
+
Scenario Outline: After reload the application last opened page should be loaded
|
18
|
+
When I open the page for the tree node with path "<path>"
|
20
19
|
And I reload the application
|
21
20
|
|
22
|
-
Then I should
|
23
|
-
|
24
|
-
And I should see
|
25
|
-
And
|
26
|
-
|
21
|
+
Then I should see active tab titled "<title>"
|
22
|
+
And I should see page title "Rwiki <path>"
|
23
|
+
And I should see generated content for the node with path "<path>"
|
24
|
+
And the node with path "<path>" should be selected
|
25
|
+
|
26
|
+
Examples:
|
27
|
+
| path | title |
|
28
|
+
| ./home.txt | home |
|
29
|
+
| ./test.txt | test |
|
30
|
+
| ./folder/test.txt | test |
|
31
|
+
| ./folder/test 1.txt | test 1 |
|
32
|
+
| ./folder/test 2.txt | test 2 |
|
33
|
+
| ./folder/subfolder/ruby.txt | ruby |
|
27
34
|
|
28
35
|
@javascript
|
29
36
|
Scenario: Browser history
|
30
|
-
When I
|
31
|
-
And I
|
32
|
-
And I
|
33
|
-
|
37
|
+
When I open the page for the tree node with path "./folder/test.txt"
|
38
|
+
And I open the page for the tree node with path "./test.txt"
|
39
|
+
And I open the page for the tree node with path "./home.txt"
|
40
|
+
Then I should see active tab titled "home"
|
34
41
|
|
35
|
-
|
42
|
+
And I press the browser back button
|
36
43
|
Then the node with path "./test.txt" should be selected
|
37
44
|
And I should see generated content for the node with path "./test.txt"
|
45
|
+
And I should see active tab titled "test"
|
38
46
|
|
39
47
|
When I press the browser back button
|
40
48
|
Then the node with path "./folder/test.txt" should be selected
|
41
49
|
And I should see generated content for the node with path "./folder/test.txt"
|
50
|
+
And I should see active tab titled "test"
|
42
51
|
|
43
52
|
When I press the browser forward button
|
44
53
|
Then the node with path "./test.txt" should be selected
|
45
54
|
And I should see generated content for the node with path "./test.txt"
|
55
|
+
And I should see active tab titled "test"
|
46
56
|
|
47
57
|
When I create a new page title "A new page" for the node with path "./Info"
|
48
58
|
And I press the browser back button
|
49
59
|
And I press the browser forward button
|
50
60
|
Then the node with path "./Info/A new page.txt" should be selected
|
51
61
|
And I should see generated content for the node with path "./Info/A new page.txt"
|
62
|
+
And I should see active tab titled "A new page"
|
@@ -1,6 +1,13 @@
|
|
1
1
|
When /^I fill in the input with "([^"]*)" within the dialog box$/ do |text|
|
2
|
-
|
2
|
+
input_selector = 'div.x-window input'
|
3
|
+
|
4
|
+
field = find(input_selector)
|
3
5
|
field.set(text)
|
6
|
+
|
7
|
+
# fire keyup event for trigger the autocomplete
|
8
|
+
Capybara.current_session.execute_script <<-JS
|
9
|
+
$("#{input_selector}").focus().trigger($.Event('keyup'));
|
10
|
+
JS
|
4
11
|
end
|
5
12
|
|
6
13
|
When /^I press "([^"]*)" within the dialog box$/ do |button|
|
@@ -17,6 +17,10 @@ When /^I click tab for page "([^"]*)"$/ do |path|
|
|
17
17
|
tab.click
|
18
18
|
end
|
19
19
|
|
20
|
+
Then /^I should see active tab titled "([^"]*)"$/ do |title|
|
21
|
+
page.find('li.x-tab-strip-active').text.should == title
|
22
|
+
end
|
23
|
+
|
20
24
|
Then /^I should have the following open tabs:$/ do |table|
|
21
25
|
actual_table = table(tableish("div.x-tab-panel ul li[@class!='x-tab-edge']", "a.x-tab-right"))
|
22
26
|
table.diff!(actual_table)
|
@@ -1,3 +1,26 @@
|
|
1
|
+
When /^I expand the parent for the node with path "([^"]*)"$/ do |path|
|
2
|
+
parts = path.split('/')[0..-2]
|
3
|
+
parts.each_index do |i|
|
4
|
+
partial_path = parts[0..i].join('/')
|
5
|
+
|
6
|
+
# check if node is expanded
|
7
|
+
is_expanded = Capybara.current_session.evaluate_script <<-JS
|
8
|
+
node = Rwiki.treePanel.findNodeByPath('#{partial_path}').isExpanded();
|
9
|
+
JS
|
10
|
+
|
11
|
+
unless is_expanded
|
12
|
+
Then %{I double click the node with path "#{partial_path}"}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^I open the page for the tree node with path "([^"]*)"$/ do |path|
|
18
|
+
When %{I expand the parent for the node with path "#{path}"}
|
19
|
+
And %{I click the node with path "#{path}"}
|
20
|
+
And %{I should see page title "Rwiki #{path}"}
|
21
|
+
And %{I should see generated content for the node with path "#{path}"}
|
22
|
+
end
|
23
|
+
|
1
24
|
Then /^I should see the node titled "([^"]*)"$/ do |title|
|
2
25
|
Then %{I should see "#{title}" within "div#tree"}
|
3
26
|
end
|
data/features/support/env.rb
CHANGED
@@ -9,12 +9,11 @@ require File.expand_path(File.join(File.dirname(__FILE__), '../../test/tmpdir_he
|
|
9
9
|
Rwiki::App.set(:environment, :test)
|
10
10
|
|
11
11
|
Capybara.default_selector = :css
|
12
|
+
|
13
|
+
require 'selenium/webdriver'
|
12
14
|
Capybara.register_driver :selenium do |app|
|
13
|
-
Capybara::Driver::Selenium
|
14
15
|
profile = Selenium::WebDriver::Firefox::Profile.new
|
15
|
-
|
16
|
-
|
17
|
-
Capybara::Driver::Selenium.new(app, { :browser => :firefox, :profile => profile })
|
16
|
+
Capybara::Driver::Selenium.new(app, :profile => profile)
|
18
17
|
end
|
19
18
|
|
20
19
|
World do
|
@@ -27,7 +26,7 @@ World do
|
|
27
26
|
|
28
27
|
AfterStep do
|
29
28
|
Given %Q{I wait for load the tree}
|
30
|
-
And %Q{I wait for
|
29
|
+
And %Q{I wait for an ajax call complete}
|
31
30
|
end
|
32
31
|
|
33
32
|
Before do
|
data/features/tab_panel.feature
CHANGED
@@ -5,8 +5,8 @@ Feature: Tab Panel
|
|
5
5
|
|
6
6
|
@javascript
|
7
7
|
Scenario: Close a tab
|
8
|
-
When I
|
9
|
-
And I
|
8
|
+
When I open the page for the tree node with path "./home.txt"
|
9
|
+
And I open the page for the tree node with path "./test.txt"
|
10
10
|
|
11
11
|
Then I should have the following open tabs:
|
12
12
|
| home |
|
@@ -22,9 +22,9 @@ Feature: Tab Panel
|
|
22
22
|
Then I should have no open tabs
|
23
23
|
|
24
24
|
@javascript
|
25
|
-
Scenario: Switching
|
26
|
-
When I
|
27
|
-
And I
|
25
|
+
Scenario: Switching the tabs
|
26
|
+
When I open the page for the tree node with path "./home.txt"
|
27
|
+
And I open the page for the tree node with path "./test.txt"
|
28
28
|
Then I should see "This is a test"
|
29
29
|
|
30
30
|
When I click tab for page "./home.txt"
|
data/lib/rwiki/models/node.rb
CHANGED
@@ -17,8 +17,10 @@ module Rwiki::Models
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def fuzzy_finder(query)
|
20
|
-
finder
|
21
|
-
|
20
|
+
@finder ||= FuzzyFileFinder.new(full_path_for('.'))
|
21
|
+
@finder.rescan!
|
22
|
+
|
23
|
+
matches = @finder.find(query).sort_by { |m| [-m[:score], m[:path]] }
|
22
24
|
matches.each do |m|
|
23
25
|
m[:path] = '.' + m[:path].gsub(full_path_for('.'), '')
|
24
26
|
end
|
data/public/javascripts/Rwiki.js
CHANGED
@@ -23,46 +23,41 @@ Rwiki.init = function() {
|
|
23
23
|
Rwiki.ajaxCallCompleted = true;
|
24
24
|
Rwiki.treeLoaded = false;
|
25
25
|
|
26
|
-
|
27
|
-
Rwiki.treePanel = treePanel;
|
26
|
+
Rwiki.treePanel = new Rwiki.TreePanel();
|
28
27
|
var nodeManager = Rwiki.NodeManager.getInstance();
|
29
28
|
|
30
29
|
nodeManager.on('rwiki:beforePageLoad', function() {
|
31
30
|
Rwiki.ajaxCallCompleted = false;
|
31
|
+
Rwiki.statusBar.showBusy();
|
32
32
|
});
|
33
33
|
|
34
34
|
nodeManager.on('rwiki:pageLoaded', function() {
|
35
35
|
Rwiki.ajaxCallCompleted = true;
|
36
|
+
Rwiki.statusBar.clearStatus({useDefaults: true});
|
36
37
|
});
|
37
38
|
|
38
|
-
|
39
|
+
Rwiki.statusBar = new Ext.ux.StatusBar({
|
40
|
+
statusAlign: 'right',
|
41
|
+
defaultText: 'Ready',
|
42
|
+
iconCls: 'x-status-valid'
|
43
|
+
});
|
44
|
+
|
45
|
+
Rwiki.treePanel.getLoader().on('load', function() {
|
39
46
|
Rwiki.treeLoaded = true;
|
40
47
|
Rwiki.treePanel.openNodeFromLocationHash();
|
41
48
|
});
|
42
49
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
Rwiki.tabPanel = tabPanel;
|
48
|
-
tabPanel.relayEvents(nodeManager,
|
49
|
-
['rwiki:pageLoaded', 'rwiki:folderCreated', 'rwiki:pageCreated', 'rwiki:pageSaved', 'rwiki:nodeRenamed', 'rwiki:nodeDeleted']);
|
50
|
-
tabPanel.relayEvents(treePanel, ['pageSelected']);
|
51
|
-
|
52
|
-
var editorPanel = new Rwiki.EditorPanel();
|
53
|
-
editorPanel.relayEvents(Rwiki.NodeManager.getInstance(), ['rwiki:pageLoaded']);
|
54
|
-
|
55
|
-
var window = new Rwiki.EditorWindow(editorPanel);
|
50
|
+
Rwiki.tabPanel = new Rwiki.TabPanel({
|
51
|
+
bbar: Rwiki.statusBar
|
52
|
+
});
|
53
|
+
Rwiki.tabPanel.relayEvents(Rwiki.treePanel, ['rwiki:pageSelected']);
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
var editorWindow = new Rwiki.EditorWindow();
|
56
|
+
Rwiki.tabPanel.on('rwiki:editPage', function(path) {
|
57
|
+
if (!editorWindow.isVisible()) {
|
58
|
+
editorWindow.setPagePath(path);
|
59
|
+
editorWindow.show();
|
61
60
|
}
|
62
|
-
}
|
63
|
-
|
64
|
-
tabPanel.on('rwiki:editPage', function(path) {
|
65
|
-
showEditor(path);
|
66
61
|
});
|
67
62
|
|
68
63
|
// Handle this change event in order to restore the UI to the appropriate history state
|
@@ -73,14 +68,14 @@ Rwiki.init = function() {
|
|
73
68
|
// Create layout
|
74
69
|
|
75
70
|
var navigationPanel = new Rwiki.NavigationPanel({
|
76
|
-
items: [treePanel]
|
71
|
+
items: [Rwiki.treePanel]
|
77
72
|
});
|
78
73
|
|
79
74
|
var app = new Ext.Viewport({
|
80
75
|
layout: 'border',
|
81
76
|
plain: true,
|
82
77
|
renderTo: Ext.getBody(),
|
83
|
-
items: [navigationPanel, tabPanel]
|
78
|
+
items: [navigationPanel, Rwiki.tabPanel]
|
84
79
|
});
|
85
80
|
|
86
81
|
app.show();
|
@@ -91,22 +86,22 @@ Rwiki.init = function() {
|
|
91
86
|
alt: true,
|
92
87
|
stopEvent: true,
|
93
88
|
fn: function() {
|
94
|
-
tabPanel.onEditPage();
|
89
|
+
Rwiki.tabPanel.onEditPage();
|
95
90
|
}
|
96
91
|
}, {
|
97
92
|
key: "t",
|
98
93
|
ctrl: true,
|
99
94
|
stopEvent: true,
|
100
95
|
fn: function() {
|
101
|
-
tabPanel.onFuzzyFinder();
|
96
|
+
Rwiki.tabPanel.onFuzzyFinder();
|
102
97
|
}
|
103
98
|
}, {
|
104
99
|
key: "w",
|
105
100
|
ctrl: true,
|
106
101
|
stopEvent: true,
|
107
102
|
fn: function() {
|
108
|
-
var tab = tabPanel.getActiveTab();
|
109
|
-
tabPanel.remove(tab);
|
103
|
+
var tab = Rwiki.tabPanel.getActiveTab();
|
104
|
+
Rwiki.tabPanel.remove(tab);
|
110
105
|
}
|
111
106
|
}]);
|
112
107
|
|
@@ -24,12 +24,15 @@ Rwiki.EditorPanel = Ext.extend(Ext.Panel, {
|
|
24
24
|
initEvents: function() {
|
25
25
|
Rwiki.EditorPanel.superclass.initEvents.apply(this, arguments);
|
26
26
|
|
27
|
+
this.relayEvents(Rwiki.NodeManager.getInstance(), ['rwiki:pageLoaded']);
|
27
28
|
this.on('rwiki:pageLoaded', this.onPageLoaded);
|
28
29
|
},
|
29
30
|
|
30
|
-
onPageLoaded: function(
|
31
|
-
this.editor.setPagePath(
|
32
|
-
this.editor.setContent(
|
31
|
+
onPageLoaded: function(page) {
|
32
|
+
this.editor.setPagePath(page.getPath());
|
33
|
+
this.editor.setContent(page.getRawContent());
|
34
|
+
|
35
|
+
Ext.get('editor-container').unmask();
|
33
36
|
},
|
34
37
|
|
35
38
|
getPagePath: function() {
|
@@ -1,7 +1,9 @@
|
|
1
1
|
Ext.ns('Rwiki');
|
2
2
|
|
3
3
|
Rwiki.EditorWindow = Ext.extend(Ext.Window, {
|
4
|
-
constructor: function(
|
4
|
+
constructor: function() {
|
5
|
+
this.editorPanel = new Rwiki.EditorPanel();
|
6
|
+
|
5
7
|
Ext.apply(this, {
|
6
8
|
maximizable: true,
|
7
9
|
modal: true,
|
@@ -13,7 +15,7 @@ Rwiki.EditorWindow = Ext.extend(Ext.Window, {
|
|
13
15
|
plain: true,
|
14
16
|
bodyStyle: 'padding: 5px;',
|
15
17
|
buttonAlign: 'center',
|
16
|
-
items: editorPanel,
|
18
|
+
items: this.editorPanel,
|
17
19
|
buttons: [
|
18
20
|
{
|
19
21
|
text: 'Save',
|
@@ -37,7 +39,6 @@ Rwiki.EditorWindow = Ext.extend(Ext.Window, {
|
|
37
39
|
});
|
38
40
|
|
39
41
|
Rwiki.EditorWindow.superclass.constructor.apply(this, arguments);
|
40
|
-
this.editorPanel = editorPanel;
|
41
42
|
},
|
42
43
|
|
43
44
|
setPagePath: function(path) {
|
@@ -48,15 +49,21 @@ Rwiki.EditorWindow = Ext.extend(Ext.Window, {
|
|
48
49
|
show: function() {
|
49
50
|
Rwiki.NodeManager.getInstance().loadPage(this.pagePath);
|
50
51
|
Rwiki.EditorWindow.superclass.show.apply(this, arguments);
|
52
|
+
|
53
|
+
Ext.get('editor-container').mask('Loading the page...');
|
51
54
|
},
|
52
55
|
|
53
|
-
|
56
|
+
savePage: function() {
|
54
57
|
Rwiki.NodeManager.getInstance().savePage(this.pagePath, this.editorPanel.getRawContent());
|
58
|
+
},
|
59
|
+
|
60
|
+
onSaveButton: function() {
|
61
|
+
this.savePage();
|
55
62
|
this.hide();
|
56
63
|
},
|
57
64
|
|
58
65
|
onSaveAndContinueButton: function() {
|
59
|
-
|
66
|
+
this.savePage();
|
60
67
|
},
|
61
68
|
|
62
69
|
onCancelButton: function() {
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Ext.ns('Rwiki');
|
2
|
+
|
3
|
+
Rwiki.Node = function(data) {
|
4
|
+
this._data = data;
|
5
|
+
};
|
6
|
+
|
7
|
+
Rwiki.Node.prototype = {
|
8
|
+
|
9
|
+
getData: function() {
|
10
|
+
return this._data;
|
11
|
+
},
|
12
|
+
|
13
|
+
getHtmlContent: function() {
|
14
|
+
return this._data.htmlContent;
|
15
|
+
},
|
16
|
+
|
17
|
+
getRawContent: function() {
|
18
|
+
return this._data.rawContent;
|
19
|
+
},
|
20
|
+
|
21
|
+
getPath: function() {
|
22
|
+
return this._data.path;
|
23
|
+
},
|
24
|
+
|
25
|
+
getParentPath: function() {
|
26
|
+
return this._data.parentPath;
|
27
|
+
},
|
28
|
+
|
29
|
+
getBaseName: function() {
|
30
|
+
return this.getPath().split('/').pop();
|
31
|
+
},
|
32
|
+
|
33
|
+
getTitle: function() {
|
34
|
+
return this.getBaseName().replace(new RegExp('\.txt$'), '');
|
35
|
+
}
|
36
|
+
|
37
|
+
};
|
@@ -22,10 +22,12 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
22
22
|
);
|
23
23
|
},
|
24
24
|
|
25
|
-
|
25
|
+
loadPage: function(path) {
|
26
26
|
var self = this;
|
27
|
-
|
28
|
-
|
27
|
+
|
28
|
+
var page = new Rwiki.Node({ path: path });
|
29
|
+
self.fireEvent('rwiki:beforePageLoad', page);
|
30
|
+
|
29
31
|
$.ajax({
|
30
32
|
type: 'GET',
|
31
33
|
url: '/node',
|
@@ -34,7 +36,8 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
34
36
|
path: path
|
35
37
|
},
|
36
38
|
success: function(data) {
|
37
|
-
|
39
|
+
page = new Rwiki.Node(data);
|
40
|
+
self.fireEvent('rwiki:pageLoaded', page);
|
38
41
|
}
|
39
42
|
});
|
40
43
|
},
|
@@ -70,7 +73,8 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
70
73
|
isFolder: false
|
71
74
|
},
|
72
75
|
success: function(data) {
|
73
|
-
|
76
|
+
var page = new Rwiki.Node(data);
|
77
|
+
self.fireEvent('rwiki:pageCreated', page);
|
74
78
|
}
|
75
79
|
});
|
76
80
|
},
|
@@ -87,7 +91,8 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
87
91
|
rawContent: rawContent
|
88
92
|
},
|
89
93
|
success: function(data) {
|
90
|
-
|
94
|
+
var page = new Rwiki.Node(data);
|
95
|
+
self.fireEvent('rwiki:pageSaved', page);
|
91
96
|
}
|
92
97
|
});
|
93
98
|
},
|
@@ -104,7 +109,8 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
104
109
|
newName: newName
|
105
110
|
},
|
106
111
|
success: function(data) {
|
107
|
-
|
112
|
+
var page = new Rwiki.Node(data);
|
113
|
+
self.fireEvent('rwiki:nodeRenamed', page);
|
108
114
|
}
|
109
115
|
});
|
110
116
|
},
|
@@ -135,7 +141,8 @@ Rwiki.NodeManager = Ext.extend(Ext.util.Observable, {
|
|
135
141
|
newParentPath: newParentPath
|
136
142
|
},
|
137
143
|
success: function(data) {
|
138
|
-
|
144
|
+
var page = new Rwiki.Node(data);
|
145
|
+
self.fireEvent('rwiki:nodeRenamed', page);
|
139
146
|
}
|
140
147
|
});
|
141
148
|
|
@@ -37,32 +37,40 @@ Rwiki.TabPanel = Ext.extend(Ext.TabPanel, {
|
|
37
37
|
|
38
38
|
this.addEvents('rwiki:editPage');
|
39
39
|
|
40
|
-
this.on('pageSelected', this.onPageSelected),
|
40
|
+
this.on('rwiki:pageSelected', this.onPageSelected),
|
41
41
|
this.on('tabchange', this.onTabChange);
|
42
42
|
|
43
43
|
this.on('rwiki:pageCreated', this.onPageCreated);
|
44
44
|
this.on('rwiki:pageLoaded', this.onPageLoaded);
|
45
45
|
this.on('rwiki:pageSaved', this.onPageSaved);
|
46
|
-
this.on('rwiki:nodeRenamed', this.
|
46
|
+
this.on('rwiki:nodeRenamed', this.onNodeRenamed);
|
47
47
|
this.on('rwiki:nodeDeleted', this.onNodeDeleted);
|
48
|
+
|
49
|
+
this.relayEvents(Rwiki.NodeManager.getInstance(), [
|
50
|
+
'rwiki:pageLoaded',
|
51
|
+
'rwiki:folderCreated',
|
52
|
+
'rwiki:pageCreated',
|
53
|
+
'rwiki:pageSaved',
|
54
|
+
'rwiki:nodeRenamed',
|
55
|
+
'rwiki:nodeDeleted']);
|
48
56
|
},
|
49
57
|
|
50
|
-
findOrCreatePageTab: function(
|
51
|
-
var tab = this.findTabByPagePath(
|
58
|
+
findOrCreatePageTab: function(page) {
|
59
|
+
var tab = this.findTabByPagePath(page.getPath());
|
52
60
|
|
53
61
|
if (!tab) {
|
54
|
-
tab = this.createPageTab(
|
62
|
+
tab = this.createPageTab(page);
|
55
63
|
}
|
56
64
|
|
57
65
|
return tab;
|
58
66
|
},
|
59
67
|
|
60
|
-
createPageTab: function(
|
68
|
+
createPageTab: function(page) {
|
61
69
|
var tab = new Rwiki.TabPanel.PageTab({
|
62
|
-
title:
|
70
|
+
title: page.getTitle()
|
63
71
|
});
|
64
72
|
|
65
|
-
tab.setPagePath(
|
73
|
+
tab.setPagePath(page.getPath());
|
66
74
|
this.add(tab);
|
67
75
|
|
68
76
|
return tab;
|
@@ -81,47 +89,51 @@ Rwiki.TabPanel = Ext.extend(Ext.TabPanel, {
|
|
81
89
|
});
|
82
90
|
},
|
83
91
|
|
84
|
-
onPageSelected: function(
|
85
|
-
var tab = this.findOrCreatePageTab(
|
92
|
+
onPageSelected: function(page) {
|
93
|
+
var tab = this.findOrCreatePageTab(page);
|
86
94
|
tab.show();
|
87
95
|
},
|
88
96
|
|
89
97
|
onTabChange: function(panel, tab) {
|
90
98
|
if (tab) {
|
99
|
+
if (tab.isLoading()) {
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
|
91
103
|
Ext.History.add(tab.getPagePath());
|
92
104
|
document.title = 'Rwiki ' + tab.getPagePath();
|
93
105
|
Rwiki.NodeManager.getInstance().loadPage(tab.getPagePath());
|
106
|
+
tab.setIsLoading(true);
|
94
107
|
} else {
|
95
108
|
document.title = 'Rwiki';
|
96
109
|
Rwiki.NodeManager.getInstance().fireEvent('rwiki:lastPageClosed');
|
97
110
|
}
|
98
111
|
},
|
99
112
|
|
100
|
-
onPageCreated: function(
|
101
|
-
var tab = this.createPageTab(
|
113
|
+
onPageCreated: function(page) {
|
114
|
+
var tab = this.createPageTab(page);
|
102
115
|
tab.show();
|
103
116
|
},
|
104
117
|
|
105
|
-
onPageLoaded: function(
|
106
|
-
var tab = this.findOrCreatePageTab(
|
107
|
-
|
108
|
-
|
109
|
-
tab.
|
110
|
-
tab.setContent(data.htmlContent);
|
118
|
+
onPageLoaded: function(page) {
|
119
|
+
var tab = this.findOrCreatePageTab(page);
|
120
|
+
|
121
|
+
tab.setTitle(page.getTitle());
|
122
|
+
tab.setContent(page.getHtmlContent());
|
111
123
|
tab.show();
|
124
|
+
|
125
|
+
tab.setIsLoading(false);
|
112
126
|
},
|
113
127
|
|
114
|
-
onPageSaved: function(
|
115
|
-
var tab = this.findTabByPagePath(
|
128
|
+
onPageSaved: function(page) {
|
129
|
+
var tab = this.findTabByPagePath(page.getPath());
|
116
130
|
if (tab == null) return;
|
117
131
|
|
118
|
-
tab.setContent(
|
132
|
+
tab.setContent(page.getHtmlContent());
|
119
133
|
},
|
120
134
|
|
121
|
-
|
122
|
-
var oldPath =
|
123
|
-
var path = data.path;
|
124
|
-
|
135
|
+
onNodeRenamed: function(page) {
|
136
|
+
var oldPath = page.getData().oldPath;
|
125
137
|
var currentTab = this.getActiveTab();
|
126
138
|
|
127
139
|
var tab = null;
|
@@ -130,18 +142,17 @@ Rwiki.TabPanel = Ext.extend(Ext.TabPanel, {
|
|
130
142
|
tab = this.findTabByPagePath(oldPath);
|
131
143
|
if (tab == null) return;
|
132
144
|
|
133
|
-
tab.setPagePath(
|
134
|
-
|
135
|
-
tab.setTitle(title);
|
145
|
+
tab.setPagePath(page.getPath());
|
146
|
+
tab.setTitle(page.getTitle());
|
136
147
|
|
137
148
|
if (tab == currentTab) {
|
138
|
-
document.title = 'Rwiki ' +
|
149
|
+
document.title = 'Rwiki ' + page.getPath();
|
139
150
|
}
|
140
151
|
} else {
|
141
152
|
var tabs = this.findTabsByParentPath(oldPath);
|
142
153
|
for (var i = 0; i < tabs.length; i++) {
|
143
154
|
tab = tabs[i];
|
144
|
-
var newPath = tab.getPagePath().replace(oldPath,
|
155
|
+
var newPath = tab.getPagePath().replace(oldPath, page.getPath());
|
145
156
|
tab.setPagePath(newPath);
|
146
157
|
|
147
158
|
if (tab == currentTab) {
|
@@ -175,7 +186,7 @@ Rwiki.TabPanel = Ext.extend(Ext.TabPanel, {
|
|
175
186
|
var currentTab = this.getActiveTab();
|
176
187
|
if (currentTab) {
|
177
188
|
var path = currentTab.getPagePath();
|
178
|
-
window.open('/node/print?path=' + path, '
|
189
|
+
window.open('/node/print?path=' + path, 'Rwiki ' + path, 'width=800,height=600,scrollbars=yes')
|
179
190
|
}
|
180
191
|
}
|
181
192
|
});
|
@@ -11,6 +11,21 @@ Rwiki.TabPanel.PageTab = Ext.extend(Ext.Container, {
|
|
11
11
|
Rwiki.TabPanel.PageTab.superclass.constructor.apply(this, arguments);
|
12
12
|
},
|
13
13
|
|
14
|
+
isLoading: function() {
|
15
|
+
return this._isLoading;
|
16
|
+
},
|
17
|
+
|
18
|
+
setIsLoading: function(isLoading) {
|
19
|
+
this._isLoading = isLoading;
|
20
|
+
|
21
|
+
if (isLoading) {
|
22
|
+
this.mask = new Ext.LoadMask(Ext.get(this.id), {msg: 'Loading the Page...'});
|
23
|
+
this.mask.show();
|
24
|
+
} else if (this.mask) {
|
25
|
+
this.mask.hide();
|
26
|
+
}
|
27
|
+
},
|
28
|
+
|
14
29
|
getPagePath: function() {
|
15
30
|
return this.path;
|
16
31
|
},
|
@@ -19,11 +34,8 @@ Rwiki.TabPanel.PageTab = Ext.extend(Ext.Container, {
|
|
19
34
|
this.path = path;
|
20
35
|
},
|
21
36
|
|
22
|
-
/**
|
23
|
-
* Update the page content.
|
24
|
-
*/
|
25
37
|
setContent: function(htmlContent) {
|
26
|
-
pageContainer = this.getPageContainer();
|
38
|
+
var pageContainer = this.getPageContainer();
|
27
39
|
pageContainer.html(htmlContent);
|
28
40
|
},
|
29
41
|
|
@@ -38,7 +38,7 @@ Rwiki.TreePanel = Ext.extend(Ext.tree.TreePanel, {
|
|
38
38
|
this.root.expand();
|
39
39
|
|
40
40
|
new Ext.tree.TreeSorter(this, {
|
41
|
-
folderSort:
|
41
|
+
folderSort: true
|
42
42
|
});
|
43
43
|
|
44
44
|
var self = this;
|
@@ -55,7 +55,7 @@ Rwiki.TreePanel = Ext.extend(Ext.tree.TreePanel, {
|
|
55
55
|
self.filter.filterTree(text);
|
56
56
|
});
|
57
57
|
|
58
|
-
this.addEvents('pageSelected');
|
58
|
+
this.addEvents('rwiki:pageSelected');
|
59
59
|
},
|
60
60
|
|
61
61
|
initEvents: function() {
|
@@ -69,6 +69,13 @@ Rwiki.TreePanel = Ext.extend(Ext.tree.TreePanel, {
|
|
69
69
|
this.on('rwiki:nodeRenamed', this.onNodeRenamed);
|
70
70
|
this.on('rwiki:nodeDeleted', this.onNodeDeleted);
|
71
71
|
this.on('beforemovenode', this.onBeforeMoveNode);
|
72
|
+
|
73
|
+
this.relayEvents(Rwiki.NodeManager.getInstance(), [
|
74
|
+
'rwiki:pageLoaded',
|
75
|
+
'rwiki:folderCreated',
|
76
|
+
'rwiki:pageCreated',
|
77
|
+
'rwiki:nodeRenamed',
|
78
|
+
'rwiki:nodeDeleted']);
|
72
79
|
},
|
73
80
|
|
74
81
|
onContextMenu: function(node, e) {
|
@@ -83,13 +90,12 @@ Rwiki.TreePanel = Ext.extend(Ext.tree.TreePanel, {
|
|
83
90
|
|
84
91
|
onClick: function(node) {
|
85
92
|
if (!node.isLeaf()) return;
|
86
|
-
|
87
|
-
|
88
|
-
this.fireEvent('pageSelected', path);
|
93
|
+
var page = new Rwiki.Node({ path: node.getPath() });
|
94
|
+
this.fireEvent('rwiki:pageSelected', page);
|
89
95
|
},
|
90
96
|
|
91
|
-
onPageLoaded: function(
|
92
|
-
var node = this.findNodeByPath(
|
97
|
+
onPageLoaded: function(page) {
|
98
|
+
var node = this.findNodeByPath(page.getPath());
|
93
99
|
if (node) {
|
94
100
|
node.select();
|
95
101
|
}
|
@@ -109,27 +115,25 @@ Rwiki.TreePanel = Ext.extend(Ext.tree.TreePanel, {
|
|
109
115
|
parentNode.appendChild(node);
|
110
116
|
},
|
111
117
|
|
112
|
-
onPageCreated: function(
|
113
|
-
var
|
114
|
-
baseName:
|
115
|
-
text:
|
118
|
+
onPageCreated: function(page) {
|
119
|
+
var treeNode = new Rwiki.TreePanel.Node({
|
120
|
+
baseName: page.getBaseName(),
|
121
|
+
text: page.getTitle(),
|
116
122
|
cls: 'page',
|
117
123
|
expandable: false,
|
118
124
|
leaf: true
|
119
125
|
});
|
120
126
|
|
121
|
-
var parentNode = this.findNodeByPath(
|
127
|
+
var parentNode = this.findNodeByPath(page.getParentPath());
|
122
128
|
parentNode.expand();
|
123
|
-
parentNode.appendChild(
|
124
|
-
|
129
|
+
parentNode.appendChild(treeNode);
|
130
|
+
treeNode.select();
|
125
131
|
},
|
126
132
|
|
127
|
-
onNodeRenamed: function(
|
128
|
-
var
|
129
|
-
|
130
|
-
|
131
|
-
var title = data.baseName.replace(new RegExp('\.txt$'), '');
|
132
|
-
node.setText(title);
|
133
|
+
onNodeRenamed: function(page) {
|
134
|
+
var treeNode = this.findNodeByPath(page.getData().oldPath);
|
135
|
+
treeNode.setBaseName(page.getBaseName());
|
136
|
+
treeNode.setText(page.getTitle());
|
133
137
|
},
|
134
138
|
|
135
139
|
onNodeDeleted: function(data) {
|
data/rwiki.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rwiki}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Łukasz Bandzarewicz"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-31}
|
13
13
|
s.default_executable = %q{rwiki}
|
14
14
|
s.description = %q{Personal wiki based on ExtJS}
|
15
15
|
s.email = %q{lucassus@gmail.com}
|
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
"features/step_definitions/common_steps.rb",
|
41
41
|
"features/step_definitions/common_transforms.rb",
|
42
42
|
"features/step_definitions/dialog_box_steps.rb",
|
43
|
+
"features/step_definitions/fuzzy_finder_steps.rb",
|
43
44
|
"features/step_definitions/history_steps.rb",
|
44
45
|
"features/step_definitions/tab_panel_steps.rb",
|
45
46
|
"features/step_definitions/tree_panel_steps.rb",
|
@@ -1086,6 +1087,7 @@ Gem::Specification.new do |s|
|
|
1086
1087
|
"public/javascripts/Rwiki/EditorWindow.js",
|
1087
1088
|
"public/javascripts/Rwiki/FuzzyFinderDialog.js",
|
1088
1089
|
"public/javascripts/Rwiki/NavigationPanel.js",
|
1090
|
+
"public/javascripts/Rwiki/Node.js",
|
1089
1091
|
"public/javascripts/Rwiki/NodeManager.js",
|
1090
1092
|
"public/javascripts/Rwiki/TabPanel.js",
|
1091
1093
|
"public/javascripts/Rwiki/TabPanel/PageTab.js",
|
data/views/layout.erb
CHANGED
@@ -32,6 +32,7 @@
|
|
32
32
|
<script type="text/javascript" src="/javascripts/Rwiki/EditorPanel/Editor.js"></script>
|
33
33
|
<script type="text/javascript" src="/javascripts/Rwiki/FuzzyFinderDialog.js"></script>
|
34
34
|
<script type="text/javascript" src="/javascripts/Rwiki/NodeManager.js"></script>
|
35
|
+
<script type="text/javascript" src="/javascripts/Rwiki/Node.js"></script>
|
35
36
|
<script type="text/javascript" src="/javascripts/Rwiki/TabPanel.js"></script>
|
36
37
|
<script type="text/javascript" src="/javascripts/Rwiki/TabPanel/PageTab.js"></script>
|
37
38
|
<script type="text/javascript" src="/javascripts/Rwiki/TreePanel.js"></script>
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 4
|
9
|
+
version: 0.2.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "\xC5\x81ukasz Bandzarewicz"
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-31 00:00:00 +01:00
|
18
18
|
default_executable: rwiki
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -282,6 +282,7 @@ files:
|
|
282
282
|
- features/step_definitions/common_steps.rb
|
283
283
|
- features/step_definitions/common_transforms.rb
|
284
284
|
- features/step_definitions/dialog_box_steps.rb
|
285
|
+
- features/step_definitions/fuzzy_finder_steps.rb
|
285
286
|
- features/step_definitions/history_steps.rb
|
286
287
|
- features/step_definitions/tab_panel_steps.rb
|
287
288
|
- features/step_definitions/tree_panel_steps.rb
|
@@ -1328,6 +1329,7 @@ files:
|
|
1328
1329
|
- public/javascripts/Rwiki/EditorWindow.js
|
1329
1330
|
- public/javascripts/Rwiki/FuzzyFinderDialog.js
|
1330
1331
|
- public/javascripts/Rwiki/NavigationPanel.js
|
1332
|
+
- public/javascripts/Rwiki/Node.js
|
1331
1333
|
- public/javascripts/Rwiki/NodeManager.js
|
1332
1334
|
- public/javascripts/Rwiki/TabPanel.js
|
1333
1335
|
- public/javascripts/Rwiki/TabPanel/PageTab.js
|
@@ -2349,7 +2351,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
2349
2351
|
requirements:
|
2350
2352
|
- - ">="
|
2351
2353
|
- !ruby/object:Gem::Version
|
2352
|
-
hash:
|
2354
|
+
hash: -2476446300087577750
|
2353
2355
|
segments:
|
2354
2356
|
- 0
|
2355
2357
|
version: "0"
|