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.
- data/.gitignore +2 -0
- data/.gitmodules +3 -0
- data/MANIFEST +29 -0
- data/README.rdoc +20 -0
- data/Rakefile +52 -0
- data/TODO +82 -0
- data/VERSION +1 -0
- data/controller/config.rb +9 -0
- data/controller/init.rb +7 -0
- data/controller/main.rb +11 -0
- data/controller/tickets.rb +49 -0
- data/db/migrate/001_create_tickets.rb +14 -0
- data/db/migrate/002_add_deleted_to_tickets.rb +13 -0
- data/db/migrate/003_add_timeouted_to_tickets.rb +13 -0
- data/main.rb +40 -0
- data/model/init.rb +32 -0
- data/model/ticket.rb +49 -0
- data/public/biwascheme/lib/biwascheme.js +106 -0
- data/public/biwascheme/lib/dumper.js +192 -0
- data/public/biwascheme/lib/extra_lib.js +534 -0
- data/public/biwascheme/lib/io.js +326 -0
- data/public/biwascheme/lib/prototype.js +4320 -0
- data/public/biwascheme/lib/r6rs_lib.js +2439 -0
- data/public/biwascheme/lib/stackbase.js +1697 -0
- data/public/biwascheme/lib/webscheme_lib.js +809 -0
- data/public/js/builder.js +136 -0
- data/public/js/controls.js +965 -0
- data/public/js/dragdrop.js +975 -0
- data/public/js/effects.js +1130 -0
- data/public/js/scriptaculous.js +60 -0
- data/public/js/slider.js +275 -0
- data/public/js/sound.js +55 -0
- data/public/js/unittest.js +568 -0
- data/public/scm/board.scm +23 -0
- data/public/scm/hand.scm +48 -0
- data/public/scm/main.scm +69 -0
- data/public/scm/server.scm +30 -0
- data/public/scm/ticket.scm +44 -0
- data/spec/config.rb +13 -0
- data/spec/helper.rb +2 -0
- data/spec/main.rb +13 -0
- data/spec/models.rb +34 -0
- data/spec/tickets.rb +65 -0
- data/ticketmap.gemspec +96 -0
- data/view/index.xhtml +63 -0
- data/view/track.xhtml +29 -0
- 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
|
+
|
data/public/scm/hand.scm
ADDED
@@ -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")))))
|
data/public/scm/main.scm
ADDED
@@ -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
data/spec/main.rb
ADDED
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
|