yhara-ticketmap 0.3.1

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.
Files changed (47) hide show
  1. data/.gitignore +2 -0
  2. data/.gitmodules +3 -0
  3. data/MANIFEST +29 -0
  4. data/README.rdoc +20 -0
  5. data/Rakefile +52 -0
  6. data/TODO +82 -0
  7. data/VERSION +1 -0
  8. data/controller/config.rb +9 -0
  9. data/controller/init.rb +7 -0
  10. data/controller/main.rb +11 -0
  11. data/controller/tickets.rb +49 -0
  12. data/db/migrate/001_create_tickets.rb +14 -0
  13. data/db/migrate/002_add_deleted_to_tickets.rb +13 -0
  14. data/db/migrate/003_add_timeouted_to_tickets.rb +13 -0
  15. data/main.rb +40 -0
  16. data/model/init.rb +32 -0
  17. data/model/ticket.rb +49 -0
  18. data/public/biwascheme/lib/biwascheme.js +106 -0
  19. data/public/biwascheme/lib/dumper.js +192 -0
  20. data/public/biwascheme/lib/extra_lib.js +534 -0
  21. data/public/biwascheme/lib/io.js +326 -0
  22. data/public/biwascheme/lib/prototype.js +4320 -0
  23. data/public/biwascheme/lib/r6rs_lib.js +2439 -0
  24. data/public/biwascheme/lib/stackbase.js +1697 -0
  25. data/public/biwascheme/lib/webscheme_lib.js +809 -0
  26. data/public/js/builder.js +136 -0
  27. data/public/js/controls.js +965 -0
  28. data/public/js/dragdrop.js +975 -0
  29. data/public/js/effects.js +1130 -0
  30. data/public/js/scriptaculous.js +60 -0
  31. data/public/js/slider.js +275 -0
  32. data/public/js/sound.js +55 -0
  33. data/public/js/unittest.js +568 -0
  34. data/public/scm/board.scm +23 -0
  35. data/public/scm/hand.scm +48 -0
  36. data/public/scm/main.scm +69 -0
  37. data/public/scm/server.scm +30 -0
  38. data/public/scm/ticket.scm +44 -0
  39. data/spec/config.rb +13 -0
  40. data/spec/helper.rb +2 -0
  41. data/spec/main.rb +13 -0
  42. data/spec/models.rb +34 -0
  43. data/spec/tickets.rb +65 -0
  44. data/ticketmap.gemspec +96 -0
  45. data/view/index.xhtml +63 -0
  46. data/view/track.xhtml +29 -0
  47. metadata +131 -0
