alchemy_cms 2.4.rc2 → 2.4.rc4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/.travis.yml +7 -4
- data/README.md +1 -0
- data/alchemy_cms.gemspec +19 -1
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +5 -2
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js +4 -21
- data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -1
- data/app/assets/stylesheets/alchemy/base.scss +4 -0
- data/app/assets/stylesheets/alchemy/elements.scss +59 -60
- data/app/assets/stylesheets/alchemy/flash.scss +3 -3
- data/app/assets/stylesheets/alchemy/form_elements.scss +15 -2
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +11 -3
- data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +4 -0
- data/app/assets/stylesheets/alchemy/variables.scss +5 -1
- data/app/controllers/alchemy/admin/base_controller.rb +18 -3
- data/app/controllers/alchemy/admin/elements_controller.rb +4 -7
- data/app/controllers/alchemy/admin/pages_controller.rb +3 -4
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -18
- data/app/controllers/alchemy/admin/users_controller.rb +8 -5
- data/app/helpers/alchemy/admin/pages_helper.rb +6 -1
- data/app/models/alchemy/content.rb +26 -5
- data/app/models/alchemy/element.rb +1 -0
- data/app/models/alchemy/essence_richtext.rb +1 -1
- data/app/models/alchemy/page.rb +131 -88
- data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +6 -1
- data/app/views/alchemy/admin/elements/trash.js.erb +1 -3
- data/app/views/alchemy/admin/resources/_form.html.erb +13 -1
- data/app/views/alchemy/admin/trash/index.html.erb +1 -1
- data/app/views/alchemy/base/remote_errors.js.erb +5 -1
- data/app/views/alchemy/essences/_essence_link_view.html.erb +2 -0
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
- data/config/locales/alchemy.de.yml +11 -4
- data/lib/alchemy/capistrano.rb +59 -1
- data/lib/alchemy/essence.rb +1 -0
- data/lib/alchemy/seeder.rb +39 -49
- data/lib/alchemy/tinymce.rb +1 -1
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +2 -2
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +2 -2
- data/lib/tasks/database.rake +25 -0
- data/lib/tasks/install.rake +5 -14
- data/spec/factories.rb +10 -0
- data/spec/integration/admin/resources_integration_spec.rb +64 -23
- data/spec/integration/pages_controller_spec.rb +0 -2
- data/spec/libraries/resources_helper_spec.rb +6 -2
- data/spec/models/content_spec.rb +31 -0
- data/spec/models/element_spec.rb +7 -2
- data/spec/models/page_spec.rb +36 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.1_0_1.js +676 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +298 -238
- data/vendor/assets/javascripts/tiny_mce/langs/de.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/langs/en.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +376 -386
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +17 -20
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
- data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +173 -183
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
- data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +280 -282
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +221 -204
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +448 -435
- data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +22 -24
- data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +136 -144
- data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +168 -184
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +46 -62
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +16 -17
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +47 -56
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +52 -69
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -852
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +69 -79
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +50 -37
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +345 -331
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +248 -246
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +152 -146
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +53 -31
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +46 -53
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +45 -57
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +47 -182
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +93 -399
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +191 -890
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -102
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +79 -377
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +80 -451
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +45 -167
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +93 -399
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +194 -889
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -33
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +4 -15
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +16 -19
- data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
- data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
- data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
- data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
- metadata +11 -6
- data/spec/dummy/public/404.html.bak +0 -26
- data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.min.js +0 -8
data/spec/factories.rb
CHANGED
|
@@ -97,4 +97,14 @@ FactoryGirl.define do
|
|
|
97
97
|
upload_hash Time.now.hash
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
+
factory :event do
|
|
101
|
+
name 'My Event'
|
|
102
|
+
hidden_name 'not shown'
|
|
103
|
+
starts_at DateTime.new(2012, 03, 02, 8, 15)
|
|
104
|
+
ends_at DateTime.new(2012, 03, 02, 19, 30)
|
|
105
|
+
description "something\nfancy"
|
|
106
|
+
published false
|
|
107
|
+
entrance_fee 12.3
|
|
108
|
+
end
|
|
109
|
+
|
|
100
110
|
end
|
|
@@ -2,22 +2,12 @@ require 'spec_helper'
|
|
|
2
2
|
|
|
3
3
|
describe "Resources" do
|
|
4
4
|
|
|
5
|
+
let(:event) { FactoryGirl.create(:event) }
|
|
6
|
+
let(:second_event) { FactoryGirl.create(:event, :name => 'My second Event', :entrance_fee => 12.32) }
|
|
7
|
+
|
|
5
8
|
before do
|
|
6
9
|
load_authorization_rules
|
|
7
10
|
authorize_as_admin
|
|
8
|
-
Event.create!(:name => 'My Event',
|
|
9
|
-
:hidden_name => 'not shown',
|
|
10
|
-
:starts_at => DateTime.new(2012, 03, 02, 8, 15),
|
|
11
|
-
:ends_at => DateTime.new(2012, 03, 02, 19, 30),
|
|
12
|
-
:description => "something\nfancy",
|
|
13
|
-
:published => false,
|
|
14
|
-
:entrance_fee => 12.32)
|
|
15
|
-
Event.create!(:name => 'My second Event',
|
|
16
|
-
:starts_at => DateTime.new(2012, 03, 02, 8, 15),
|
|
17
|
-
:ends_at => DateTime.new(2012, 03, 02, 19, 30),
|
|
18
|
-
:description => "something\nfancy",
|
|
19
|
-
:published => false,
|
|
20
|
-
:entrance_fee => 12.32)
|
|
21
11
|
end
|
|
22
12
|
|
|
23
13
|
describe "index view" do
|
|
@@ -28,60 +18,111 @@ describe "Resources" do
|
|
|
28
18
|
end
|
|
29
19
|
|
|
30
20
|
it "should list existing items" do
|
|
21
|
+
event
|
|
22
|
+
second_event
|
|
31
23
|
visit '/admin/events'
|
|
32
24
|
page.should have_content("My Event")
|
|
33
25
|
page.should have_content("something fancy")
|
|
34
26
|
page.should have_content("12.32")
|
|
35
27
|
end
|
|
36
28
|
|
|
37
|
-
it "should list existing resource-items nicely formatted"
|
|
29
|
+
it "should list existing resource-items nicely formatted" do
|
|
30
|
+
event
|
|
31
|
+
visit '/admin/events'
|
|
32
|
+
page.should have_selector('div#archive_all table.list')
|
|
33
|
+
end
|
|
38
34
|
|
|
39
35
|
end
|
|
40
36
|
|
|
41
37
|
describe "form for creating and updating items" do
|
|
42
|
-
it "renders an input field according to the attribute's type"
|
|
38
|
+
it "renders an input field according to the attribute's type" do
|
|
39
|
+
visit '/admin/events/new'
|
|
40
|
+
page.should have_selector('input#event_name[type="text"]')
|
|
41
|
+
page.should have_selector('input#event_starts_at[type="date"]')
|
|
42
|
+
page.should have_selector('textarea#event_description')
|
|
43
|
+
page.should have_selector('input#event_published[type="checkbox"]')
|
|
44
|
+
end
|
|
43
45
|
end
|
|
44
46
|
|
|
45
47
|
describe "create resource item" do
|
|
46
48
|
|
|
47
49
|
context "when form filled with valid data" do
|
|
48
|
-
|
|
50
|
+
before do
|
|
49
51
|
visit '/admin/events/new'
|
|
50
52
|
fill_in 'event_name', :with => 'My second event'
|
|
51
53
|
fill_in 'event_starts_at', :with => DateTime.new(2012, 03, 03, 20, 00)
|
|
52
54
|
click_on 'Save'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "lists the new item" do
|
|
53
58
|
page.should have_content "My second event"
|
|
54
59
|
page.should have_content "2012-03-03"
|
|
55
60
|
end
|
|
61
|
+
|
|
62
|
+
it "shows a success message" do
|
|
63
|
+
page.should have_content("Succesfully created")
|
|
64
|
+
end
|
|
56
65
|
end
|
|
57
66
|
|
|
58
67
|
context "when form filled with invalid data" do
|
|
59
|
-
|
|
68
|
+
before do
|
|
60
69
|
visit '/admin/events/new'
|
|
61
70
|
fill_in 'event_name', :with => '' #invalid!
|
|
62
71
|
click_on 'Save'
|
|
63
|
-
page.should have_selector "input#event_name"
|
|
64
72
|
end
|
|
65
|
-
|
|
73
|
+
|
|
74
|
+
it "shows the form again" do
|
|
75
|
+
page.should have_selector "form input#event_name"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "lists invalid fields" do
|
|
79
|
+
within('#errors') {
|
|
80
|
+
page.should have_content("Name can't be blank")
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should not display success notice" do
|
|
85
|
+
page.should_not have_content("successfully created")
|
|
86
|
+
end
|
|
66
87
|
end
|
|
67
88
|
|
|
68
89
|
end
|
|
69
90
|
|
|
70
91
|
describe "updating an item" do
|
|
71
|
-
|
|
72
|
-
|
|
92
|
+
before do
|
|
93
|
+
visit("/admin/events/#{event.id}/edit")
|
|
94
|
+
fill_in 'event_name', :with => 'New event name'
|
|
95
|
+
click_on 'Save'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "shows the updated value" do
|
|
99
|
+
page.should have_content("New event name")
|
|
100
|
+
end
|
|
73
101
|
|
|
74
|
-
|
|
102
|
+
it "shows a success message" do
|
|
103
|
+
page.should have_content("Succesfully updated")
|
|
104
|
+
end
|
|
105
|
+
end
|
|
75
106
|
|
|
76
|
-
|
|
107
|
+
describe "destroying an item", :js => true do
|
|
108
|
+
before do
|
|
109
|
+
event
|
|
110
|
+
second_event
|
|
77
111
|
visit '/admin/events'
|
|
78
112
|
within('tr', :text => 'My second Event') do
|
|
79
113
|
click_on 'Delete'
|
|
80
114
|
end
|
|
81
115
|
click_on 'Yes'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "should'n be on the list anymore" do
|
|
82
119
|
page.should have_content "My Event"
|
|
83
120
|
page.should_not have_content "My second Event"
|
|
84
121
|
end
|
|
122
|
+
|
|
123
|
+
it "should display success message" do
|
|
124
|
+
page.should have_content("Succesfully removed")
|
|
125
|
+
end
|
|
85
126
|
end
|
|
86
127
|
|
|
87
128
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'ostruct'
|
|
1
2
|
require File.dirname(__FILE__) + "/../../lib/alchemy/resource"
|
|
2
3
|
require File.dirname(__FILE__) + "/../../lib/alchemy/resources_helper"
|
|
3
4
|
|
|
@@ -103,6 +104,9 @@ describe Alchemy::ResourcesHelper do
|
|
|
103
104
|
end
|
|
104
105
|
|
|
105
106
|
describe "resource_window_size" do
|
|
106
|
-
it "should
|
|
107
|
+
it "should return overlay size string depending on resource attributes length" do
|
|
108
|
+
@controller.stub(:resource_handler).and_return(OpenStruct.new(:attributes => OpenStruct.new(:length => 4)))
|
|
109
|
+
@controller.resource_window_size.should == "400x240"
|
|
110
|
+
end
|
|
107
111
|
end
|
|
108
|
-
end
|
|
112
|
+
end
|
data/spec/models/content_spec.rb
CHANGED
|
@@ -99,5 +99,36 @@ module Alchemy
|
|
|
99
99
|
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
+
describe '.create' do
|
|
103
|
+
let (:element) { FactoryGirl.create(:element, :name => 'headline') }
|
|
104
|
+
|
|
105
|
+
context "with default value present" do
|
|
106
|
+
before do
|
|
107
|
+
element.stub(:content_description_for).and_return({'name' => 'headline', 'type' => 'EssenceText', 'default' => 'Welcome'})
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should have the ingredient column filled with default value." do
|
|
111
|
+
Content.create_from_scratch(element, :name => 'headline').ingredient.should == "Welcome"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe '#ingredient=' do
|
|
117
|
+
it "should set the given value to the ingredient column of essence" do
|
|
118
|
+
c = Content.create_from_scratch(element, :name => 'headline')
|
|
119
|
+
c.ingredient = "Welcome"
|
|
120
|
+
c.ingredient.should == "Welcome"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context "no essence associated" do
|
|
124
|
+
let (:element) { FactoryGirl.create(:element, :name => 'headline') }
|
|
125
|
+
|
|
126
|
+
it "should raise error" do
|
|
127
|
+
c = Content.create(:element_id => element.id, :name => 'headline')
|
|
128
|
+
expect { c.ingredient = "Welcome" }.to raise_error
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
102
133
|
end
|
|
103
134
|
end
|
data/spec/models/element_spec.rb
CHANGED
|
@@ -263,9 +263,9 @@ module Alchemy
|
|
|
263
263
|
|
|
264
264
|
end
|
|
265
265
|
|
|
266
|
-
describe '
|
|
266
|
+
describe '.copy' do
|
|
267
267
|
|
|
268
|
-
let(:element) { FactoryGirl.create(:element, :create_contents_after_create => true) }
|
|
268
|
+
let(:element) { FactoryGirl.create(:element, :create_contents_after_create => true, :tag_list => 'red, yellow') }
|
|
269
269
|
|
|
270
270
|
it "should not create contents from scratch" do
|
|
271
271
|
copy = Element.copy(element)
|
|
@@ -282,6 +282,11 @@ module Alchemy
|
|
|
282
282
|
copy.contents.collect(&:id).should_not == element.contents.collect(&:id)
|
|
283
283
|
end
|
|
284
284
|
|
|
285
|
+
it "the copy should include source element tags" do
|
|
286
|
+
copy = Element.copy(element)
|
|
287
|
+
copy.tag_list.should == element.tag_list
|
|
288
|
+
end
|
|
289
|
+
|
|
285
290
|
end
|
|
286
291
|
|
|
287
292
|
describe "Finding previous or next element." do
|
data/spec/models/page_spec.rb
CHANGED
|
@@ -646,5 +646,41 @@ module Alchemy
|
|
|
646
646
|
|
|
647
647
|
end
|
|
648
648
|
|
|
649
|
+
describe '.copy' do
|
|
650
|
+
let (:page) { FactoryGirl.create(:page, :name => 'Source') }
|
|
651
|
+
subject { Page.copy(page) }
|
|
652
|
+
|
|
653
|
+
it "the copy should have added (copy) to name" do
|
|
654
|
+
subject.name.should == "#{page.name} (Copy)"
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
context "page with tags" do
|
|
658
|
+
before { page.tag_list = 'red, yellow'; page.save }
|
|
659
|
+
|
|
660
|
+
it "the copy should have source tag_list" do
|
|
661
|
+
subject.tag_list.should_not be_empty
|
|
662
|
+
subject.tag_list.should == page.tag_list
|
|
663
|
+
end
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
context "page with elements" do
|
|
667
|
+
before { page.elements << FactoryGirl.create(:element) }
|
|
668
|
+
|
|
669
|
+
it "the copy should have source elements" do
|
|
670
|
+
subject.elements.should_not be_empty
|
|
671
|
+
subject.elements.count.should == page.elements.count
|
|
672
|
+
end
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
context "page with cells" do
|
|
676
|
+
before { page.cells << FactoryGirl.create(:cell) }
|
|
677
|
+
|
|
678
|
+
it "the copy should have source cells" do
|
|
679
|
+
subject.cells.should_not be_empty
|
|
680
|
+
subject.cells.count.should == page.cells.length # It must be length, because!
|
|
681
|
+
end
|
|
682
|
+
end
|
|
683
|
+
end
|
|
684
|
+
|
|
649
685
|
end
|
|
650
686
|
end
|
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* jQuery DialogExtend 1.0.1
|
|
3
|
+
*
|
|
4
|
+
* tvd: fixes for jQuery UI 1.9 and adjusts sizes.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2010 Shum Ting Hin
|
|
7
|
+
*
|
|
8
|
+
* Licensed under MIT
|
|
9
|
+
* http:// www.opensource.org/licenses/mit-license.php
|
|
10
|
+
*
|
|
11
|
+
* Project Home:
|
|
12
|
+
* http:// code.google.com/p/jquery-dialogextend/
|
|
13
|
+
*
|
|
14
|
+
* Depends:
|
|
15
|
+
* jQuery 1.7.2
|
|
16
|
+
* jQuery UI Dialog 1.8.22
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
(function($){
|
|
20
|
+
|
|
21
|
+
// default settings
|
|
22
|
+
var defaults = {
|
|
23
|
+
"close" : true,
|
|
24
|
+
"maximize" : false,
|
|
25
|
+
"minimize" : false,
|
|
26
|
+
"dblclick" : false,
|
|
27
|
+
"titlebar" : false,
|
|
28
|
+
"icons" : {
|
|
29
|
+
"close" : "ui-icon-closethick",
|
|
30
|
+
"maximize" : "ui-icon-extlink",
|
|
31
|
+
"minimize" : "ui-icon-minus",
|
|
32
|
+
"restore" : "ui-icon-newwin"
|
|
33
|
+
},
|
|
34
|
+
"events" : {
|
|
35
|
+
"load" : null,
|
|
36
|
+
"beforeCollapse" : null,
|
|
37
|
+
"beforeMaximize" : null,
|
|
38
|
+
"beforeMinimize" : null,
|
|
39
|
+
"beforeRestore" : null,
|
|
40
|
+
"collapse" : null,
|
|
41
|
+
"maximize" : null,
|
|
42
|
+
"minimize" : null,
|
|
43
|
+
"restore" : null
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// plugin settings (will be modified during init)
|
|
48
|
+
var settings;
|
|
49
|
+
|
|
50
|
+
// plubic methods
|
|
51
|
+
var methods = {
|
|
52
|
+
|
|
53
|
+
"init" : function( options ){
|
|
54
|
+
var self = this;
|
|
55
|
+
// validation
|
|
56
|
+
if ( !$(self).dialog ) {
|
|
57
|
+
$.error( "jQuery.dialogExtend Error : Only jQuery UI Dialog element is accepted" );
|
|
58
|
+
}
|
|
59
|
+
// merge defaults & options, without modifying the defaults
|
|
60
|
+
options = options || {};
|
|
61
|
+
options.icons = options.icons || {};
|
|
62
|
+
options.events = options.events || {};
|
|
63
|
+
settings = $.extend({}, defaults, options);
|
|
64
|
+
settings.icons = $.extend({}, defaults.icons, options.icons);
|
|
65
|
+
settings.events = $.extend({}, defaults.events, options.events);
|
|
66
|
+
// initiate plugin...
|
|
67
|
+
$(self).each(function(){
|
|
68
|
+
$(this)
|
|
69
|
+
// do bunch of things...
|
|
70
|
+
.dialogExtend("_verifySettings")
|
|
71
|
+
.dialogExtend("_initEvents")
|
|
72
|
+
.dialogExtend("_initStyles")
|
|
73
|
+
.dialogExtend("_initButtons")
|
|
74
|
+
.dialogExtend("_initTitleBar")
|
|
75
|
+
// set default dialog state
|
|
76
|
+
.dialogExtend("_setState", "normal")
|
|
77
|
+
// trigger custom event when done
|
|
78
|
+
.dialogExtend("_trigger", "load");
|
|
79
|
+
});
|
|
80
|
+
// maintain chainability
|
|
81
|
+
return self;
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
"state" : function(){
|
|
85
|
+
return $(this).data("dialog-extend-state");
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
"collapse" : function(){
|
|
89
|
+
var self = this;
|
|
90
|
+
// calculate new dimension
|
|
91
|
+
var newHeight = $(this).dialog("widget").find(".ui-dialog-titlebar").height()+15;
|
|
92
|
+
// start!
|
|
93
|
+
$(self)
|
|
94
|
+
// trigger custom event
|
|
95
|
+
.dialogExtend("_trigger", "beforeCollapse")
|
|
96
|
+
// remember original state
|
|
97
|
+
.dialogExtend("_saveSnapshot")
|
|
98
|
+
// modify dialog size (after hiding content)
|
|
99
|
+
.dialog("option", {
|
|
100
|
+
"resizable" : false,
|
|
101
|
+
"height" : newHeight,
|
|
102
|
+
"maxHeight" : newHeight
|
|
103
|
+
})
|
|
104
|
+
// hide content
|
|
105
|
+
// hide button-pane
|
|
106
|
+
// make title-bar no-wrap
|
|
107
|
+
.hide()
|
|
108
|
+
.dialog("widget")
|
|
109
|
+
.find(".ui-dialog-buttonpane:visible").hide().end()
|
|
110
|
+
.find(".ui-dialog-titlebar").css("white-space", "nowrap").end()
|
|
111
|
+
.find(".ui-dialog-content")
|
|
112
|
+
// mark new state
|
|
113
|
+
.dialogExtend("_setState", "collapsed")
|
|
114
|
+
// trigger custom event
|
|
115
|
+
.dialogExtend("_trigger", "collapse");
|
|
116
|
+
// maintain chainability
|
|
117
|
+
return self;
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
"maximize" : function(){
|
|
121
|
+
var self = this;
|
|
122
|
+
// caculate new dimension
|
|
123
|
+
var newHeight = $(window).height()+10;
|
|
124
|
+
var newWidth = $(window).width()-4;
|
|
125
|
+
// start!
|
|
126
|
+
$(self)
|
|
127
|
+
// trigger custom event
|
|
128
|
+
.dialogExtend("_trigger", "beforeMaximize")
|
|
129
|
+
// restore to normal state first (when necessary)
|
|
130
|
+
.each(function(){
|
|
131
|
+
if ( $(this).dialogExtend("state") != "normal" ) {
|
|
132
|
+
$(this).dialogExtend("_restoreWithoutTriggerEvent");
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
// remember original state
|
|
136
|
+
.dialogExtend("_saveSnapshot")
|
|
137
|
+
// fix dialog from scrolling
|
|
138
|
+
.dialog("widget")
|
|
139
|
+
.css({
|
|
140
|
+
// ie6 does not support {position:fixed} ===> simply use {absolute}
|
|
141
|
+
"position" : ( $.browser.msie && parseInt($.browser.version) <= 6 ) ? "absolute" : "fixed"
|
|
142
|
+
})
|
|
143
|
+
.find(".ui-dialog-content")
|
|
144
|
+
// show content
|
|
145
|
+
// show button-pane (when minimized/collapsed)
|
|
146
|
+
.show()
|
|
147
|
+
.dialog("widget")
|
|
148
|
+
.find(".ui-dialog-buttonpane").show().end()
|
|
149
|
+
.find(".ui-dialog-content")
|
|
150
|
+
// modify dialog with new config
|
|
151
|
+
.dialog("option", {
|
|
152
|
+
"resizable" : false,
|
|
153
|
+
"draggable" : false,
|
|
154
|
+
"height" : newHeight,
|
|
155
|
+
"width" : newWidth,
|
|
156
|
+
"position" : [1, 1]
|
|
157
|
+
})
|
|
158
|
+
// disable draggable-handle (for <titlebar=none> only)
|
|
159
|
+
.dialog("widget")
|
|
160
|
+
.find(".ui-dialog-draggable-handle").css("cursor", "text").end()
|
|
161
|
+
.find(".ui-dialog-content")
|
|
162
|
+
// mark new state
|
|
163
|
+
.dialogExtend("_setState", "maximized")
|
|
164
|
+
// modify dialog buttons according to new state
|
|
165
|
+
.dialogExtend("_toggleButtons")
|
|
166
|
+
// trigger custom event
|
|
167
|
+
.dialogExtend("_trigger", "maximize");
|
|
168
|
+
// maintain chainability
|
|
169
|
+
return self;
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
"minimize" : function(){
|
|
173
|
+
var self = this;
|
|
174
|
+
// caculate new dimension
|
|
175
|
+
var newHeight = $(this).dialog("widget").find(".ui-dialog-titlebar").height()+15;
|
|
176
|
+
var newWidth = 200;
|
|
177
|
+
// create container for (multiple) minimized dialogs (when necessary)
|
|
178
|
+
if ( $("#dialog-extend-fixed-container").length ) {
|
|
179
|
+
var fixedContainer = $("#dialog-extend-fixed-container");
|
|
180
|
+
} else {
|
|
181
|
+
var fixedContainer = $('<div id="dialog-extend-fixed-container"></div>').appendTo("body");
|
|
182
|
+
}
|
|
183
|
+
$(fixedContainer).css({
|
|
184
|
+
// ie6 does not support {position:fixed} ===> simply use {absolute}
|
|
185
|
+
"position" : ( $.browser.mise && parseInt($.browser.version) <= 6 ) ? "absolute" : "fixed",
|
|
186
|
+
"bottom" : 1,
|
|
187
|
+
"left" : 1,
|
|
188
|
+
"z-index" : 9999
|
|
189
|
+
});
|
|
190
|
+
// start!
|
|
191
|
+
$(self)
|
|
192
|
+
// trigger custom event
|
|
193
|
+
.dialogExtend("_trigger", "beforeMinimize")
|
|
194
|
+
// remember original state
|
|
195
|
+
.dialogExtend("_saveSnapshot")
|
|
196
|
+
// move dialog from body to container (at lower-left-hand corner)
|
|
197
|
+
.dialog("widget")
|
|
198
|
+
.css({
|
|
199
|
+
// float is essential for stacking dialog when there are many many minimized dialogs
|
|
200
|
+
"float" : "left",
|
|
201
|
+
"margin" : 1,
|
|
202
|
+
"position" : "static"
|
|
203
|
+
})
|
|
204
|
+
.appendTo(fixedContainer)
|
|
205
|
+
.find(".ui-dialog-content")
|
|
206
|
+
// modify dialog with new config
|
|
207
|
+
.dialog("option", {
|
|
208
|
+
"resizable" : false,
|
|
209
|
+
//"draggable" : false,
|
|
210
|
+
"height" : newHeight,
|
|
211
|
+
"width" : newWidth
|
|
212
|
+
})
|
|
213
|
+
// avoid title text overlap buttons
|
|
214
|
+
.dialog("widget")
|
|
215
|
+
.find(".ui-dialog-titlebar").each(function(){
|
|
216
|
+
var titlebar = this;
|
|
217
|
+
var buttonPane = $(this).find(".ui-dialog-titlebar-buttonpane");
|
|
218
|
+
var titleText = $(this).find(".ui-dialog-title");
|
|
219
|
+
$(titleText).css({
|
|
220
|
+
'overflow': 'hidden',
|
|
221
|
+
'width' : $(titlebar).width() - $(buttonPane).width() + 10
|
|
222
|
+
});
|
|
223
|
+
}).end()
|
|
224
|
+
.find(".ui-dialog-content")
|
|
225
|
+
// hide content
|
|
226
|
+
// hide button-pane
|
|
227
|
+
// make title-bar no-wrap
|
|
228
|
+
.hide()
|
|
229
|
+
.dialog("widget")
|
|
230
|
+
.find(".ui-dialog-buttonpane:visible").hide().end()
|
|
231
|
+
.find(".ui-dialog-titlebar").css("white-space", "nowrap").end()
|
|
232
|
+
.find(".ui-dialog-content")
|
|
233
|
+
// disable draggable-handle (for <titlebar=none> only)
|
|
234
|
+
.dialog("widget")
|
|
235
|
+
.draggable("option", "handle", null)
|
|
236
|
+
.find(".ui-dialog-draggable-handle").css("cursor", "text").end()
|
|
237
|
+
.find(".ui-dialog-content")
|
|
238
|
+
// mark new state
|
|
239
|
+
.dialogExtend("_setState", "minimized")
|
|
240
|
+
// modify dialog button according to new state
|
|
241
|
+
.dialogExtend("_toggleButtons")
|
|
242
|
+
// trigger custom event
|
|
243
|
+
.dialogExtend("_trigger", "minimize");
|
|
244
|
+
// maintain chainability
|
|
245
|
+
return self;
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
"restore" : function(){
|
|
249
|
+
var self = this;
|
|
250
|
+
// start!
|
|
251
|
+
$(self)
|
|
252
|
+
// trigger custom event
|
|
253
|
+
.dialogExtend("_trigger", "beforeRestore")
|
|
254
|
+
// restore to normal
|
|
255
|
+
.dialogExtend("_restoreWithoutTriggerEvent")
|
|
256
|
+
// mark new state ===> must set state *AFTER* restore because '_restoreWithoutTriggerEvent' will check 'beforeState'
|
|
257
|
+
.dialogExtend("_setState", "normal")
|
|
258
|
+
// modify dialog buttons according to new state
|
|
259
|
+
.dialogExtend("_toggleButtons")
|
|
260
|
+
// trigger custom event
|
|
261
|
+
.dialogExtend("_trigger", "restore");
|
|
262
|
+
// maintain chainability
|
|
263
|
+
return self;
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
"_initButtons" : function(){
|
|
267
|
+
var self = this;
|
|
268
|
+
// start operation on titlebar
|
|
269
|
+
var titlebar = $(self).dialog("widget").find(".ui-dialog-titlebar");
|
|
270
|
+
// create container for buttons
|
|
271
|
+
var buttonPane = $('<div class="ui-dialog-titlebar-buttonpane"></div>').appendTo(titlebar);
|
|
272
|
+
$(buttonPane).css({
|
|
273
|
+
"position" : "absolute",
|
|
274
|
+
"top" : "50%",
|
|
275
|
+
"right" : "0.3em",
|
|
276
|
+
"margin-top" : "-10px",
|
|
277
|
+
"height" : "18px"
|
|
278
|
+
});
|
|
279
|
+
// move 'close' button to button-pane
|
|
280
|
+
$(titlebar)
|
|
281
|
+
.find(".ui-dialog-titlebar-close")
|
|
282
|
+
// override some unwanted jquery-ui styles
|
|
283
|
+
.css({ "position" : "static", "top" : "auto", "right" : "auto", "margin" : 0 })
|
|
284
|
+
// change icon
|
|
285
|
+
.find(".ui-icon").removeClass("ui-icon-closethick").addClass(settings.icons.close).end()
|
|
286
|
+
// move to button-pane
|
|
287
|
+
.appendTo(buttonPane)
|
|
288
|
+
.end();
|
|
289
|
+
// append other buttons to button-pane
|
|
290
|
+
$(buttonPane)
|
|
291
|
+
.append('<a class="ui-dialog-titlebar-maximize ui-corner-all" href="#"><span class="ui-icon '+settings.icons.maximize+'">maximize</span></a>')
|
|
292
|
+
.append('<a class="ui-dialog-titlebar-restore ui-corner-all" href="#"><span class="ui-icon '+settings.icons.restore+'">restore</span></a>')
|
|
293
|
+
.append('<a class="ui-dialog-titlebar-minimize ui-corner-all" href="#"><span class="ui-icon '+settings.icons.minimize+'">minimize</span></a>')
|
|
294
|
+
// add effect to buttons
|
|
295
|
+
.find(".ui-dialog-titlebar-maximize,.ui-dialog-titlebar-minimize,.ui-dialog-titlebar-restore")
|
|
296
|
+
.attr("role", "button")
|
|
297
|
+
.mouseover(function(){ $(this).addClass("ui-state-hover"); })
|
|
298
|
+
.mouseout(function(){ $(this).removeClass("ui-state-hover"); })
|
|
299
|
+
.focus(function(){ $(this).addClass("ui-state-focus"); })
|
|
300
|
+
.blur(function(){ $(this).removeClass("ui-state-focus"); })
|
|
301
|
+
.end()
|
|
302
|
+
// default show buttons
|
|
303
|
+
// set button positions
|
|
304
|
+
// on-click-button
|
|
305
|
+
.find(".ui-dialog-titlebar-close")
|
|
306
|
+
.toggle(settings.close)
|
|
307
|
+
.end()
|
|
308
|
+
.find(".ui-dialog-titlebar-maximize")
|
|
309
|
+
.toggle(settings.maximize)
|
|
310
|
+
.click(function(e){
|
|
311
|
+
e.preventDefault();
|
|
312
|
+
$(self).dialogExtend("maximize");
|
|
313
|
+
})
|
|
314
|
+
.end()
|
|
315
|
+
.find(".ui-dialog-titlebar-minimize")
|
|
316
|
+
.toggle(settings.minimize)
|
|
317
|
+
.click(function(e){
|
|
318
|
+
e.preventDefault();
|
|
319
|
+
$(self).dialogExtend("minimize");
|
|
320
|
+
})
|
|
321
|
+
.end()
|
|
322
|
+
.find(".ui-dialog-titlebar-restore")
|
|
323
|
+
.hide()
|
|
324
|
+
.click(function(e){
|
|
325
|
+
e.preventDefault();
|
|
326
|
+
$(self).dialogExtend("restore");
|
|
327
|
+
})
|
|
328
|
+
.end();
|
|
329
|
+
// other titlebar behaviors
|
|
330
|
+
$(titlebar)
|
|
331
|
+
// on-dblclick-titlebar : maximize/minimize/collapse/restore
|
|
332
|
+
.dblclick(function(evt){
|
|
333
|
+
if ( settings.dblclick && settings.dblclick.length ) {
|
|
334
|
+
$(self).dialogExtend( $(self).dialogExtend("state") != "normal" ? "restore" : settings.dblclick );
|
|
335
|
+
}
|
|
336
|
+
})
|
|
337
|
+
// avoid text-highlight when double-click
|
|
338
|
+
.select(function(){
|
|
339
|
+
return false;
|
|
340
|
+
});
|
|
341
|
+
// maintain chainability
|
|
342
|
+
return self;
|
|
343
|
+
},
|
|
344
|
+
|
|
345
|
+
"_initEvents" : function(){
|
|
346
|
+
var self = this;
|
|
347
|
+
// bind event callbacks which specified at init
|
|
348
|
+
$.each(settings.events, function(type){
|
|
349
|
+
if ( $.isFunction( settings.events[type] ) ) {
|
|
350
|
+
$(self).bind(type+".dialogExtend", settings.events[type]);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
// maintain chainability
|
|
354
|
+
return self;
|
|
355
|
+
},
|
|
356
|
+
|
|
357
|
+
"_initStyles" : function(){
|
|
358
|
+
var self = this;
|
|
359
|
+
// append styles for this plugin to body
|
|
360
|
+
if ( !$(".dialog-extend-css").length ) {
|
|
361
|
+
var style = '';
|
|
362
|
+
style += '<style class="dialog-extend-css" type="text/css">';
|
|
363
|
+
style += '.ui-dialog .ui-dialog-titlebar-buttonpane>a { float: right; }';
|
|
364
|
+
style += '.ui-dialog .ui-dialog-titlebar-maximize,';
|
|
365
|
+
style += '.ui-dialog .ui-dialog-titlebar-minimize,';
|
|
366
|
+
style += '.ui-dialog .ui-dialog-titlebar-restore { width: 19px; padding: 1px; height: 18px; }';
|
|
367
|
+
style += '.ui-dialog .ui-dialog-titlebar-maximize span,';
|
|
368
|
+
style += '.ui-dialog .ui-dialog-titlebar-minimize span,';
|
|
369
|
+
style += '.ui-dialog .ui-dialog-titlebar-restore span { display: block; margin: 1px; }';
|
|
370
|
+
style += '.ui-dialog .ui-dialog-titlebar-maximize:hover,';
|
|
371
|
+
style += '.ui-dialog .ui-dialog-titlebar-maximize:focus,';
|
|
372
|
+
style += '.ui-dialog .ui-dialog-titlebar-minimize:hover,';
|
|
373
|
+
style += '.ui-dialog .ui-dialog-titlebar-minimize:focus,';
|
|
374
|
+
style += '.ui-dialog .ui-dialog-titlebar-restore:hover,';
|
|
375
|
+
style += '.ui-dialog .ui-dialog-titlebar-restore:focus { padding: 0; }';
|
|
376
|
+
style += '.ui-dialog .ui-dialog-titlebar ::selection { background-color: transparent; }';
|
|
377
|
+
style += '</style>';
|
|
378
|
+
$(style).appendTo("body");
|
|
379
|
+
}
|
|
380
|
+
// maintain chainability
|
|
381
|
+
return self;
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
"_initTitleBar" : function(){
|
|
385
|
+
var self = this;
|
|
386
|
+
// modify title bar
|
|
387
|
+
switch ( settings.titlebar ) {
|
|
388
|
+
case false:
|
|
389
|
+
// do nothing
|
|
390
|
+
break;
|
|
391
|
+
case "none":
|
|
392
|
+
// create new draggable-handle as substitute of title bar
|
|
393
|
+
if ( $(self).dialog("option", "draggable") ) {
|
|
394
|
+
var handle = $("<div />").addClass("ui-dialog-draggable-handle").css("cursor", "move").height(5);
|
|
395
|
+
$(self).dialog("widget").prepend(handle).draggable("option", "handle", handle);
|
|
396
|
+
}
|
|
397
|
+
// remove title bar and keep it draggable
|
|
398
|
+
$(self)
|
|
399
|
+
.dialog("widget")
|
|
400
|
+
.find(".ui-dialog-titlebar")
|
|
401
|
+
// clear title text
|
|
402
|
+
.find(".ui-dialog-title").html(" ").end()
|
|
403
|
+
// keep buttons at upper-right-hand corner
|
|
404
|
+
.css({
|
|
405
|
+
"background-color" : "transparent",
|
|
406
|
+
"background-image" : "none",
|
|
407
|
+
"border" : 0,
|
|
408
|
+
"position" : "absolute",
|
|
409
|
+
"right" : 0,
|
|
410
|
+
"top" : 0,
|
|
411
|
+
"z-index" : 9999
|
|
412
|
+
})
|
|
413
|
+
.end();
|
|
414
|
+
break;
|
|
415
|
+
case "transparent":
|
|
416
|
+
// remove title style
|
|
417
|
+
$(self)
|
|
418
|
+
.dialog("widget")
|
|
419
|
+
.find(".ui-dialog-titlebar")
|
|
420
|
+
.css({
|
|
421
|
+
"background-color" : "transparent",
|
|
422
|
+
"background-image" : "none",
|
|
423
|
+
"border" : 0
|
|
424
|
+
});
|
|
425
|
+
break;
|
|
426
|
+
default:
|
|
427
|
+
$.error( "jQuery.dialogExtend Error : Invalid <titlebar> value '" + settings.titlebar + "'" );
|
|
428
|
+
}
|
|
429
|
+
// maintain chainability
|
|
430
|
+
return self;
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
"_loadSnapshot" : function(){
|
|
434
|
+
var self = this;
|
|
435
|
+
return {
|
|
436
|
+
"config" : {
|
|
437
|
+
"resizable" : $(self).data("original-config-resizable"),
|
|
438
|
+
"draggable" : $(self).data("original-config-draggable")
|
|
439
|
+
},
|
|
440
|
+
"size" : {
|
|
441
|
+
"height" : $(self).data("original-size-height"),
|
|
442
|
+
"width" : $(self).data("original-size-width"),
|
|
443
|
+
"maxHeight" : $(self).data("original-size-maxHeight")
|
|
444
|
+
},
|
|
445
|
+
"position" : {
|
|
446
|
+
"mode" : $(self).data("original-position-mode"),
|
|
447
|
+
"left" : $(self).data("original-position-left"),
|
|
448
|
+
"top" : $(self).data("original-position-top")
|
|
449
|
+
},
|
|
450
|
+
"titlebar" : {
|
|
451
|
+
"wrap" : $(self).data("original-titlebar-wrap")
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
},
|
|
455
|
+
|
|
456
|
+
"_restoreFromCollapsed" : function(){
|
|
457
|
+
var self = this;
|
|
458
|
+
var original = $(this).dialogExtend("_loadSnapshot");
|
|
459
|
+
// restore dialog
|
|
460
|
+
$(self)
|
|
461
|
+
// show content
|
|
462
|
+
// show button-pane
|
|
463
|
+
// fix title-bar wrap
|
|
464
|
+
.show()
|
|
465
|
+
.dialog("widget")
|
|
466
|
+
.find(".ui-dialog-buttonpane:hidden").show().end()
|
|
467
|
+
.find(".ui-dialog-titlebar").css("white-space", original.titlebar.wrap).end()
|
|
468
|
+
.find(".ui-dialog-content")
|
|
469
|
+
// restore config & size
|
|
470
|
+
.dialog("option", {
|
|
471
|
+
"resizable" : original.config.resizable,
|
|
472
|
+
"height" : original.size.height,
|
|
473
|
+
"maxHeight" : original.size.maxHeight
|
|
474
|
+
});
|
|
475
|
+
// maintain chainability
|
|
476
|
+
return self;
|
|
477
|
+
},
|
|
478
|
+
|
|
479
|
+
"_restoreFromNormal" : function(){
|
|
480
|
+
// do nothing actually...
|
|
481
|
+
// maintain chainability
|
|
482
|
+
return this;
|
|
483
|
+
},
|
|
484
|
+
|
|
485
|
+
"_restoreFromMaximized" : function(){
|
|
486
|
+
var self = this;
|
|
487
|
+
var original = $(this).dialogExtend("_loadSnapshot");
|
|
488
|
+
// restore dialog
|
|
489
|
+
$(self)
|
|
490
|
+
// free dialog from scrolling
|
|
491
|
+
// fix title-bar wrap (if dialog was minimized/collapsed)
|
|
492
|
+
.dialog("widget")
|
|
493
|
+
.css("position", original.position.mode)
|
|
494
|
+
.find(".ui-dialog-titlebar").css("white-space", original.titlebar.wrap).end()
|
|
495
|
+
.find(".ui-dialog-content")
|
|
496
|
+
// restore config & size
|
|
497
|
+
.dialog("option", {
|
|
498
|
+
"resizable" : original.config.resizable,
|
|
499
|
+
"draggable" : original.config.draggable,
|
|
500
|
+
"height" : original.size.height,
|
|
501
|
+
"width" : original.size.width,
|
|
502
|
+
"maxHeight" : original.size.maxHeight
|
|
503
|
+
})
|
|
504
|
+
// restore position *AFTER* size restored
|
|
505
|
+
.dialog("option", {
|
|
506
|
+
"position" : [ original.position.left, original.position.top ]
|
|
507
|
+
})
|
|
508
|
+
// restore draggable-handle (for <titlebar=none> only)
|
|
509
|
+
.dialog("widget")
|
|
510
|
+
.draggable("option", "handle", $(this).find(".ui-dialog-draggable-handle"))
|
|
511
|
+
.find(".ui-dialog-draggable-handle")
|
|
512
|
+
.css("cursor", "move");
|
|
513
|
+
// maintain chainability
|
|
514
|
+
return self;
|
|
515
|
+
},
|
|
516
|
+
|
|
517
|
+
"_restoreFromMinimized" : function(){
|
|
518
|
+
var self = this;
|
|
519
|
+
var original = $(this).dialogExtend("_loadSnapshot");
|
|
520
|
+
// restore dialog
|
|
521
|
+
$(self)
|
|
522
|
+
// move dialog back from container to body
|
|
523
|
+
.dialog("widget")
|
|
524
|
+
.appendTo("body")
|
|
525
|
+
.css({
|
|
526
|
+
"float" : "none",
|
|
527
|
+
"margin" : 0,
|
|
528
|
+
"position" : original.position.mode
|
|
529
|
+
})
|
|
530
|
+
.find(".ui-dialog-content")
|
|
531
|
+
// revert title text
|
|
532
|
+
.dialog("widget")
|
|
533
|
+
.find(".ui-dialog-title")
|
|
534
|
+
.css({ "width" : "auto" })
|
|
535
|
+
.end()
|
|
536
|
+
.find(".ui-dialog-content")
|
|
537
|
+
// show content
|
|
538
|
+
// show button-pane
|
|
539
|
+
// fix title-bar wrap
|
|
540
|
+
.show()
|
|
541
|
+
.dialog("widget")
|
|
542
|
+
.find(".ui-dialog-buttonpane:hidden").show().end()
|
|
543
|
+
.find(".ui-dialog-titlebar").css("white-space", original.titlebar.wrap).end()
|
|
544
|
+
.find(".ui-dialog-content")
|
|
545
|
+
// restore config & size
|
|
546
|
+
.dialog("option", {
|
|
547
|
+
"resizable" : original.config.resizable,
|
|
548
|
+
"draggable" : original.config.draggable,
|
|
549
|
+
"height" : original.size.height,
|
|
550
|
+
"width" : original.size.width,
|
|
551
|
+
"maxHeight" : original.size.maxHeight
|
|
552
|
+
})
|
|
553
|
+
// restore position *AFTER* size restored
|
|
554
|
+
.dialog("option", {
|
|
555
|
+
"position" : [ original.position.left, original.position.top ]
|
|
556
|
+
})
|
|
557
|
+
// restore draggable-handle (for <titlebar=none> only)
|
|
558
|
+
.dialog("widget")
|
|
559
|
+
.draggable("option", "handle", $(this).find(".ui-dialog-draggable-handle"))
|
|
560
|
+
.find(".ui-dialog-draggable-handle")
|
|
561
|
+
.css("cursor", "move");
|
|
562
|
+
// maintain chainability
|
|
563
|
+
return self;
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
"_restoreWithoutTriggerEvent" : function(){
|
|
567
|
+
var self = this;
|
|
568
|
+
var beforeState = $(self).dialogExtend("state");
|
|
569
|
+
$(self)
|
|
570
|
+
// restore dialog according to previous state
|
|
571
|
+
.dialogExtend(
|
|
572
|
+
beforeState == "maximized" ? "_restoreFromMaximized" :
|
|
573
|
+
beforeState == "minimized" ? "_restoreFromMinimized" :
|
|
574
|
+
beforeState == "collapsed" ? "_restoreFromCollapsed" :
|
|
575
|
+
beforeState == "normal" ? "_restoreFromNormal" :
|
|
576
|
+
$.error( "jQuery.dialogExtend Error : Cannot restore dialog from unknown state '" + beforeState +"'" )
|
|
577
|
+
);
|
|
578
|
+
// maintain chainability
|
|
579
|
+
return self;
|
|
580
|
+
},
|
|
581
|
+
|
|
582
|
+
"_saveSnapshot" : function(){
|
|
583
|
+
var self = this;
|
|
584
|
+
// remember all configs under normal state
|
|
585
|
+
if ( $(self).dialogExtend("state") == "normal" ) {
|
|
586
|
+
$(self)
|
|
587
|
+
.data("original-config-resizable", $(self).dialog("option", "resizable"))
|
|
588
|
+
.data("original-config-draggable", $(self).dialog("option", "draggable"))
|
|
589
|
+
.data("original-size-height", $(self).dialog("widget").height()+14)
|
|
590
|
+
.data("original-size-width", $(self).dialog("option", "width"))
|
|
591
|
+
.data("original-size-maxHeight", $(self).dialog("option", "maxHeight"))
|
|
592
|
+
.data("original-position-mode", $(self).dialog("widget").css("position"))
|
|
593
|
+
.data("original-position-left", $(self).dialog("widget").offset().left)
|
|
594
|
+
.data("original-position-top", $(self).dialog("widget").offset().top)
|
|
595
|
+
.data("original-titlebar-wrap", $(self).dialog("widget").find(".ui-dialog-titlebar").css("white-space"));
|
|
596
|
+
}
|
|
597
|
+
// maintain chainability
|
|
598
|
+
return self;
|
|
599
|
+
},
|
|
600
|
+
|
|
601
|
+
"_setState" : function(state){
|
|
602
|
+
var self = this;
|
|
603
|
+
$(self)
|
|
604
|
+
// toggle data state
|
|
605
|
+
.data("dialog-extend-state", state)
|
|
606
|
+
// toggle class
|
|
607
|
+
.removeClass("ui-dialog-normal ui-dialog-maximized ui-dialog-minimized ui-dialog-collapsed")
|
|
608
|
+
.addClass("ui-dialog-"+state);
|
|
609
|
+
// maintain chainability
|
|
610
|
+
return self;
|
|
611
|
+
},
|
|
612
|
+
|
|
613
|
+
"_toggleButtons" : function(){
|
|
614
|
+
var self = this;
|
|
615
|
+
// show or hide buttons & decide position
|
|
616
|
+
$(self).dialog("widget")
|
|
617
|
+
.find(".ui-dialog-titlebar-maximize")
|
|
618
|
+
.toggle( $(self).dialogExtend("state") != "maximized" && settings.maximize )
|
|
619
|
+
.end()
|
|
620
|
+
.find(".ui-dialog-titlebar-minimize")
|
|
621
|
+
.toggle( $(self).dialogExtend("state") != "minimized" && settings.minimize )
|
|
622
|
+
.end()
|
|
623
|
+
.find(".ui-dialog-titlebar-restore")
|
|
624
|
+
.toggle( $(self).dialogExtend("state") != "normal" && ( settings.maximize || settings.minimize ) )
|
|
625
|
+
.css({ "right" : $(self).dialogExtend("state") == "maximized" ? "1.4em" : $(self).dialogExtend("state") == "minimized" ? !settings.maximize ? "1.4em" : "2.5em" : "-9999em" })
|
|
626
|
+
.end();
|
|
627
|
+
// maintain chainability
|
|
628
|
+
return self;
|
|
629
|
+
},
|
|
630
|
+
|
|
631
|
+
"_trigger" : function( type ){
|
|
632
|
+
var self = this;
|
|
633
|
+
// trigger event with namespace when user bind to it
|
|
634
|
+
$(self).triggerHandler(type+".dialogExtend", this);
|
|
635
|
+
// maintain chainability
|
|
636
|
+
return self;
|
|
637
|
+
},
|
|
638
|
+
|
|
639
|
+
"_verifySettings" : function(){
|
|
640
|
+
var self = this;
|
|
641
|
+
// check <dblclick> option
|
|
642
|
+
if ( !settings.dblclick ) {
|
|
643
|
+
} else if ( settings.dblclick == "maximize" ) {
|
|
644
|
+
} else if ( settings.dblclick == "minimize" ) {
|
|
645
|
+
} else if ( settings.dblclick == "collapse" ) {
|
|
646
|
+
} else {
|
|
647
|
+
$.error( "jQuery.dialogExtend Error : Invalid <dblclick> value '" + settings.dblclick + "'" );
|
|
648
|
+
settings.dblclick = false;
|
|
649
|
+
}
|
|
650
|
+
// check <titlebar> option
|
|
651
|
+
if ( !settings.titlebar ) {
|
|
652
|
+
} else if ( settings.titlebar == "none" ) {
|
|
653
|
+
} else if ( settings.titlebar == "transparent" ) {
|
|
654
|
+
} else {
|
|
655
|
+
$.error( "jQuery.dialogExtend Error : Invalid <titlebar> value '" + settings.titlebar + "'" );
|
|
656
|
+
settings.titlebar = false;
|
|
657
|
+
}
|
|
658
|
+
// maintain chainability
|
|
659
|
+
return self;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
};
|
|
663
|
+
|
|
664
|
+
// core method
|
|
665
|
+
$.fn.dialogExtend = function( method ){
|
|
666
|
+
// method calling logic
|
|
667
|
+
if ( methods[ method ] ) {
|
|
668
|
+
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
|
|
669
|
+
} else if ( typeof method === "object" || ! method ) {
|
|
670
|
+
return methods.init.apply( this, arguments );
|
|
671
|
+
} else {
|
|
672
|
+
$.error( "jQuery.dialogExtend Error : Method <" + method + "> does not exist" );
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
|
|
676
|
+
}(jQuery));
|