sws 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/DOC.otl +34 -0
- data/doc/Makefile +13 -0
- data/doc/architecture.dia +0 -0
- data/doc/docbook/architecture.png +0 -0
- data/doc/docbook/concepts.docbook +474 -0
- data/doc/docbook/installation.docbook +57 -0
- data/doc/docbook/introduction.docbook +130 -0
- data/doc/docbook/sws_manual.docbook +35 -0
- data/doc/docbook/todo.docbook +38 -0
- data/doc/docbook/tutorial.docbook +594 -0
- data/examples/README +1 -0
- data/examples/addressbook/CardBrowse/CardBrowse.html +43 -0
- data/examples/addressbook/CardBrowse/CardBrowse.rb +65 -0
- data/examples/addressbook/CardBrowse/CardBrowse.sws +92 -0
- data/examples/addressbook/Login/LoginPage.html +12 -0
- data/examples/addressbook/Login/LoginPage.rb +19 -0
- data/examples/addressbook/Login/LoginPage.sws +15 -0
- data/examples/addressbook/README +1 -0
- data/examples/addressbook/addressbook.rb +70 -0
- data/examples/addressbook/application.yaml +8 -0
- data/examples/addressbook/db.yaml +7 -0
- data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.html +11 -0
- data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.rb +21 -0
- data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.sws +25 -0
- data/examples/component_demo/ComponentDemo.rb +21 -0
- data/examples/component_demo/ConditionalDemo/ConditionalDemo.html +18 -0
- data/examples/component_demo/ConditionalDemo/ConditionalDemo.rb +2 -0
- data/examples/component_demo/ConditionalDemo/ConditionalDemo.sws +22 -0
- data/examples/component_demo/FileUploadDemo/FileUploadDemo.html +10 -0
- data/examples/component_demo/FileUploadDemo/FileUploadDemo.rb +9 -0
- data/examples/component_demo/FileUploadDemo/FileUploadDemo.sws +33 -0
- data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.html +12 -0
- data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.rb +21 -0
- data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.sws +40 -0
- data/examples/component_demo/FormListsDemo/FormListsDemo.html +11 -0
- data/examples/component_demo/FormListsDemo/FormListsDemo.rb +37 -0
- data/examples/component_demo/FormListsDemo/FormListsDemo.sws +47 -0
- data/examples/component_demo/GenericDemo/GenericDemo.html +4 -0
- data/examples/component_demo/GenericDemo/GenericDemo.rb +2 -0
- data/examples/component_demo/GenericDemo/GenericDemo.sws +10 -0
- data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.html +8 -0
- data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.rb +20 -0
- data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.sws +19 -0
- data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.html +11 -0
- data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.rb +2 -0
- data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.sws +14 -0
- data/examples/component_demo/PageWrapper/PageWrapper.html +23 -0
- data/examples/component_demo/PageWrapper/PageWrapper.rb +2 -0
- data/examples/component_demo/PageWrapper/PageWrapper.sws +42 -0
- data/examples/component_demo/README +1 -0
- data/examples/component_demo/RepetitionDemo/RepetitionDemo.html +13 -0
- data/examples/component_demo/RepetitionDemo/RepetitionDemo.rb +19 -0
- data/examples/component_demo/RepetitionDemo/RepetitionDemo.sws +20 -0
- data/examples/component_demo/StringDemo/StringDemo.html +5 -0
- data/examples/component_demo/StringDemo/StringDemo.rb +16 -0
- data/examples/component_demo/StringDemo/StringDemo.sws +14 -0
- data/examples/component_demo/application.yaml +28 -0
- data/examples/component_demo/poweredby.jpg +0 -0
- data/examples/component_demo/style.css +1 -0
- data/examples/movies/Menu/Menu.html +3 -0
- data/examples/movies/Menu/Menu.rb +7 -0
- data/examples/movies/Menu/Menu.sws +7 -0
- data/examples/movies/MovieBrowse/MovieBrowse.html +68 -0
- data/examples/movies/MovieBrowse/MovieBrowse.rb +178 -0
- data/examples/movies/MovieBrowse/MovieBrowse.sws +127 -0
- data/examples/movies/README +1 -0
- data/examples/movies/UserBrowse/UserBrowse.html +50 -0
- data/examples/movies/UserBrowse/UserBrowse.rb +69 -0
- data/examples/movies/UserBrowse/UserBrowse.sws +49 -0
- data/examples/movies/application.yaml +11 -0
- data/examples/movies/da.rb +36 -0
- data/examples/movies/dbmovies.rb +44 -0
- data/examples/movies/frameworks/TestFramework/framework.yaml +4 -0
- data/examples/movies/frameworks/TestFramework/resources/im1.jpg +0 -0
- data/examples/movies/images/pbr1b.jpg +0 -0
- data/examples/movies/movies.rb +28 -0
- data/examples/movies/movies.sds +119 -0
- data/examples/movies/movies.sqlite +0 -0
- data/examples/movies/movies_mysql.sql +28 -0
- data/examples/movies/movies_postgres.sql +27 -0
- data/examples/movies/movies_sqlite.sql +28 -0
- data/lib/sws.rb +89 -0
- data/lib/sws/Core/components/CheckBox/CheckBox.api +5 -0
- data/lib/sws/Core/components/CheckBox/CheckBox.rb +45 -0
- data/lib/sws/Core/components/CheckBoxList/CheckBoxList.api +13 -0
- data/lib/sws/Core/components/CheckBoxList/CheckBoxList.rb +54 -0
- data/lib/sws/Core/components/Conditional/Conditional.api +3 -0
- data/lib/sws/Core/components/Conditional/Conditional.html +1 -0
- data/lib/sws/Core/components/Conditional/Conditional.rb +39 -0
- data/lib/sws/Core/components/Conditional/Conditional.sws +2 -0
- data/lib/sws/Core/components/Content/Content.rb +18 -0
- data/lib/sws/Core/components/ExceptionPage/ExceptionPage.html +13 -0
- data/lib/sws/Core/components/ExceptionPage/ExceptionPage.rb +18 -0
- data/lib/sws/Core/components/ExceptionPage/ExceptionPage.sws +16 -0
- data/lib/sws/Core/components/FileUpload/FileUpload.api +16 -0
- data/lib/sws/Core/components/FileUpload/FileUpload.rb +62 -0
- data/lib/sws/Core/components/Form/Form.api +9 -0
- data/lib/sws/Core/components/Form/Form.html +3 -0
- data/lib/sws/Core/components/Form/Form.rb +55 -0
- data/lib/sws/Core/components/Form/Form.sws +12 -0
- data/lib/sws/Core/components/GenericContainer/GenericContainer.api +10 -0
- data/lib/sws/Core/components/GenericContainer/GenericContainer.html +1 -0
- data/lib/sws/Core/components/GenericContainer/GenericContainer.rb +39 -0
- data/lib/sws/Core/components/GenericContainer/GenericContainer.sws +12 -0
- data/lib/sws/Core/components/GenericElement/GenericElement.api +10 -0
- data/lib/sws/Core/components/GenericElement/GenericElement.rb +34 -0
- data/lib/sws/Core/components/HiddenField/HiddenField.api +7 -0
- data/lib/sws/Core/components/HiddenField/HiddenField.rb +37 -0
- data/lib/sws/Core/components/Hyperlink/Hyperlink.api +13 -0
- data/lib/sws/Core/components/Hyperlink/Hyperlink.html +1 -0
- data/lib/sws/Core/components/Hyperlink/Hyperlink.rb +102 -0
- data/lib/sws/Core/components/Hyperlink/Hyperlink.sws +12 -0
- data/lib/sws/Core/components/Image/Image.api +11 -0
- data/lib/sws/Core/components/Image/Image.rb +49 -0
- data/lib/sws/Core/components/ImageButton/ImageButton.api +16 -0
- data/lib/sws/Core/components/ImageButton/ImageButton.rb +76 -0
- data/lib/sws/Core/components/Link/Link.api +11 -0
- data/lib/sws/Core/components/Link/Link.rb +39 -0
- data/lib/sws/Core/components/PasswordField/PasswordField.api +7 -0
- data/lib/sws/Core/components/PasswordField/PasswordField.rb +41 -0
- data/lib/sws/Core/components/RadioButton/RadioButton.api +7 -0
- data/lib/sws/Core/components/RadioButton/RadioButton.rb +44 -0
- data/lib/sws/Core/components/RadioButtonList/RadioButtonList.api +20 -0
- data/lib/sws/Core/components/RadioButtonList/RadioButtonList.rb +76 -0
- data/lib/sws/Core/components/Repetition/Repetition.api +10 -0
- data/lib/sws/Core/components/Repetition/Repetition.html +1 -0
- data/lib/sws/Core/components/Repetition/Repetition.rb +137 -0
- data/lib/sws/Core/components/Repetition/Repetition.sws +2 -0
- data/lib/sws/Core/components/ResetButton/ResetButton.api +5 -0
- data/lib/sws/Core/components/ResetButton/ResetButton.rb +28 -0
- data/lib/sws/Core/components/Select/Select.api +24 -0
- data/lib/sws/Core/components/Select/Select.rb +57 -0
- data/lib/sws/Core/components/String/String.api +5 -0
- data/lib/sws/Core/components/String/String.rb +28 -0
- data/lib/sws/Core/components/SubmitButton/SubmitButton.api +6 -0
- data/lib/sws/Core/components/SubmitButton/SubmitButton.rb +53 -0
- data/lib/sws/Core/components/TextArea/TextArea.api +9 -0
- data/lib/sws/Core/components/TextArea/TextArea.rb +28 -0
- data/lib/sws/Core/components/TextField/TextField.api +9 -0
- data/lib/sws/Core/components/TextField/TextField.rb +46 -0
- data/lib/sws/Core/framework.yaml +25 -0
- data/lib/sws/JSComponents/components/JSMenu/JSMenu.api +5 -0
- data/lib/sws/JSComponents/components/JSMenu/JSMenu.html +58 -0
- data/lib/sws/JSComponents/components/JSMenu/JSMenu.rb +34 -0
- data/lib/sws/JSComponents/components/JSMenu/JSMenu.sws +37 -0
- data/lib/sws/JSComponents/framework.yaml +3 -0
- data/lib/sws/adaptor.rb +334 -0
- data/lib/sws/application.rb +604 -0
- data/lib/sws/component.rb +656 -0
- data/lib/sws/cookie.rb +27 -0
- data/lib/sws/direct_action.rb +38 -0
- data/lib/sws/extensions.rb +49 -0
- data/lib/sws/parsers.rb +374 -0
- data/lib/sws/request.rb +308 -0
- data/lib/sws/response.rb +70 -0
- data/lib/sws/session.rb +195 -0
- data/lib/sws/slot.rb +198 -0
- metadata +263 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
Component = Struct.new( :name, :attributes )
|
2
|
+
Attribute = Struct.new( :name )
|
3
|
+
|
4
|
+
class RepetitionDemo < SWS::Component
|
5
|
+
|
6
|
+
attr_reader :components
|
7
|
+
attr_accessor :component_cursor, :attribute_cursor
|
8
|
+
|
9
|
+
def initialize ( *args )
|
10
|
+
|
11
|
+
super( *args )
|
12
|
+
@components = Array.new
|
13
|
+
@components << Component.new( "Repetition", [ Attribute.new( "list" ), Attribute.new( "item" )])
|
14
|
+
@components << Component.new( "TextField", [ Attribute.new( "value" ), Attribute.new( "name" )])
|
15
|
+
@components << Component.new( "String", [ Attribute.new( "value" ) ] )
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
component_repetition:
|
2
|
+
_class: SWS::Repetition
|
3
|
+
list: components
|
4
|
+
item: component_cursor
|
5
|
+
|
6
|
+
component_name_string:
|
7
|
+
_class: SWS::String
|
8
|
+
value: component_cursor.name
|
9
|
+
|
10
|
+
attribute_repetition:
|
11
|
+
_class: SWS::Repetition
|
12
|
+
list: component_cursor.attributes
|
13
|
+
item: attribute_cursor
|
14
|
+
|
15
|
+
attribute_name_textfield:
|
16
|
+
_class: SWS::TextField
|
17
|
+
value: attribute_cursor.name
|
18
|
+
|
19
|
+
page_wrapper:
|
20
|
+
_class: PageWrapper
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class StringDemo < SWS::Component
|
2
|
+
|
3
|
+
attr_reader :some_attribute
|
4
|
+
|
5
|
+
def initialize (*args)
|
6
|
+
|
7
|
+
super( *args )
|
8
|
+
@some_attribute = "This is a SWS::String created using component attribute"
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def some_method ()
|
13
|
+
return "This is a SWS::String created using return value of a method"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
page_wrapper:
|
2
|
+
_class: PageWrapper
|
3
|
+
|
4
|
+
literal_string:
|
5
|
+
_class: SWS::String
|
6
|
+
value: "'This is a SWS::String using literal string'"
|
7
|
+
|
8
|
+
attribute_string:
|
9
|
+
_class: SWS::String
|
10
|
+
value: some_attribute
|
11
|
+
|
12
|
+
method_string:
|
13
|
+
_class: SWS::String
|
14
|
+
value: some_method
|
@@ -0,0 +1,28 @@
|
|
1
|
+
components:
|
2
|
+
PageWrapper: PageWrapper
|
3
|
+
RepetitionDemo: RepetitionDemo
|
4
|
+
StringDemo: StringDemo
|
5
|
+
ConditionalDemo: ConditionalDemo
|
6
|
+
CheckBoxDemo: CheckBoxDemo
|
7
|
+
FormListsDemo: FormListsDemo
|
8
|
+
FileUploadDemo: FileUploadDemo
|
9
|
+
GenericDemo: GenericDemo
|
10
|
+
FormFieldsDemo: FormFieldsDemo
|
11
|
+
HyperlinkDemo: HyperlinkDemo
|
12
|
+
ImageLinkDemo: ImageLinkDemo
|
13
|
+
|
14
|
+
resources:
|
15
|
+
poweredby.jpg:
|
16
|
+
filename: poweredby.jpg
|
17
|
+
mime-type: image/jpg
|
18
|
+
style.css:
|
19
|
+
filename: style.css
|
20
|
+
mime-type: text/css
|
21
|
+
|
22
|
+
frameworks:
|
23
|
+
Core: SYSTEM/sws/Core
|
24
|
+
|
25
|
+
adaptor_class: SWS::Adaptor::Standalone
|
26
|
+
session_class: Session
|
27
|
+
default_component_class: StringDemo
|
28
|
+
default_encoding: iso-8859-2
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
.bold { font-weight: bold }
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Movie browsing</title>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<!-- Menu component -->
|
7
|
+
<span sws="menu">
|
8
|
+
<!-- Main table with movies displayed -->
|
9
|
+
<form sws="browse_form">
|
10
|
+
<table align="center" border="1">
|
11
|
+
<!-- header row with sorting links-->
|
12
|
+
<tr>
|
13
|
+
<th><a sws="link_sort_polish_title">Polish title</a></th>
|
14
|
+
<th><a sws="link_sort_english_title">English title</a></th>
|
15
|
+
<th><a sws="link_sort_cd_count">CD count</a></th>
|
16
|
+
<th><a sws="link_sort_description">Description</a></th>
|
17
|
+
<th>Rent movie</th>
|
18
|
+
<th>Actions</th>
|
19
|
+
</tr>
|
20
|
+
<!-- data row - wrapped in repetition, so it will be displayed multiple times -->
|
21
|
+
<span sws="movie_repetition">
|
22
|
+
<tr>
|
23
|
+
<td><span sws="cursor_polish_title"></span></td>
|
24
|
+
<td><span sws="cursor_english_title"></span></td>
|
25
|
+
<td><span sws="cursor_cd_count"></span></td>
|
26
|
+
<td><span sws="cursor_description"></span></td>
|
27
|
+
<td>
|
28
|
+
<span sws="conditional_rented">
|
29
|
+
<span sws="cursor_rental_state"></span>
|
30
|
+
</span>
|
31
|
+
<span sws="conditional_not_rented">
|
32
|
+
<select sws="select_rentee">
|
33
|
+
</span>
|
34
|
+
</td>
|
35
|
+
<td>
|
36
|
+
<span sws="conditional_rented2">
|
37
|
+
<input type="submit" sws="submit_return">
|
38
|
+
</span>
|
39
|
+
<span sws="conditional_not_rented2">
|
40
|
+
<input type="submit" sws="submit_rent">
|
41
|
+
</span>
|
42
|
+
<input type="submit" sws="submit_delete">
|
43
|
+
<input type="submit" sws="submit_edit">
|
44
|
+
</td>
|
45
|
+
</tr>
|
46
|
+
</span>
|
47
|
+
<tr><td colspan="6" align="center"><input type="submit" sws="submit_add"></td></tr>
|
48
|
+
</table>
|
49
|
+
|
50
|
+
</form>
|
51
|
+
|
52
|
+
|
53
|
+
<!-- edit table - displayed only if current_movie is set -->
|
54
|
+
<span sws="conditional_current">
|
55
|
+
<form sws="edit_form">
|
56
|
+
<table align="center" border="1">
|
57
|
+
|
58
|
+
<tr><th>Polish title</th><td><input type="text" sws="current_polish_title"></td></tr>
|
59
|
+
<tr><th>English title</th><td><input type="text" sws="current_english_title"></td></tr>
|
60
|
+
<tr><th>CD count</th><td><input type="text" sws="current_cd_count"></td></tr>
|
61
|
+
<tr><th>Description</th><td><span sws="current_description"></td></tr>
|
62
|
+
<tr><th></th><td><input type="submit" sws="submit_confirm"></td></tr>
|
63
|
+
</table>
|
64
|
+
</form>
|
65
|
+
</span>
|
66
|
+
|
67
|
+
</body>
|
68
|
+
</html>
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# This component is a page displaying movies matching selected criteria.
|
2
|
+
# You can also perform some basic operations on the movies - edit, delete, new and rent.
|
3
|
+
class MovieBrowse < SWS::Component
|
4
|
+
|
5
|
+
attr_accessor :movies, :movie_cursor, :users, :user_cursor, :selected_users, :current_movie
|
6
|
+
|
7
|
+
# Constructor for component. SWS::Component constructor takes several arguments, so
|
8
|
+
# you should always call super with *args.
|
9
|
+
def initialize (*args)
|
10
|
+
|
11
|
+
super( *args )
|
12
|
+
|
13
|
+
# Create new context for store (defined in application class)
|
14
|
+
@context = SDS::Context.new( app().store )
|
15
|
+
|
16
|
+
# Fetch all users and movies into the context
|
17
|
+
qualifier = "id_movie > 100 or cd_count > 2 or polish_title LIKE 'film%'"
|
18
|
+
orders = [ ["cd_count", :asc], ["id_movie", :desc] ]
|
19
|
+
@movies = @context.fetch( "Movie", qualifier, orders )
|
20
|
+
@users = @context.fetch( "User" )
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# append_to_response is the method that actually renders HTML page after
|
26
|
+
# receiving the request and calling the appropiate method. In this case
|
27
|
+
# we just nullify @selected_user (so that in the select_rentee combo box
|
28
|
+
# the selected user is always the first one). Note the super must be called -
|
29
|
+
# otherwise no HTML will be rendered!
|
30
|
+
def append_to_response (response)
|
31
|
+
|
32
|
+
@selected_users = nil
|
33
|
+
super
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
# Returns movie (completes the rental). Uses @movie_cursor - it is automatically
|
39
|
+
# set to the movie in the line where the user clicked the "Return" button. The method
|
40
|
+
# returns self, so the same component will serve the next request in this session.
|
41
|
+
def return_movie ()
|
42
|
+
|
43
|
+
puts "Returning movie #{@movie_cursor.english_title}"
|
44
|
+
rental = @movie_cursor.rentals.last
|
45
|
+
puts "Rental: #{rental.return_date}"
|
46
|
+
rental.return_date = Date.today()
|
47
|
+
puts "Rental: #{rental.return_date}"
|
48
|
+
@movie_cursor.rented = 0
|
49
|
+
@context.save()
|
50
|
+
return self
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# Rents a movie. Takes @selected_movie (the movie in the line where the "Rent" button
|
56
|
+
# was clicked and @selected_user (the user selected in combo box). Returns self, so the
|
57
|
+
# same component will serve the next request in this session.
|
58
|
+
def rent_movie ()
|
59
|
+
|
60
|
+
puts "Renting movie #{@movie_cursor.english_title} to user #{@selected_users[0].name}"
|
61
|
+
rental = Rental.create( @context )
|
62
|
+
rental.add_object_to_relationship( "movie", @movie_cursor )
|
63
|
+
rental.add_object_to_relationship( "user", @selected_users[0] )
|
64
|
+
rental.rental_date = Date.today()
|
65
|
+
@movie_cursor.rented = 1
|
66
|
+
@context.save()
|
67
|
+
return self
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Deletes a movie. Returns self (for known reasons :)
|
73
|
+
def delete_movie ()
|
74
|
+
|
75
|
+
puts( "Deleting movie #{@movie_cursor}\n\n\n" )
|
76
|
+
@context.delete( @movie_cursor )
|
77
|
+
@movies.delete( @movie_cursor )
|
78
|
+
@context.save()
|
79
|
+
return self
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# Schedules the movie for editing. Causes the HTML table with fields with attributes
|
85
|
+
# of this movie to appear near the bottom of the page.
|
86
|
+
def edit_movie ()
|
87
|
+
|
88
|
+
@current_movie = @movie_cursor
|
89
|
+
return self
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# Creates new movie. Note that this movie is not immediately saved.
|
95
|
+
def add_movie ()
|
96
|
+
|
97
|
+
@current_movie = Movie.create( @context )
|
98
|
+
@current_movie.rented = 0
|
99
|
+
return self
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
# Sorts the movies according to polish_title
|
105
|
+
def sort_by_polish_title ()
|
106
|
+
|
107
|
+
@movies.sort! { |movie1,movie2| movie1.polish_title <=> movie2.polish_title }
|
108
|
+
return self
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
# Sorts the movies according to english_title
|
114
|
+
def sort_by_english_title ()
|
115
|
+
|
116
|
+
@movies.sort! { |movie1,movie2| movie1.english_title <=> movie2.english_title }
|
117
|
+
return self
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
# Sorts the movies according to cd_count
|
123
|
+
def sort_by_cd_count ()
|
124
|
+
|
125
|
+
@movies.sort! { |movie1,movie2| movie1.cd_count <=> movie2.cd_count }
|
126
|
+
return self
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
# Sort the movies according to description
|
132
|
+
def sort_by_description ()
|
133
|
+
|
134
|
+
@movies.sort! { |movie1,movie2|
|
135
|
+
unless ( movie1.description && movie2.description )
|
136
|
+
-1
|
137
|
+
else
|
138
|
+
movie1.description <=> movie2.description
|
139
|
+
end
|
140
|
+
}
|
141
|
+
return self
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
# Returns true if any movie was selected for editing or adding. If not,
|
147
|
+
# the edit table won't be rendered
|
148
|
+
def has_current? ()
|
149
|
+
return @current_movie != nil
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
# Return cd count of current movie or 0 if current movie not present
|
154
|
+
def current_cd_count ()
|
155
|
+
return has_current? ? @current_movie.cd_count : 0;
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
def current_cd_count= ( cd_count )
|
160
|
+
@current_movie.cd_count = cd_count.to_i
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
# Confirm the changes and saves the current movie
|
165
|
+
def confirm_changes ()
|
166
|
+
|
167
|
+
puts "pol: #{current_movie.polish_title}"
|
168
|
+
puts "eng: #{current_movie.english_title}"
|
169
|
+
puts "CD: #{current_movie.cd_count}"
|
170
|
+
puts "Desc: #{current_movie.description}"
|
171
|
+
@context.save()
|
172
|
+
@movies = @context.fetch( "Movie" )
|
173
|
+
@current_movie = nil
|
174
|
+
return self
|
175
|
+
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
menu:
|
2
|
+
_class: Menu
|
3
|
+
|
4
|
+
browse_form:
|
5
|
+
_class: SWS::Form
|
6
|
+
enctype: "'multipart/form-data'"
|
7
|
+
|
8
|
+
link_sort_polish_title:
|
9
|
+
_class: SWS::Hyperlink
|
10
|
+
action: sort_by_polish_title
|
11
|
+
|
12
|
+
link_sort_english_title:
|
13
|
+
_class: SWS::Hyperlink
|
14
|
+
action: sort_by_english_title
|
15
|
+
|
16
|
+
link_sort_cd_count:
|
17
|
+
_class: SWS::Hyperlink
|
18
|
+
action: sort_by_cd_count
|
19
|
+
|
20
|
+
link_sort_description:
|
21
|
+
_class: SWS::Hyperlink
|
22
|
+
action: sort_by_description
|
23
|
+
|
24
|
+
movie_repetition:
|
25
|
+
_class: SWS::Repetition
|
26
|
+
list: movies
|
27
|
+
item: movie_cursor
|
28
|
+
|
29
|
+
cursor_polish_title:
|
30
|
+
_class: SWS::String
|
31
|
+
value: movie_cursor.polish_title
|
32
|
+
|
33
|
+
cursor_english_title:
|
34
|
+
_class: SWS::String
|
35
|
+
value: movie_cursor.english_title
|
36
|
+
|
37
|
+
cursor_cd_count:
|
38
|
+
_class: SWS::String
|
39
|
+
value: movie_cursor.cd_count
|
40
|
+
|
41
|
+
cursor_description:
|
42
|
+
_class: SWS::String
|
43
|
+
value: movie_cursor.description
|
44
|
+
|
45
|
+
conditional_rented:
|
46
|
+
_class: SWS::Conditional
|
47
|
+
condition: movie_cursor.rented?
|
48
|
+
|
49
|
+
conditional_not_rented:
|
50
|
+
_class: SWS::Conditional
|
51
|
+
condition: movie_cursor.rented?
|
52
|
+
negate: true
|
53
|
+
|
54
|
+
conditional_rented2:
|
55
|
+
_class: SWS::Conditional
|
56
|
+
condition: movie_cursor.rented?
|
57
|
+
|
58
|
+
conditional_not_rented2:
|
59
|
+
_class: SWS::Conditional
|
60
|
+
condition: movie_cursor.rented?
|
61
|
+
negate: true
|
62
|
+
|
63
|
+
cursor_rental_state:
|
64
|
+
_class: SWS::String
|
65
|
+
value: movie_cursor.rental_state
|
66
|
+
|
67
|
+
select_rentee:
|
68
|
+
_class: SWS::Select
|
69
|
+
list: users
|
70
|
+
item: user_cursor
|
71
|
+
display_string: user_cursor.name
|
72
|
+
multiple: false
|
73
|
+
size: 1
|
74
|
+
selections: selected_users
|
75
|
+
|
76
|
+
submit_return:
|
77
|
+
_class: SWS::SubmitButton
|
78
|
+
value: "'Return'"
|
79
|
+
action: return_movie
|
80
|
+
|
81
|
+
submit_rent:
|
82
|
+
_class: SWS::SubmitButton
|
83
|
+
value: "'Rent'"
|
84
|
+
action: rent_movie
|
85
|
+
|
86
|
+
submit_delete:
|
87
|
+
_class: SWS::SubmitButton
|
88
|
+
value: "'Delete'"
|
89
|
+
action: delete_movie
|
90
|
+
|
91
|
+
submit_edit:
|
92
|
+
_class: SWS::SubmitButton
|
93
|
+
value: "'Edit'"
|
94
|
+
action: edit_movie
|
95
|
+
|
96
|
+
submit_add:
|
97
|
+
_class: SWS::SubmitButton
|
98
|
+
value: "'New movie'"
|
99
|
+
action: add_movie
|
100
|
+
|
101
|
+
conditional_current:
|
102
|
+
_class: SWS::Conditional
|
103
|
+
condition: has_current?
|
104
|
+
|
105
|
+
edit_form:
|
106
|
+
_class: SWS::Form
|
107
|
+
|
108
|
+
current_polish_title:
|
109
|
+
_class: SWS::TextField
|
110
|
+
value: current_movie.polish_title
|
111
|
+
|
112
|
+
current_english_title:
|
113
|
+
_class: SWS::TextField
|
114
|
+
value: current_movie.english_title
|
115
|
+
|
116
|
+
current_cd_count:
|
117
|
+
_class: SWS::TextField
|
118
|
+
value: current_cd_count
|
119
|
+
|
120
|
+
current_description:
|
121
|
+
_class: SWS::TextArea
|
122
|
+
value: current_movie.description
|
123
|
+
|
124
|
+
submit_confirm:
|
125
|
+
_class: SWS::SubmitButton
|
126
|
+
value: "'Save'"
|
127
|
+
action: confirm_changes
|