@@ -0,0 +1,23 @@
1
+ ;; NOTE: this is not used now (maybe will be needed for shaking?)
2
+ (define *tickets* (make-eq-hashtable))
3
+
4
+ (define (tickets-add! ticket)
5
+ (hashtable-set! *tickets* (ticket 'id) ticket))
6
+
7
+ (define (tickets-get id)
8
+ (hashtable-get *tickets* id))
9
+
10
+ (define (board-on-origin-clicked)
11
+ (let* ((result (server-ticket-create!))
12
+ (ticket (make-ticket (cdr result) "" 0 0)))
13
+ (board-insert-ticket! ticket)
14
+ (hand-show-ticket ticket)
15
+ (hand-on-title-clicked)))
16
+
17
+ (define (board-insert-ticket! ticket)
18
+ (tickets-add! ticket)
19
+ (let1 div (ticket 'div)
20
+ (set-position! div (+ (/ *width* 2) (ticket 'x))
21
+ (+ (/ *height* 2) (ticket 'y)))
22
+ (element-insert! ($ "field") div)))
23
+
@@ -0,0 +1,48 @@
1
+ (define *hand-ticket* #f)
2
+
3
+ (define (hand-show-ticket ticket)
4
+ (when (not (eq? ticket *hand-ticket*))
5
+ (set! *hand-ticket* ticket)
6
+ (set-content! ($ "hand_title") (ticket 'title))
7
+ (element-hide! ($ "hand_title_submit"))
8
+ (set-content! ($ "hand_desc")
9
+ (string-append "("
10
+ (get-style (ticket 'div) "left")
11
+ ","
12
+ (get-style (ticket 'div) "top")
13
+ ")"))))
14
+
15
+ (define-macro (with-button-toggle button . body)
16
+ `(unless (element-visible? ,button)
17
+ (element-show! ,button)
18
+ ,@body
19
+ (element-hide! ,button)))
20
+
21
+ (define (hand-on-title-clicked)
22
+ (define (make-rename-form old)
23
+ (string-append "<input type='text' value='" old "' id='rename_text'>"))
24
+
25
+ (let1 ok-button ($ "hand_title_submit")
26
+ (with-button-toggle ok-button
27
+ (element-update! ($ "hand_title")
28
+ (make-rename-form (get-content ($ "hand_title"))))
29
+ (js-invoke ($ "rename_text") "focus")
30
+
31
+ (wait-for ok-button "click")
32
+
33
+ (let1 new-title (get-content ($ "rename_text"))
34
+ (*hand-ticket* 'title= new-title)
35
+ (element-update! ($ "hand_title") new-title)
36
+ (element-update! (*hand-ticket* 'div) new-title)
37
+ (server-ticket-rename! *hand-ticket* new-title)))))
38
+
39
+ (define (hand-on-delete-clicked)
40
+ (when *hand-ticket*
41
+ (when (confirm (string-append "really delete '"
42
+ (*hand-ticket* 'title)
43
+ "' ?"))
44
+ (server-ticket-delete! *hand-ticket*)
45
+ (element-remove! (*hand-ticket* 'div))
46
+ (set! *hand-ticket* #f)
47
+ (element-clear! ($ "hand_title"))
48
+ (element-clear! ($ "hand_desc")))))
@@ -0,0 +1,69 @@
1
+ ;;;
2
+ ;;; main.scm
3
+ ;;;
4
+
5
+ ;; load
6
+ (for-each (lambda (pair)
7
+ (js-load (string-append "js/" (car pair) ".js")
8
+ (cdr pair)))
9
+ '(("scriptaculous" . "Scriptaculous")
10
+ ("builder" . "Builder")
11
+ ("effects" . "Effect")
12
+ ("dragdrop" . "Draggable")
13
+ ("controls" . "Autocompleter")
14
+ ("slider" . "Control")
15
+ ("sound" . "Sound")))
16
+
17
+ (load "scm/ticket.scm")
18
+ (load "scm/board.scm")
19
+ (load "scm/hand.scm")
20
+ (load "scm/server.scm")
21
+
22
+ ;; consts
23
+
24
+ (define (px n)
25
+ (string-append (number->string n) "px"))
26
+
27
+ (define (set-position! elem x y)
28
+ (set-style! elem "position" "absolute")
29
+ (set-style! elem "left" (px x))
30
+ (set-style! elem "top" (px y)))
31
+
32
+ (define (get-position elem)
33
+ (define (remove-px str)
34
+ (string->number (car (regexp-exec "(\\d+)" str))))
35
+ (values (remove-px (get-style elem "left"))
36
+ (remove-px (get-style elem "top"))))
37
+
38
+ (define *width* #f)
39
+ (define *height* #f)
40
+
41
+ ;; util
42
+ (define show-error print)
43
+
44
+ ;; initialize
45
+ (let1 result (read-from-string (http-request "config/board_size"))
46
+ (if (eq? (car result) 'xy)
47
+ (begin
48
+ (set! *width* (cadr result))
49
+ (set! *height* (cddr result)))
50
+ (show-error "error: failed to load board size")))
51
+
52
+ (set-style! ($ "field") "width" (px *width*))
53
+ (set-style! ($ "field") "height" (px *height*))
54
+ (set-position! ($ "top") (/ *width* 2) 0)
55
+ (set-position! ($ "bottom") (/ *width* 2) *height*)
56
+ (set-position! ($ "right") *width* (/ *height* 2))
57
+ (set-position! ($ "left") 0 (/ *height* 2))
58
+ (set-position! ($ "origin") (/ *width* 2) (/ *height* 2))
59
+
60
+ (add-handler! ($ "origin") "click" board-on-origin-clicked)
61
+
62
+ (add-handler! ($ "hand_title") "click" hand-on-title-clicked)
63
+ (add-handler! ($ "hand_delete") "click" hand-on-delete-clicked)
64
+
65
+ (for-each (lambda (vals)
66
+ (board-insert-ticket! (apply make-ticket vals)))
67
+ (server-ticket-list))
68
+
69
+ (display "ok")
@@ -0,0 +1,30 @@
1
+ (define (server-request url . params)
2
+ (define (params->alist list)
3
+ (cond
4
+ ((null? list) '())
5
+ ((null? (cdr list)) (show-error "must not happen"))
6
+ (else (cons (cons (symbol->string (car list)) (cadr list))
7
+ (params->alist (cddr list))))))
8
+ (define (http url params)
9
+ (if (null? params)
10
+ (http-request url)
11
+ (http-post url (params->alist params))))
12
+ (let1 result (read-from-string (http url params))
13
+ (if (eq? #t (car result))
14
+ (cdr result)
15
+ (show-error "error: got wrong response from " url))))
16
+
17
+ (define (server-ticket-list)
18
+ (server-request "tickets/list"))
19
+
20
+ (define (server-ticket-create!)
21
+ (server-request "tickets/create"))
22
+
23
+ (define (server-ticket-move! ticket x y)
24
+ (server-request "tickets/move/" 'id (ticket 'id) 'x x 'y y))
25
+
26
+ (define (server-ticket-rename! ticket new-title)
27
+ (server-request "tickets/rename" 'id (ticket 'id) 'title new-title))
28
+
29
+ (define (server-ticket-delete! ticket)
30
+ (server-request "tickets/delete" 'id (ticket 'id)))
@@ -0,0 +1,44 @@
1
+ (define (make-ticket id title x y)
2
+ (define (check-title title)
3
+ (if (string=? title "") "(no title)" title))
4
+
5
+ (let* ((self #f)
6
+ (id id)
7
+ (title (check-title title))
8
+ (x x)
9
+ (y y)
10
+ (div (element-new `("div.ticket" ,title))))
11
+
12
+ (add-handler! div "click"
13
+ (lambda (ev) ((self 'on-click))))
14
+ (js-new "Draggable" div
15
+ 'onEnd (lambda (drg) ((self 'on-drag-end))))
16
+
17
+ (set! self
18
+ (lambda (method . args)
19
+ (case method
20
+ ; properties
21
+ ((id) id)
22
+ ((title) title)
23
+ ((title=) (set! title (check-title (car args))))
24
+ ((x) x)
25
+ ((y) y)
26
+ ((div) div)
27
+
28
+ ; methods
29
+ ((on-click)
30
+ (lambda ()
31
+ (hand-show-ticket self)))
32
+
33
+ ((on-drag-end)
34
+ (lambda ()
35
+ (call-with-values
36
+ (lambda () (get-position div))
37
+ (lambda (newx newy)
38
+ (server-ticket-move! self
39
+ (- newx (/ *width* 2))
40
+ (- newy (/ *height* 2)))))))
41
+ ; method_missing
42
+ (else
43
+ (show-error "unknown method:" method)))))
44
+ self))
data/spec/config.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'spec/helper.rb'
2
+ load 'bin/tickets-server'
3
+
4
+ describe ConfigController do
5
+ behaves_like :rack_test
6
+
7
+ # board_size
8
+
9
+ it 'returns board size' do
10
+ get('/config/board_size').status.should == 200
11
+ last_response.should =~ /\(xy . \(\d+ . \d+\)\)/
12
+ end
13
+ end
data/spec/helper.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'ramaze/spec/bacon'
2
+ ARGV.concat ["--db", __DIR__("../db/test.db")]
data/spec/main.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'spec/helper.rb'
2
+ load 'bin/tickets-server'
3
+
4
+ describe MainController do
5
+ behaves_like :rack_test
6
+
7
+ # index
8
+
9
+ it 'shows start page' do
10
+ get('/').status.should == 200
11
+ last_response.should =~ /biwascheme\.js/
12
+ end
13
+ end
data/spec/models.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'spec/helper.rb'
2
+ load 'bin/tickets-server'
3
+
4
+ describe Ticket do
5
+ before do
6
+ Ticket.all.destroy!
7
+ end
8
+
9
+ # instantiation
10
+
11
+ it 'fills blank attributes' do
12
+ t = Ticket.create
13
+ t.importance.should.not == nil
14
+ t.emergency.should.not == nil
15
+ t.title.should.not == nil
16
+ t.deleted.should == false
17
+ t.timeouted.should == false
18
+ end
19
+
20
+ # shaking
21
+
22
+ it 'detects when to shake' do
23
+ TicketMap.options[:shake_interval] = 0
24
+ Ticket.needs_shaking?.should == true
25
+ end
26
+
27
+ it 'should move tickets' do
28
+ Ticket.create(:emergency => 0, :importance => -10, :title => "test1")
29
+ Ticket.create(:emergency => 0, :importance => 10, :title => "test2")
30
+ Ticket.shake!
31
+ Ticket.first(:title => "test1").emergency.should > 0
32
+ Ticket.first(:title => "test2").emergency.should < 0
33
+ end
34
+ end
data/spec/tickets.rb ADDED
@@ -0,0 +1,65 @@
1
+ require 'spec/helper.rb'
2
+ load 'bin/tickets-server'
3
+
4
+ describe TicketsController do
5
+ behaves_like :rack_test
6
+
7
+ before do
8
+ Ticket.all.destroy!
9
+ end
10
+
11
+ # create
12
+
13
+ it 'creates new ticket' do
14
+ lambda{
15
+ get('/tickets/create').should =~ /\A\(#t . \(id . (\d+)\)\)\z/
16
+ }.should.change{ Ticket.count }
17
+ end
18
+
19
+ # list
20
+
21
+ it 'enumerates created tickets' do
22
+ Ticket.create(:title => "test1")
23
+ Ticket.create(:title => "test2")
24
+
25
+ get('/tickets/list')
26
+
27
+ last_response.should =~ /test1/
28
+ last_response.should =~ /test2/
29
+ end
30
+
31
+ # list
32
+
33
+ it 'moves a ticket' do
34
+ id = get('/tickets/create').match(/\A\(#t . \(id . (\d+)\)\)\z/)[1]
35
+
36
+ post('/tickets/move', :id => id, :x => 10, :y => -10)
37
+ last_response.body.should == "(#t)"
38
+
39
+ Ticket.first.emergency.should == 10
40
+ Ticket.first.importance.should == -10
41
+ end
42
+
43
+ # rename
44
+
45
+ it 'renames a ticket' do
46
+ id = get('/tickets/create').match(/\A\(#t . \(id . (\d+)\)\)\z/)[1]
47
+
48
+ post('/tickets/rename', :id => id, :title => "test1")
49
+ last_response.body.should == "(#t)"
50
+
51
+ Ticket.first.title.should == "test1"
52
+ end
53
+
54
+ # delete
55
+
56
+ it 'deletes a ticket' do
57
+ id = get('/tickets/create').match(/\A\(#t . \(id . (\d+)\)\)\z/)[1]
58
+
59
+ post('/tickets/delete', :id => id)
60
+ last_response.body.should == "(#t)"
61
+
62
+ Ticket.first.deleted.should == true
63
+ end
64
+
65
+ end
data/ticketmap.gemspec ADDED
@@ -0,0 +1,96 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = %q{ticketmap}
6
+ s.version = "0.3.1"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+ s.authors = ["Yutaka HARA"]
10
+ s.date = %q{2009-07-18}
11
+ s.description = %q{Two-dimentional ToDo manager}
12
+ s.email = %q{yutaka.hara/at/gmail.com}
13
+ s.extra_rdoc_files = [
14
+ "README.rdoc"
15
+ ]
16
+ s.files = [
17
+ ".gitignore",
18
+ ".gitmodules",
19
+ "MANIFEST",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "TODO",
23
+ "VERSION",
24
+ "controller/config.rb",
25
+ "controller/init.rb",
26
+ "controller/main.rb",
27
+ "controller/tickets.rb",
28
+ "db/migrate/001_create_tickets.rb",
29
+ "db/migrate/002_add_deleted_to_tickets.rb",
30
+ "db/migrate/003_add_timeouted_to_tickets.rb",
31
+ "main.rb",
32
+ "model/init.rb",
33
+ "model/ticket.rb",
34
+ "public/biwascheme/lib/biwascheme.js",
35
+ "public/biwascheme/lib/dumper.js",
36
+ "public/biwascheme/lib/extra_lib.js",
37
+ "public/biwascheme/lib/io.js",
38
+ "public/biwascheme/lib/prototype.js",
39
+ "public/biwascheme/lib/r6rs_lib.js",
40
+ "public/biwascheme/lib/stackbase.js",
41
+ "public/biwascheme/lib/webscheme_lib.js",
42
+ "public/js/builder.js",
43
+ "public/js/controls.js",
44
+ "public/js/dragdrop.js",
45
+ "public/js/effects.js",
46
+ "public/js/scriptaculous.js",
47
+ "public/js/slider.js",
48
+ "public/js/sound.js",
49
+ "public/js/unittest.js",
50
+ "public/scm/board.scm",
51
+ "public/scm/hand.scm",
52
+ "public/scm/main.scm",
53
+ "public/scm/server.scm",
54
+ "public/scm/ticket.scm",
55
+ "spec/config.rb",
56
+ "spec/helper.rb",
57
+ "spec/main.rb",
58
+ "spec/models.rb",
59
+ "spec/tickets.rb",
60
+ "ticketmap.gemspec",
61
+ "view/index.xhtml",
62
+ "view/track.xhtml"
63
+ ]
64
+ s.has_rdoc = true
65
+ s.homepage = %q{http://github.com/yhara/ticketmap}
66
+ s.rdoc_options = ["--charset=UTF-8"]
67
+ s.require_paths = ["lib"]
68
+ s.rubygems_version = %q{1.3.2}
69
+ s.summary = %q{Two-dimentional ToDo manager}
70
+ s.test_files = [
71
+ "spec/config.rb",
72
+ "spec/helper.rb",
73
+ "spec/main.rb",
74
+ "spec/models.rb",
75
+ "spec/tickets.rb"
76
+ ]
77
+
78
+ if s.respond_to? :specification_version then
79
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
80
+ s.specification_version = 3
81
+
82
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
83
+ s.add_runtime_dependency(%q<ramaze>, ["= 2009.06.12"])
84
+ s.add_runtime_dependency(%q<dm-core>, [">= 0"])
85
+ s.add_runtime_dependency(%q<do_sqlite3>, [">= 0"])
86
+ else
87
+ s.add_dependency(%q<ramaze>, ["= 2009.06.12"])
88
+ s.add_dependency(%q<dm-core>, [">= 0"])
89
+ s.add_dependency(%q<do_sqlite3>, [">= 0"])
90
+ end
91
+ else
92
+ s.add_dependency(%q<ramaze>, ["= 2009.06.12"])
93
+ s.add_dependency(%q<dm-core>, [">= 0"])
94
+ s.add_dependency(%q<do_sqlite3>, [">= 0"])
95
+ end
96
+ end