/[Frey]/trunk/lib/Frey/DBIC/Designer.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/lib/Frey/DBIC/Designer.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1026 - (show annotations)
Wed Jan 28 19:54:40 2009 UTC (15 years, 3 months ago) by dpavlin
File size: 3389 byte(s)
added Table Drag and Drop JQuery plugin

http://www.isocra.com/2008/02/table-drag-and-drop-jquery-plugin/
1 package Frey::DBIC::Designer;
2 use Moose;
3
4 extends 'Frey';
5 with 'Frey::Web';
6 with 'Frey::Config';
7 with 'Frey::Storage';
8 with 'Frey::jQuery';
9
10 has dbic_class => (
11 is => 'rw',
12 isa => 'Str',
13 required => 1,
14 default => 'Reblog::Schema',
15 );
16
17 has dsn => (
18 is => 'rw',
19 isa => 'Str',
20 required => 1,
21 default => 'DBI:mysql:database=reblog;host=127.0.0.1;port=13306',
22 );
23
24 has result_set => (
25 is => 'rw',
26 isa => 'Str',
27 required => 1,
28 default => 'Items',
29 );
30
31 has order_by => (
32 is => 'rw',
33 isa => 'Str',
34 required => 1,
35 default => 'insert_timestamp desc',
36 );
37
38 has page => (
39 is => 'rw',
40 isa => 'Int',
41 required => 1,
42 default => 1,
43 );
44
45 has remove_column => (
46 is => 'rw',
47 isa => 'Str',
48 );
49
50 sub as_markup {
51 my ($self) = @_;
52
53 my $dbic_class = $self->dbic_class;
54 my $dsn = $self->dsn;
55 my $schema;
56
57 my $code = qq{
58 use $dbic_class ;
59 \$schema = $dbic_class->connect("$dsn", '', '');
60 };
61
62 eval $code;
63 die $@ if $@;
64
65 $schema->storage->debug(1); # XXX dump storage generated SQL
66
67 my $attrs;
68
69 $attrs->{ $_ } = $self->$_ foreach ( grep { $self->$_ } ( qw/page order_by/ ) );
70 warn "# attrs ", $self->dump( $attrs );
71
72 my $rs = $schema->resultset( $self->result_set )
73 ->published
74 ->search( undef, $attrs )
75 ;
76
77 my $path = 'var/DBIC/' . $self->result_set . '.yaml';
78 my @columns;
79 {
80 my $c = $self->load( $path );
81 @columns = @$c if $c;
82 }
83 warn "# load $path columns ", $self->dump( @columns );
84 my @all_columns = $rs->first->columns;
85 @columns = @all_columns unless @columns;
86
87 @columns = grep { $_ ne $self->remove_column } @columns if $self->remove_column;
88
89 warn "# columns ", $self->dump( @columns );
90 $self->store( $path, [ @columns ] );
91
92 my $rows;
93
94 while ( my $feed = $rs->next ) {
95 # my %row = $feed->get_columns;
96
97 my $row;
98
99 foreach my $name ( @columns ) {
100 my $v = $feed->$name;
101 $v = '<code>NULL</code>' if ! defined $v;
102 $row .= qq|<td title="$name">$v</td>|;
103 }
104
105 $rows .= qq|<tr>$row</tr>\n|;
106 }
107
108 $self->add_css(qq|
109 #column-editor {
110 border: 1px solid #888;
111 background: #ffc;
112 position: absolute;
113 top: 1em;
114 right: 1em;
115 }
116 |);
117
118 my @hidden_cols;
119 {
120 my $col;
121 $col->{$_}++ foreach @columns;
122 @hidden_cols = grep { ! $col->{$_} } @all_columns;
123 }
124
125 my $column_editor = qq|
126 <table id="column-editor">
127 <tr class="nodrag nodrop"><th>Visible</th></tr>
128 | . join("\n", map { qq|
129 <tr id="$_"><td>$_</td></tr>
130 | } @columns )
131 . qq|
132 <tr class="nodrag nodrop"><th>Hidden</th></tr>
133 | . join("\n", map { qq|
134 <tr id="$_"><td>$_</td></tr>
135 | } @hidden_cols )
136 . qq|
137 </table>
138 |
139 ;
140
141 $self->add_js( 'static/Frey/jQuery/jquery.tablednd_0_5.js' );
142 $self->add_js(q|
143 $(document).ready(function() {
144 // Initialise the table
145 $("#column-editor").tableDnD();
146 });
147 |);
148
149 my $total = $rs->pager->total_entries;
150
151 sub form {
152 my $column = shift || die;
153 qq|
154 <form>
155 <input type="submit" value="-">
156 <input type="hidden" name="remove_column" value="$column">
157 </form>
158 |
159 }
160
161 my $header = qq|<tr><th>| . join(qq|</th><th>|, map { $_ . form($_) } @columns) . qq|</th></tr>|;
162
163 my $html = qq|
164 Rows: <b>$total</b>
165 $column_editor
166 <table>
167 $header
168 $rows
169 </table>
170 |;
171
172 return $html;
173 }
174
175 =head1 SEE ALSO
176
177 DBIx::Master Class
178
179 L<http://www.shadowcat.co.uk/catalyst/-talks/yapc-na-2008/dbix-masterclass.xul> presentation
180
181 L<http://www.shadowcat.co.uk/archive/conference-video/yapc-eu-2008/dbic-masterclass/> video
182
183 =cut
184
185 1;

  ViewVC Help
Powered by ViewVC 1.1.26