| blib/lib/Bigtop/Keywords.pm | |||
|---|---|---|---|
| Criterion | Covered | Total | % |
| statement | 13 | 14 | 92.8 |
| branch | n/a | ||
| condition | n/a | ||
| subroutine | 3 | 4 | 75.0 |
| pod | 2 | 2 | 100.0 |
| total | 18 | 20 | 90.0 |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package Bigtop::Keywords; | ||||||
| 2 | 41 | 41 | 245 | use strict; use warnings; | |||
| 41 | 41 | 69 | |||||
| 41 | 1784 | ||||||
| 41 | 213 | ||||||
| 41 | 78 | ||||||
| 41 | 120149 | ||||||
| 3 | |||||||
| 4 | my %doc_for = ( | ||||||
| 5 | config => { | ||||||
| 6 | base_dir => { | ||||||
| 7 | keyword => 'base_dir', | ||||||
| 8 | label => 'Parent Dir', | ||||||
| 9 | descr => 'parent of build dir', | ||||||
| 10 | type => 'deprecated', | ||||||
| 11 | sort_order => 20000, | ||||||
| 12 | }, | ||||||
| 13 | app_dir => { | ||||||
| 14 | keyword => 'app_dir', | ||||||
| 15 | label => 'Build Dir', | ||||||
| 16 | descr => 'build dir. relative to parent dir', | ||||||
| 17 | type => 'deprecated', | ||||||
| 18 | sort_order => 20001, | ||||||
| 19 | }, | ||||||
| 20 | engine => { | ||||||
| 21 | keyword => 'engine', | ||||||
| 22 | label => 'Engine', | ||||||
| 23 | descr => 'mod_perl 1.3, mod_perl 2.0, CGI, etc.', | ||||||
| 24 | type => 'select', | ||||||
| 25 | options => [ | ||||||
| 26 | { label => 'mod_perl 1.3', value => 'MP13' }, | ||||||
| 27 | { label => 'mod_perl 2.0', value => 'MP20' }, | ||||||
| 28 | { label => 'CGI/FastCGI', value => 'CGI' }, | ||||||
| 29 | ], | ||||||
| 30 | sort_order => 10, | ||||||
| 31 | }, | ||||||
| 32 | template_engine => { | ||||||
| 33 | keyword => 'template_engine', | ||||||
| 34 | label => 'Template Engine', | ||||||
| 35 | descr => 'Template Toolkit, Mason, etc.', | ||||||
| 36 | type => 'select', | ||||||
| 37 | options => [ | ||||||
| 38 | { label => 'Template Toolkit', value => 'TT' }, | ||||||
| 39 | { label => 'No Templating', value => 'Default' }, | ||||||
| 40 | ], | ||||||
| 41 | sort_order => 20, | ||||||
| 42 | }, | ||||||
| 43 | plugins => { | ||||||
| 44 | keyword => 'plugins', | ||||||
| 45 | label => 'Plugins', | ||||||
| 46 | descr => 'List of Plugins i.e. AuthCookie Static', | ||||||
| 47 | type => 'text', | ||||||
| 48 | sort_order => 30, | ||||||
| 49 | }, | ||||||
| 50 | }, | ||||||
| 51 | |||||||
| 52 | app => { | ||||||
| 53 | no_gen => { | ||||||
| 54 | keyword => 'no_gen', | ||||||
| 55 | label => 'No Gen', | ||||||
| 56 | descr => "Skip this app completely", | ||||||
| 57 | type => 'boolean', | ||||||
| 58 | urgency => 0, | ||||||
| 59 | sort_order => 10, | ||||||
| 60 | }, | ||||||
| 61 | location => { | ||||||
| 62 | keyword => 'location', | ||||||
| 63 | label => 'Base Location', | ||||||
| 64 | descr => 'Base Location of the app [defaults to /]' | ||||||
| 65 | . ' Do not use if you have a Base Controller.', |
||||||
| 66 | type => 'text', | ||||||
| 67 | multiple => 0, | ||||||
| 68 | urgency => 0, | ||||||
| 69 | sort_order => 20, | ||||||
| 70 | }, | ||||||
| 71 | authors => { | ||||||
| 72 | keyword => 'authors', | ||||||
| 73 | label => 'Authors', | ||||||
| 74 | descr => 'Who to blame for the app', | ||||||
| 75 | type => 'pair', | ||||||
| 76 | multiple => 1, | ||||||
| 77 | urgency => 1, | ||||||
| 78 | pair_labels => [ 'Name', 'Email Address' ], | ||||||
| 79 | pair_required => 0, | ||||||
| 80 | sort_order => 30, | ||||||
| 81 | }, | ||||||
| 82 | |||||||
| 83 | contact_us => { | ||||||
| 84 | keyword => 'contact_us', | ||||||
| 85 | label => 'Contact Us', | ||||||
| 86 | descr => 'How to send complaints or join the project', | ||||||
| 87 | type => 'textarea', | ||||||
| 88 | multiple => 0, | ||||||
| 89 | urgency => 0, | ||||||
| 90 | sort_order => 40, | ||||||
| 91 | }, | ||||||
| 92 | email => { | ||||||
| 93 | keyword => 'email', | ||||||
| 94 | label => 'Extra Email', | ||||||
| 95 | descr => 'Where to send complaints (think mailing list)', | ||||||
| 96 | multiple => 0, | ||||||
| 97 | urgency => 0, | ||||||
| 98 | type => 'deprecated', | ||||||
| 99 | sort_order => 20001, | ||||||
| 100 | }, | ||||||
| 101 | copyright_holder => { | ||||||
| 102 | keyword => 'copyright_holder', | ||||||
| 103 | label => 'Copyright Holder', | ||||||
| 104 | descr => 'Who owns the app [defaults to 1st author]', | ||||||
| 105 | type => 'text', | ||||||
| 106 | multiple => 1, | ||||||
| 107 | urgency => 0, | ||||||
| 108 | sort_order => 50, | ||||||
| 109 | }, | ||||||
| 110 | license_text => { | ||||||
| 111 | keyword => 'license_text', | ||||||
| 112 | label => 'License Text', | ||||||
| 113 | descr => 'Restrictions [defaults to Perl license]', | ||||||
| 114 | type => 'textarea', | ||||||
| 115 | urgency => 0, | ||||||
| 116 | sort_order => 60, | ||||||
| 117 | }, | ||||||
| 118 | uses => { | ||||||
| 119 | keyword => 'uses', | ||||||
| 120 | label => 'Modules Used', | ||||||
| 121 | descr => 'List of modules used by base module' | ||||||
| 122 | . ' Do not use if you have a Base Controller.', |
||||||
| 123 | type => 'text', | ||||||
| 124 | multiple => 1, | ||||||
| 125 | urgency => 0, | ||||||
| 126 | sort_order => 70, | ||||||
| 127 | }, | ||||||
| 128 | label => { | ||||||
| 129 | keyword => 'label', | ||||||
| 130 | label => 'Label', | ||||||
| 131 | descr => 'Documentation label for app', | ||||||
| 132 | type => 'text', | ||||||
| 133 | multiple => 0, | ||||||
| 134 | urgency => 0, | ||||||
| 135 | quick_label => 'Label', | ||||||
| 136 | sort_order => 80, | ||||||
| 137 | }, | ||||||
| 138 | }, | ||||||
| 139 | |||||||
| 140 | app_literal => { | ||||||
| 141 | Conf => { | ||||||
| 142 | keyword => 'Conf', | ||||||
| 143 | label => 'Global Level', | ||||||
| 144 | descr => 'top level of Gantry::Conf file', | ||||||
| 145 | sort_order => 10, | ||||||
| 146 | }, | ||||||
| 147 | # GantryLocation => { | ||||||
| 148 | # keyword => 'GantryLocation', | ||||||
| 149 | # label => 'Root level config', | ||||||
| 150 | # descr => 'controller level of Gantry::Conf file', | ||||||
| 151 | # sort_order => 20, | ||||||
| 152 | # }, | ||||||
| 153 | PerlTop => { | ||||||
| 154 | keyword => 'PerlTop', | ||||||
| 155 | label => 'Preamble', | ||||||
| 156 | descr => | ||||||
| 157 | 'immediately after shebang line in httpd.conf ' . |
||||||
| 158 | ' |
||||||
| 159 | sort_order => 30, | ||||||
| 160 | }, | ||||||
| 161 | PerlBlock => { | ||||||
| 162 | keyword => 'PerlBlock', | ||||||
| 163 | label => 'Epilogue', | ||||||
| 164 | descr => 'in the httpd.conf ' . |
||||||
| 165 | 'with controllers)', | ||||||
| 166 | sort_order => 40, | ||||||
| 167 | }, | ||||||
| 168 | HttpdConf => { | ||||||
| 169 | keyword => 'HttpdConf', | ||||||
| 170 | label => 'Apache Conf', | ||||||
| 171 | descr => 'between location directives in httpd.conf', | ||||||
| 172 | sort_order => 50, | ||||||
| 173 | }, | ||||||
| 174 | Location => { | ||||||
| 175 | keyword => 'Location', | ||||||
| 176 | label => 'Base Location', | ||||||
| 177 | descr => 'in the base Location directive for the app', | ||||||
| 178 | sort_order => 60, | ||||||
| 179 | }, | ||||||
| 180 | SQL => { | ||||||
| 181 | keyword => 'SQL', | ||||||
| 182 | label => 'SQL', | ||||||
| 183 | descr => 'dumped directly into all schemas', | ||||||
| 184 | sort_order => 70, | ||||||
| 185 | }, | ||||||
| 186 | }, | ||||||
| 187 | |||||||
| 188 | table => { | ||||||
| 189 | no_gen => { | ||||||
| 190 | keyword => 'no_gen', | ||||||
| 191 | label => 'No Gen', | ||||||
| 192 | descr => "Skip this table completely", | ||||||
| 193 | type => 'boolean', | ||||||
| 194 | sort_order => 10, | ||||||
| 195 | }, | ||||||
| 196 | not_for => { | ||||||
| 197 | keyword => 'not_for', | ||||||
| 198 | label => 'Not For', | ||||||
| 199 | descr => 'Tell Model and/or SQL to skip this table', | ||||||
| 200 | type => 'select', | ||||||
| 201 | multiple => 1, | ||||||
| 202 | options => [ | ||||||
| 203 | { label => 'SQL', value => 'SQL' }, | ||||||
| 204 | { label => 'Model', value => 'Model' }, | ||||||
| 205 | ], | ||||||
| 206 | sort_order => 20, | ||||||
| 207 | }, | ||||||
| 208 | data => { | ||||||
| 209 | keyword => 'data', | ||||||
| 210 | label => 'Data', | ||||||
| 211 | descr => 'What to INSERT INTO table upon initial creation', | ||||||
| 212 | type => 'pair', | ||||||
| 213 | multiple => 1, | ||||||
| 214 | repeatable => 1, | ||||||
| 215 | sort_order => 20000, | ||||||
| 216 | }, | ||||||
| 217 | foreign_display => { | ||||||
| 218 | keyword => 'foreign_display', | ||||||
| 219 | label => 'Foreign Display', | ||||||
| 220 | descr => 'Pattern string for other tables: %last, %first', | ||||||
| 221 | type => 'text', | ||||||
| 222 | multiple => 0, | ||||||
| 223 | urgency => 3, | ||||||
| 224 | sort_order => 30, | ||||||
| 225 | }, | ||||||
| 226 | refered_to_by => { | ||||||
| 227 | keyword => 'refered_to_by', | ||||||
| 228 | label => 'Refered to by', | ||||||
| 229 | descr => 'Table has many rows from this other table', | ||||||
| 230 | type => 'pair', | ||||||
| 231 | pair_labels => [ 'Foreign Table', 'Name of Has Many' ], | ||||||
| 232 | pair_required => 0, | ||||||
| 233 | multiple => 1, | ||||||
| 234 | repeatable => 0, | ||||||
| 235 | urgency => 0, | ||||||
| 236 | sort_order => 35, | ||||||
| 237 | }, | ||||||
| 238 | model_base_class => { | ||||||
| 239 | keyword => 'model_base_class', | ||||||
| 240 | label => 'Inherits From', | ||||||
| 241 | descr => 'Models inherit from this [has good default]', | ||||||
| 242 | type => 'text', | ||||||
| 243 | multiple => 0, | ||||||
| 244 | sort_order => 40, | ||||||
| 245 | }, | ||||||
| 246 | sequence => { | ||||||
| 247 | keyword => 'sequence', | ||||||
| 248 | label => 'Sequence', | ||||||
| 249 | descr => 'Which sequence to take default keys from', | ||||||
| 250 | type => 'text', | ||||||
| 251 | multiple => 0, | ||||||
| 252 | urgency => 1, | ||||||
| 253 | sort_order => 50, | ||||||
| 254 | }, | ||||||
| 255 | label => { | ||||||
| 256 | keyword => 'label', | ||||||
| 257 | label => 'Label', | ||||||
| 258 | descr => 'Documentation label for table', | ||||||
| 259 | type => 'text', | ||||||
| 260 | multiple => 0, | ||||||
| 261 | urgency => 0, | ||||||
| 262 | quick_label => 'Label', | ||||||
| 263 | sort_order => 60, | ||||||
| 264 | }, | ||||||
| 265 | }, | ||||||
| 266 | |||||||
| 267 | field => { | ||||||
| 268 | no_gen => { | ||||||
| 269 | keyword => 'no_gen', | ||||||
| 270 | label => 'No Gen', | ||||||
| 271 | descr => "Skip this field completely", | ||||||
| 272 | type => 'boolean', | ||||||
| 273 | sort_order => 10, | ||||||
| 274 | }, | ||||||
| 275 | not_for => { | ||||||
| 276 | keyword => 'not_for', | ||||||
| 277 | label => 'Not For', | ||||||
| 278 | descr => 'Tell Model and/or SQL to skip this field', | ||||||
| 279 | type => 'select', | ||||||
| 280 | multiple => 1, | ||||||
| 281 | options => [ | ||||||
| 282 | { label => 'SQL', value => 'SQL' }, | ||||||
| 283 | { label => 'Model', value => 'Model' }, | ||||||
| 284 | ], | ||||||
| 285 | sort_order => 20, | ||||||
| 286 | }, | ||||||
| 287 | is => { | ||||||
| 288 | keyword => 'is', | ||||||
| 289 | label => 'SQL Type Info', | ||||||
| 290 | descr => 'SQL type clause phrases, e.g.:' | ||||||
| 291 | . "int4\nvarchar\nprimary_key\nauto", |
||||||
| 292 | type => 'text', | ||||||
| 293 | multiple => 1, | ||||||
| 294 | urgency => 10, | ||||||
| 295 | quick_label => 'SQL Type', | ||||||
| 296 | sort_order => 30, | ||||||
| 297 | }, | ||||||
| 298 | accessor => { | ||||||
| 299 | keyword => 'accessor', | ||||||
| 300 | label => 'Accessor Name', | ||||||
| 301 | descr => 'DBIx::Class alternate accessor name for this column', | ||||||
| 302 | type => 'text', | ||||||
| 303 | multiple => 1, | ||||||
| 304 | urgency => 0, | ||||||
| 305 | sort_order => 35, | ||||||
| 306 | }, | ||||||
| 307 | add_columns => { | ||||||
| 308 | keyword => 'add_columns', | ||||||
| 309 | label => 'Custom add_columns', | ||||||
| 310 | descr => 'DBIx::Class alternate column addition', | ||||||
| 311 | type => 'pair', | ||||||
| 312 | pair_labels => [ 'Key', 'Value' ], | ||||||
| 313 | pair_required => 1, | ||||||
| 314 | multiple => 1, | ||||||
| 315 | urgency => 0, | ||||||
| 316 | sort_order => 36, | ||||||
| 317 | }, | ||||||
| 318 | refers_to => { | ||||||
| 319 | keyword => 'refers_to', | ||||||
| 320 | label => 'Foreign Key Table', | ||||||
| 321 | descr => 'Where this foreign key points', | ||||||
| 322 | type => 'pair', | ||||||
| 323 | pair_labels => [ 'Table', 'Column' ], | ||||||
| 324 | pair_required => 0, | ||||||
| 325 | multiple => 0, | ||||||
| 326 | urgency => 1, | ||||||
| 327 | sort_order => 40, | ||||||
| 328 | }, | ||||||
| 329 | quasi_refers_to => { | ||||||
| 330 | keyword => 'quasi_refers_to', | ||||||
| 331 | label => 'Quasi-Foreign Key Table', | ||||||
| 332 | descr => 'Where this column usually points', | ||||||
| 333 | type => 'pair', | ||||||
| 334 | pair_labels => [ 'Table', 'Column' ], | ||||||
| 335 | pair_required => 0, | ||||||
| 336 | multiple => 0, | ||||||
| 337 | urgency => 0, | ||||||
| 338 | sort_order => 45, | ||||||
| 339 | }, | ||||||
| 340 | on_delete => { | ||||||
| 341 | keyword => 'on_delete', | ||||||
| 342 | label => 'On Delete Behavior', | ||||||
| 343 | descr => 'What to do when foreign key column\'s row dies', | ||||||
| 344 | type => 'text', | ||||||
| 345 | multiple => 0, | ||||||
| 346 | urgency => 0, | ||||||
| 347 | sort_order => 50, | ||||||
| 348 | }, | ||||||
| 349 | on_update => { | ||||||
| 350 | keyword => 'on_update', | ||||||
| 351 | label => 'On Update Behavior', | ||||||
| 352 | descr => 'What to do when foreign key column\'s row changes', | ||||||
| 353 | type => 'text', | ||||||
| 354 | multiple => 0, | ||||||
| 355 | urgency => 0, | ||||||
| 356 | sort_order => 51, | ||||||
| 357 | }, | ||||||
| 358 | label => { | ||||||
| 359 | keyword => 'label', | ||||||
| 360 | label => 'Label', | ||||||
| 361 | descr => 'Default on-screen label for field', | ||||||
| 362 | type => 'text', | ||||||
| 363 | multiple => 0, | ||||||
| 364 | urgency => 5, | ||||||
| 365 | quick_label => 'Label', | ||||||
| 366 | sort_order => 60, | ||||||
| 367 | }, | ||||||
| 368 | searchable => { | ||||||
| 369 | keyword => 'searchable', | ||||||
| 370 | label => 'Searchable', | ||||||
| 371 | descr => 'Include this field in searches?', | ||||||
| 372 | type => 'boolean', | ||||||
| 373 | quick_label => 'Searchable', | ||||||
| 374 | sort_order => 65, | ||||||
| 375 | }, | ||||||
| 376 | html_form_type => { | ||||||
| 377 | keyword => 'html_form_type', | ||||||
| 378 | label => 'Form Type', | ||||||
| 379 | descr => 'form type: text, textarea, select', | ||||||
| 380 | type => 'select', | ||||||
| 381 | options => [ | ||||||
| 382 | { label => '-- Choose One --', value => 'undefined' }, | ||||||
| 383 | { label => 'text', value => 'text' }, | ||||||
| 384 | { label => 'textarea', value => 'textarea' }, | ||||||
| 385 | { label => 'select', value => 'select' }, | ||||||
| 386 | { label => 'display', value => 'display' }, | ||||||
| 387 | ], | ||||||
| 388 | urgency => 5, | ||||||
| 389 | sort_order => 70, | ||||||
| 390 | }, | ||||||
| 391 | html_form_optional => { | ||||||
| 392 | keyword => 'html_form_optional', | ||||||
| 393 | label => 'Optional', | ||||||
| 394 | descr => 'May user skip this field?', | ||||||
| 395 | type => 'boolean', | ||||||
| 396 | quick_label => 'Optional', | ||||||
| 397 | sort_order => 80, | ||||||
| 398 | }, | ||||||
| 399 | html_form_constraint => { | ||||||
| 400 | keyword => 'html_form_constraint', | ||||||
| 401 | label => 'Constraint', | ||||||
| 402 | descr => 'Data::FormValidator constraint, e.g.: ' | ||||||
| 403 | . 'qr{^\d$}', |
||||||
| 404 | type => 'text', | ||||||
| 405 | multiple => 0, | ||||||
| 406 | quick_label => 'Constraint', | ||||||
| 407 | sort_order => 90, | ||||||
| 408 | }, | ||||||
| 409 | html_form_default_value => { | ||||||
| 410 | keyword => 'html_form_default_value', | ||||||
| 411 | label => 'Default Value', | ||||||
| 412 | descr => 'Form element value when no other is available', | ||||||
| 413 | type => 'text', | ||||||
| 414 | multiple => 0, | ||||||
| 415 | quick_label => 'Default', | ||||||
| 416 | sort_order => 100, | ||||||
| 417 | }, | ||||||
| 418 | html_form_cols => { | ||||||
| 419 | keyword => 'html_form_cols', | ||||||
| 420 | label => 'Columns', | ||||||
| 421 | descr => 'cols attribute of text area', | ||||||
| 422 | type => 'text', | ||||||
| 423 | field_type => 'textarea', | ||||||
| 424 | multiple => 0, | ||||||
| 425 | sort_order => 110, | ||||||
| 426 | }, | ||||||
| 427 | html_form_rows => { | ||||||
| 428 | keyword => 'html_form_rows', | ||||||
| 429 | label => 'Rows', | ||||||
| 430 | descr => 'rows attribute of text area', | ||||||
| 431 | type => 'text', | ||||||
| 432 | field_type => 'textarea', | ||||||
| 433 | multiple => 0, | ||||||
| 434 | sort_order => 120, | ||||||
| 435 | }, | ||||||
| 436 | html_form_display_size => { | ||||||
| 437 | keyword => 'html_form_display_size', | ||||||
| 438 | label => 'Size', | ||||||
| 439 | descr => 'width attribute if type is text', | ||||||
| 440 | type => 'text', | ||||||
| 441 | field_type => 'text', | ||||||
| 442 | multiple => 0, | ||||||
| 443 | sort_order => 130, | ||||||
| 444 | }, | ||||||
| 445 | html_form_class => { | ||||||
| 446 | keyword => 'html_form_class', | ||||||
| 447 | label => 'Class', | ||||||
| 448 | descr => 'class attribute for the form field', | ||||||
| 449 | type => 'text', | ||||||
| 450 | field_type => 'text', | ||||||
| 451 | multiple => 0, | ||||||
| 452 | sort_order => 130, | ||||||
| 453 | }, | ||||||
| 454 | html_form_hint => { | ||||||
| 455 | keyword => 'html_form_hint', | ||||||
| 456 | label => 'Hint', | ||||||
| 457 | descr => 'form field hint', | ||||||
| 458 | type => 'text', | ||||||
| 459 | multiple => 0, | ||||||
| 460 | sort_order => 135, | ||||||
| 461 | }, | ||||||
| 462 | html_form_options => { | ||||||
| 463 | keyword => 'html_form_options', | ||||||
| 464 | label => 'Options', | ||||||
| 465 | descr => 'Choices for fields of type select ' |
||||||
| 466 | . '[ignored for refers_to fields]', | ||||||
| 467 | type => 'pair', | ||||||
| 468 | field_type => 'select', | ||||||
| 469 | multiple => 1, | ||||||
| 470 | pair_labels => [ 'Label', 'Database Value' ], | ||||||
| 471 | pair_required => 1, | ||||||
| 472 | sort_order => 140, | ||||||
| 473 | }, | ||||||
| 474 | html_form_foreign => { | ||||||
| 475 | keyword => 'html_form_foreign', | ||||||
| 476 | label => 'Foreign', | ||||||
| 477 | descr => 'Display field is a foreign key', | ||||||
| 478 | type => 'boolean', | ||||||
| 479 | field_type => 'display', | ||||||
| 480 | multiple => 0, | ||||||
| 481 | sort_order => 145, | ||||||
| 482 | }, | ||||||
| 483 | html_form_onchange => { | ||||||
| 484 | keyword => 'html_form_onchange', | ||||||
| 485 | label => 'onchange Callback', | ||||||
| 486 | descr => 'Name of Javascript function to call on change', | ||||||
| 487 | type => 'text', | ||||||
| 488 | field_type => 'select', | ||||||
| 489 | multiple => 0, | ||||||
| 490 | sort_order => 146, | ||||||
| 491 | }, | ||||||
| 492 | html_form_fieldset => { | ||||||
| 493 | keyword => 'html_form_fieldset', | ||||||
| 494 | label => 'Fieldset', | ||||||
| 495 | descr => 'Name of fieldset to group this field into', | ||||||
| 496 | type => 'text', | ||||||
| 497 | multiple => 0, | ||||||
| 498 | sort_order => 147, | ||||||
| 499 | }, | ||||||
| 500 | date_select_text => { | ||||||
| 501 | keyword => 'date_select_text', | ||||||
| 502 | label => 'Date Popup Link Text', | ||||||
| 503 | descr => 'link text for date popup window', | ||||||
| 504 | type => 'text', | ||||||
| 505 | field_type => 'text', | ||||||
| 506 | multiple => 0, | ||||||
| 507 | refresh => 1, | ||||||
| 508 | sort_order => 150, | ||||||
| 509 | }, | ||||||
| 510 | html_form_raw_html => { | ||||||
| 511 | keyword => 'html_form_raw_html', | ||||||
| 512 | label => 'Raw HTML', | ||||||
| 513 | descr => q!appears before this field's table row!, | ||||||
| 514 | type => 'text', | ||||||
| 515 | multiple => 0, | ||||||
| 516 | sort_order => 160, | ||||||
| 517 | }, | ||||||
| 518 | non_essential => { | ||||||
| 519 | keyword => 'non_essential', | ||||||
| 520 | label => 'Non-essential', | ||||||
| 521 | descr => 'Tells modeler: retrieve only when accessed', | ||||||
| 522 | type => 'boolean', | ||||||
| 523 | sort_order => 170, | ||||||
| 524 | }, | ||||||
| 525 | pseudo_value => { | ||||||
| 526 | keyword => 'pseudo_value', | ||||||
| 527 | label => 'Value for Pseudo Field', | ||||||
| 528 | descr => q[This is the definition for a pseudo field. By defining it, you're declaring the field as a pseudo field], | ||||||
| 529 | type => 'text', | ||||||
| 530 | sort_order => 180, | ||||||
| 531 | }, | ||||||
| 532 | unique_name => { | ||||||
| 533 | keyword => 'unique_name', | ||||||
| 534 | label => 'Unique constraint name', | ||||||
| 535 | descr => q[Declare this field as unique, and use the value for the constraint name], | ||||||
| 536 | type => 'text', | ||||||
| 537 | sort_order => 190, | ||||||
| 538 | } | ||||||
| 539 | }, | ||||||
| 540 | |||||||
| 541 | extra_sql => { | ||||||
| 542 | sql => { | ||||||
| 543 | keyword => 'sql', | ||||||
| 544 | label => 'SQL', | ||||||
| 545 | descr => 'Literal SQL, use bind parameters, see below.', | ||||||
| 546 | type => 'text', | ||||||
| 547 | multiplie => 0, | ||||||
| 548 | urgency => 10, | ||||||
| 549 | sort_order => 10, | ||||||
| 550 | }, | ||||||
| 551 | expects => { | ||||||
| 552 | keyword => 'expects', | ||||||
| 553 | label => 'Bind Parameters', | ||||||
| 554 | descr => | ||||||
| 555 | 'What your SQL needs for positional binding.' | ||||||
| 556 | . ' [optional, omit if you have no bound parameters]', | ||||||
| 557 | type => 'pair', | ||||||
| 558 | pair_required => 0, | ||||||
| 559 | pair_labels => [ 'Name', 'Type' ], | ||||||
| 560 | multiple => 1, | ||||||
| 561 | urgency => 5, | ||||||
| 562 | sort_order => 20, | ||||||
| 563 | }, | ||||||
| 564 | returns => { | ||||||
| 565 | keyword => 'returns', | ||||||
| 566 | label => 'Returned Columns', | ||||||
| 567 | descr => | ||||||
| 568 | 'Names of columns in SQL output.' | ||||||
| 569 | . ' [optional, omit if you expect no returned rows]', | ||||||
| 570 | type => 'pair', | ||||||
| 571 | pair_required => 0, | ||||||
| 572 | pair_labels => [ 'Name', 'Type' ], | ||||||
| 573 | multiple => 1, | ||||||
| 574 | urgency => 5, | ||||||
| 575 | sort_order => 30, | ||||||
| 576 | }, | ||||||
| 577 | }, | ||||||
| 578 | |||||||
| 579 | join_table => { | ||||||
| 580 | joins => { | ||||||
| 581 | keyword => 'joins', | ||||||
| 582 | label => 'Joins These', | ||||||
| 583 | descr => 'Which tables does this one join?', | ||||||
| 584 | type => 'pair', | ||||||
| 585 | pair_labels => [ 'Table', 'Table' ], | ||||||
| 586 | pair_required => 1, | ||||||
| 587 | multiple => 0, | ||||||
| 588 | urgency => 10, | ||||||
| 589 | sort_order => 10, | ||||||
| 590 | }, | ||||||
| 591 | names => { | ||||||
| 592 | keyword => 'names', | ||||||
| 593 | label => 'Name the Joins', | ||||||
| 594 | descr => 'What should I call each has many?', | ||||||
| 595 | type => 'pair', | ||||||
| 596 | pair_labels => [ 'Has Many Name', 'Has Many Name' ], | ||||||
| 597 | pair_required => 1, | ||||||
| 598 | multiple => 0, | ||||||
| 599 | urgency => 0, | ||||||
| 600 | sort_order => 20, | ||||||
| 601 | }, | ||||||
| 602 | data => { | ||||||
| 603 | keyword => 'data', | ||||||
| 604 | label => 'Data', | ||||||
| 605 | descr => 'What to INSERT INTO table upon initial creation', | ||||||
| 606 | type => 'pair', | ||||||
| 607 | pair_required => 1, | ||||||
| 608 | multiple => 1, | ||||||
| 609 | repeatable => 1, | ||||||
| 610 | sort_order => 20000, | ||||||
| 611 | }, | ||||||
| 612 | }, | ||||||
| 613 | |||||||
| 614 | controller => { | ||||||
| 615 | no_gen => { | ||||||
| 616 | keyword => 'no_gen', | ||||||
| 617 | label => 'No Gen', | ||||||
| 618 | descr => "Skip this controller completely", | ||||||
| 619 | type => 'boolean', | ||||||
| 620 | urgency => 0, | ||||||
| 621 | sort_order => 10, | ||||||
| 622 | controller_types => { | ||||||
| 623 | all => 1, | ||||||
| 624 | }, | ||||||
| 625 | }, | ||||||
| 626 | location => { | ||||||
| 627 | keyword => 'location', | ||||||
| 628 | label => 'Location', | ||||||
| 629 | descr => 'Absolute Location of this controller ' | ||||||
| 630 | . '[non-base controllers must have either a ' |
||||||
| 631 | . 'location or a rel_location.]', | ||||||
| 632 | type => 'text', | ||||||
| 633 | multiple => 0, | ||||||
| 634 | urgency => 5, | ||||||
| 635 | sort_order => 20, | ||||||
| 636 | controller_types => { | ||||||
| 637 | all => 1, | ||||||
| 638 | }, | ||||||
| 639 | }, | ||||||
| 640 | rel_location => { | ||||||
| 641 | keyword => 'rel_location', | ||||||
| 642 | label => 'Relative Loc.', | ||||||
| 643 | descr => 'Location of this controller relative to app location' | ||||||
| 644 | . ' [non-base controllers must have ' |
||||||
| 645 | . 'location or rel_location.]', | ||||||
| 646 | type => 'text', | ||||||
| 647 | multiple => 0, | ||||||
| 648 | urgency => 5, | ||||||
| 649 | sort_order => 30, | ||||||
| 650 | controller_types => { | ||||||
| 651 | stub => 1, | ||||||
| 652 | AutoCRUD => 1, | ||||||
| 653 | CRUD => 1, | ||||||
| 654 | SOAP => 1, | ||||||
| 655 | SOAPDoc => 1, | ||||||
| 656 | }, | ||||||
| 657 | }, | ||||||
| 658 | controls_table => { | ||||||
| 659 | keyword => 'controls_table', | ||||||
| 660 | label => 'Controls Table', | ||||||
| 661 | descr => 'Table this controller manages', | ||||||
| 662 | type => 'text', | ||||||
| 663 | multiple => 0, | ||||||
| 664 | urgency => 5, | ||||||
| 665 | sort_order => 40, | ||||||
| 666 | controller_types => { | ||||||
| 667 | all => 1, | ||||||
| 668 | }, | ||||||
| 669 | }, | ||||||
| 670 | gen_uses => { | ||||||
| 671 | keyword => 'gen_uses', | ||||||
| 672 | label => 'Modules Used', | ||||||
| 673 | descr => 'List of modules used in gen module ' . #/ |
||||||
| 674 | 'use list ex: qw( :default )', | ||||||
| 675 | type => 'text', | ||||||
| 676 | type => 'pair', | ||||||
| 677 | multiple => 1, | ||||||
| 678 | sort_order => 45, | ||||||
| 679 | pair_labels => [ 'Module', 'Literal Use List' ], | ||||||
| 680 | pair_required => 0, | ||||||
| 681 | controller_types => { | ||||||
| 682 | all => 1, | ||||||
| 683 | }, | ||||||
| 684 | }, | ||||||
| 685 | stub_uses => { | ||||||
| 686 | keyword => 'stub_uses', | ||||||
| 687 | label => 'Modules Used', | ||||||
| 688 | descr => 'List of modules used in stub module', | ||||||
| 689 | type => 'text', | ||||||
| 690 | type => 'pair', | ||||||
| 691 | multiple => 1, | ||||||
| 692 | sort_order => 48, | ||||||
| 693 | pair_labels => [ 'Module', 'Literal Use List' ], | ||||||
| 694 | pair_required => 0, | ||||||
| 695 | controller_types => { | ||||||
| 696 | all => 1, | ||||||
| 697 | }, | ||||||
| 698 | }, | ||||||
| 699 | uses => { | ||||||
| 700 | keyword => 'uses', | ||||||
| 701 | label => 'Modules Used', | ||||||
| 702 | descr => 'List of modules used by gen and stub modules', | ||||||
| 703 | type => 'pair', | ||||||
| 704 | multiple => 1, | ||||||
| 705 | sort_order => 50, | ||||||
| 706 | pair_labels => [ 'Module', 'Literal Use List' ], | ||||||
| 707 | pair_required => 0, | ||||||
| 708 | controller_types => { | ||||||
| 709 | all => 1, | ||||||
| 710 | }, | ||||||
| 711 | }, | ||||||
| 712 | plugins => { | ||||||
| 713 | keyword => 'plugins', | ||||||
| 714 | label => 'Plugins Used', | ||||||
| 715 | descr => 'List of plugins used by gen module', | ||||||
| 716 | type => 'text', | ||||||
| 717 | multiple => 1, | ||||||
| 718 | sort_order => 52, | ||||||
| 719 | controller_types => { | ||||||
| 720 | all => 1, | ||||||
| 721 | }, | ||||||
| 722 | }, | ||||||
| 723 | text_description => { | ||||||
| 724 | keyword => 'text_description', | ||||||
| 725 | label => 'Text Descr.', | ||||||
| 726 | descr => 'Required for Gantry\'s AutoCRUD', | ||||||
| 727 | type => 'text', | ||||||
| 728 | multiple => 0, | ||||||
| 729 | urgency => 3, | ||||||
| 730 | sort_order => 60, | ||||||
| 731 | controller_types => { | ||||||
| 732 | AutoCRUD => 1, | ||||||
| 733 | base_controller => 1, | ||||||
| 734 | }, | ||||||
| 735 | }, | ||||||
| 736 | page_link_label => { | ||||||
| 737 | keyword => 'page_link_label', | ||||||
| 738 | label => 'Navigation Label', | ||||||
| 739 | descr => 'Link text in navigation bar [use only ' |
||||||
| 740 | . 'for navigable controllers]', | ||||||
| 741 | type => 'text', | ||||||
| 742 | multiple => 0, | ||||||
| 743 | urgency => 3, | ||||||
| 744 | sort_order => 70, | ||||||
| 745 | controller_types => { | ||||||
| 746 | all => 1, | ||||||
| 747 | }, | ||||||
| 748 | }, | ||||||
| 749 | autocrud_helper => { | ||||||
| 750 | keyword => 'autocrud_helper', | ||||||
| 751 | label => 'AutoCRUDHelper', | ||||||
| 752 | descr => 'Gantry::Plugins::AutoCRUDHelper for your ORM', | ||||||
| 753 | type => 'text', | ||||||
| 754 | mulitple => 0, | ||||||
| 755 | urgency => 0, | ||||||
| 756 | sort_order => 80, | ||||||
| 757 | controller_types => { | ||||||
| 758 | AutoCRUD => 1, | ||||||
| 759 | base_controller => 1, | ||||||
| 760 | }, | ||||||
| 761 | }, | ||||||
| 762 | skip_test => { | ||||||
| 763 | keyword => 'skip_test', | ||||||
| 764 | label => 'No Test', | ||||||
| 765 | descr => "Skip default page hit test of this controller", | ||||||
| 766 | type => 'boolean', | ||||||
| 767 | urgency => 0, | ||||||
| 768 | sort_order => 90, | ||||||
| 769 | controller_types => { | ||||||
| 770 | all => 1, | ||||||
| 771 | }, | ||||||
| 772 | }, | ||||||
| 773 | soap_name => { | ||||||
| 774 | keyword => 'soap_name', | ||||||
| 775 | label => 'Soap Name', | ||||||
| 776 | descr => 'Base of all WSDL names', | ||||||
| 777 | type => 'text', | ||||||
| 778 | urgency => 10, | ||||||
| 779 | sort_order => 100, | ||||||
| 780 | controller_types => { | ||||||
| 781 | SOAP => 1, | ||||||
| 782 | SOAPDoc => 1, | ||||||
| 783 | }, | ||||||
| 784 | }, | ||||||
| 785 | namespace_base => { | ||||||
| 786 | keyword => 'namespace_base', | ||||||
| 787 | label => 'Namespace Base', | ||||||
| 788 | descr => 'Base URL of WSDL namespace including domain', | ||||||
| 789 | type => 'text', | ||||||
| 790 | urgency => 10, | ||||||
| 791 | sort_order => 110, | ||||||
| 792 | controller_types => { | ||||||
| 793 | SOAP => 1, | ||||||
| 794 | SOAPDoc => 1, | ||||||
| 795 | }, | ||||||
| 796 | }, | ||||||
| 797 | }, | ||||||
| 798 | |||||||
| 799 | controller_literal => { | ||||||
| 800 | Location => { | ||||||
| 801 | keyword => 'Location', | ||||||
| 802 | label => 'Controller Loc.', | ||||||
| 803 | descr => 'in Location block for this controller', | ||||||
| 804 | sort_order => 10, | ||||||
| 805 | }, | ||||||
| 806 | GantryLocation => { | ||||||
| 807 | keyword => 'GantryLocation', | ||||||
| 808 | label => 'Controller Loc.', | ||||||
| 809 | descr => | ||||||
| 810 | 'in GantryLocation block for this controller', | ||||||
| 811 | sort_order => 20, | ||||||
| 812 | }, | ||||||
| 813 | }, | ||||||
| 814 | |||||||
| 815 | method => { | ||||||
| 816 | no_gen => { | ||||||
| 817 | keyword => 'no_gen', | ||||||
| 818 | label => 'No Gen', | ||||||
| 819 | descr => "Skip this method completely", | ||||||
| 820 | type => 'boolean', | ||||||
| 821 | urgency => 0, | ||||||
| 822 | sort_order => 10, | ||||||
| 823 | applies_to => 'all', | ||||||
| 824 | method_types => { | ||||||
| 825 | all => 1, | ||||||
| 826 | }, | ||||||
| 827 | }, | ||||||
| 828 | extra_args => { | ||||||
| 829 | keyword => 'extra_args', | ||||||
| 830 | label => 'Extra Arguments', | ||||||
| 831 | descr => 'Extra args for any method', | ||||||
| 832 | type => 'text', | ||||||
| 833 | multiple => 1, | ||||||
| 834 | urgency => 0, | ||||||
| 835 | sort_order => 20, | ||||||
| 836 | applies_to => 'all but SOAP', | ||||||
| 837 | method_types => { | ||||||
| 838 | main_listing => 1, | ||||||
| 839 | base_links => 1, | ||||||
| 840 | links => 1, | ||||||
| 841 | AutoCRUD_form => 1, | ||||||
| 842 | CRUD_form => 1, | ||||||
| 843 | stub => 1, | ||||||
| 844 | }, | ||||||
| 845 | }, | ||||||
| 846 | order_by => { | ||||||
| 847 | keyword => 'order_by', | ||||||
| 848 | label => 'SQL Order By', | ||||||
| 849 | descr => 'Exact text of SQL order by', | ||||||
| 850 | type => 'text', | ||||||
| 851 | multiple => 0, | ||||||
| 852 | urgency => 0, | ||||||
| 853 | sort_order => 22, | ||||||
| 854 | applies_to => 'main listing', | ||||||
| 855 | method_types => { | ||||||
| 856 | main_listing => 1, | ||||||
| 857 | }, | ||||||
| 858 | }, | ||||||
| 859 | rows => { | ||||||
| 860 | keyword => 'rows', | ||||||
| 861 | label => 'Rows per Page', | ||||||
| 862 | descr => 'How many rows should appear per listing page?', | ||||||
| 863 | type => 'text', | ||||||
| 864 | multiple => 0, | ||||||
| 865 | urgency => 3, | ||||||
| 866 | sort_order => 25, | ||||||
| 867 | applies_to => 'main listing', | ||||||
| 868 | method_types => { | ||||||
| 869 | main_listing => 1, | ||||||
| 870 | }, | ||||||
| 871 | }, | ||||||
| 872 | paged_conf => { | ||||||
| 873 | keyword => 'paged_conf', | ||||||
| 874 | label => 'Conf var for rows', | ||||||
| 875 | descr => 'Take rows per page from this (conf var) accessor', | ||||||
| 876 | type => 'text', | ||||||
| 877 | multiple => 0, | ||||||
| 878 | urgency => 0, | ||||||
| 879 | sort_order => 26, | ||||||
| 880 | applies_to => 'main listing', | ||||||
| 881 | method_types => { | ||||||
| 882 | main_listing => 1, | ||||||
| 883 | }, | ||||||
| 884 | }, | ||||||
| 885 | cols => { | ||||||
| 886 | keyword => 'cols', | ||||||
| 887 | label => 'Include These Fields', | ||||||
| 888 | descr => 'Fields to include in main_listing', | ||||||
| 889 | type => 'text', | ||||||
| 890 | multiple => 1, | ||||||
| 891 | urgency => 5, | ||||||
| 892 | sort_order => 30, | ||||||
| 893 | applies_to => 'main listing', | ||||||
| 894 | method_types => { | ||||||
| 895 | main_listing => 1, | ||||||
| 896 | }, | ||||||
| 897 | }, | ||||||
| 898 | col_labels => { | ||||||
| 899 | keyword => 'col_labels', | ||||||
| 900 | label => 'Override Field Labels', | ||||||
| 901 | descr => 'Labels for fields on main_listing [optional ' |
||||||
| 902 | . 'default uses field labels]', | ||||||
| 903 | type => 'text', | ||||||
| 904 | multiple => 1, | ||||||
| 905 | urgency => 0, | ||||||
| 906 | sort_order => 40, | ||||||
| 907 | applies_to => 'main listing', | ||||||
| 908 | method_types => { | ||||||
| 909 | main_listing => 1, | ||||||
| 910 | }, | ||||||
| 911 | }, | ||||||
| 912 | pseudo_cols => { | ||||||
| 913 | keyword => 'pseudo_cols', | ||||||
| 914 | label => 'Include These Pseudo Fields', | ||||||
| 915 | descr => 'Pseudo Fields to include in main_listing', | ||||||
| 916 | type => 'text', | ||||||
| 917 | multiple => 1, | ||||||
| 918 | urgency => 5, | ||||||
| 919 | sort_order => 45, | ||||||
| 920 | applies_to => 'main listing', | ||||||
| 921 | method_types => { | ||||||
| 922 | main_listing => 1, | ||||||
| 923 | }, | ||||||
| 924 | }, | ||||||
| 925 | livesearch => { | ||||||
| 926 | keyword => 'livesearch', | ||||||
| 927 | label => 'Live Search', | ||||||
| 928 | descr => 'Places a search box on results page', | ||||||
| 929 | type => 'boolean', | ||||||
| 930 | urgency => 0, | ||||||
| 931 | sort_order => 49, | ||||||
| 932 | applies_to => 'main listing', | ||||||
| 933 | method_types => { | ||||||
| 934 | main_listing => 1, | ||||||
| 935 | }, | ||||||
| 936 | }, | ||||||
| 937 | header_options => { | ||||||
| 938 | keyword => 'header_options', | ||||||
| 939 | label => 'Header Options', | ||||||
| 940 | descr => 'User actions affecting the table [like Add]', | ||||||
| 941 | type => 'pair', | ||||||
| 942 | pair_labels => [ 'Label', 'Location' ], | ||||||
| 943 | pair_required => 0, | ||||||
| 944 | multiple => 1, | ||||||
| 945 | urgency => 5, | ||||||
| 946 | sort_order => 50, | ||||||
| 947 | applies_to => 'main listing', | ||||||
| 948 | method_types => { | ||||||
| 949 | main_listing => 1, | ||||||
| 950 | }, | ||||||
| 951 | }, | ||||||
| 952 | header_option_perms => { | ||||||
| 953 | keyword => 'header_option_perms', | ||||||
| 954 | label => 'Header Option Permissions', | ||||||
| 955 | descr => 'The table permission which controls options' . | ||||||
| 956 | ' Pick from create, retrieve, update, or delete', |
||||||
| 957 | type => 'pair', | ||||||
| 958 | pair_required => 1, | ||||||
| 959 | pair_labels => [ 'Header Option Label', | ||||||
| 960 | 'Controlling Permission' ], | ||||||
| 961 | multiple => 1, | ||||||
| 962 | urgency => 0, | ||||||
| 963 | sort_order => 55, | ||||||
| 964 | applies_to => 'main listing', | ||||||
| 965 | method_types => { | ||||||
| 966 | main_listing => 1, | ||||||
| 967 | }, | ||||||
| 968 | }, | ||||||
| 969 | row_options => { | ||||||
| 970 | keyword => 'row_options', | ||||||
| 971 | label => 'Row Options', | ||||||
| 972 | descr => 'User actions affecting rows [like Edit]' . | ||||||
| 973 | ' Locations should not end with / or ' . |
||||||
| 974 | ' include $id', |
||||||
| 975 | type => 'pair', | ||||||
| 976 | pair_required => 0, | ||||||
| 977 | pair_labels => [ 'Label', 'Location' ], | ||||||
| 978 | multiple => 1, | ||||||
| 979 | urgency => 5, | ||||||
| 980 | sort_order => 60, | ||||||
| 981 | applies_to => 'main listing', | ||||||
| 982 | method_types => { | ||||||
| 983 | main_listing => 1, | ||||||
| 984 | }, | ||||||
| 985 | }, | ||||||
| 986 | row_option_perms => { | ||||||
| 987 | keyword => 'row_option_perms', | ||||||
| 988 | label => 'Row Option Permissions', | ||||||
| 989 | descr => 'The table permission which controls options' . | ||||||
| 990 | ' Pick from create, retrieve, update, or delete', |
||||||
| 991 | type => 'pair', | ||||||
| 992 | pair_required => 1, | ||||||
| 993 | pair_labels => [ 'Row Option Label', 'Controlling Permission' ], | ||||||
| 994 | multiple => 1, | ||||||
| 995 | urgency => 0, | ||||||
| 996 | sort_order => 65, | ||||||
| 997 | applies_to => 'main listing', | ||||||
| 998 | method_types => { | ||||||
| 999 | main_listing => 1, | ||||||
| 1000 | }, | ||||||
| 1001 | }, | ||||||
| 1002 | limit_by => { | ||||||
| 1003 | keyword => 'limit_by', | ||||||
| 1004 | label => 'Limit by Foreign Key', | ||||||
| 1005 | descr => 'If an arg is supplied, show only matching rows', | ||||||
| 1006 | type => 'text', | ||||||
| 1007 | pair_required => 0, | ||||||
| 1008 | multiple => 0, | ||||||
| 1009 | urgency => 0, | ||||||
| 1010 | sort_order => 68, | ||||||
| 1011 | applies_to => 'main listing', | ||||||
| 1012 | method_types => { | ||||||
| 1013 | main_listing => 1, | ||||||
| 1014 | }, | ||||||
| 1015 | }, | ||||||
| 1016 | where_terms => { | ||||||
| 1017 | keyword => 'where_terms', | ||||||
| 1018 | label => 'Equality tests on listed columns', | ||||||
| 1019 | descr => 'Where clause will include these equality tests', | ||||||
| 1020 | type => 'pair', | ||||||
| 1021 | pair_labels => [ 'Table', 'Table' ], | ||||||
| 1022 | pair_required => 1, | ||||||
| 1023 | multiple => 1, | ||||||
| 1024 | urgency => 0, | ||||||
| 1025 | sort_order => 69, | ||||||
| 1026 | applies_to => 'main listing', | ||||||
| 1027 | method_types => { | ||||||
| 1028 | main_listing => 1, | ||||||
| 1029 | }, | ||||||
| 1030 | }, | ||||||
| 1031 | title => { | ||||||
| 1032 | keyword => 'title', | ||||||
| 1033 | label => 'Browser Title', | ||||||
| 1034 | descr => 'Browser title bar title for main_listing', | ||||||
| 1035 | type => 'text', | ||||||
| 1036 | multiple => 0, | ||||||
| 1037 | urgency => 3, | ||||||
| 1038 | sort_order => 70, | ||||||
| 1039 | applies_to => 'main listing and links', | ||||||
| 1040 | method_types => { | ||||||
| 1041 | main_listing => 1, | ||||||
| 1042 | base_links => 1, | ||||||
| 1043 | }, | ||||||
| 1044 | }, | ||||||
| 1045 | html_template => { | ||||||
| 1046 | keyword => 'html_template', | ||||||
| 1047 | label => 'Output Template', | ||||||
| 1048 | descr => 'Template to use for main_listing [defaults ' |
||||||
| 1049 | . 'to results.tt or main.tt]', | ||||||
| 1050 | type => 'text', | ||||||
| 1051 | multiple => 0, | ||||||
| 1052 | urgency => 0, | ||||||
| 1053 | sort_order => 80, | ||||||
| 1054 | applies_to => 'main listing and links', | ||||||
| 1055 | method_types => { | ||||||
| 1056 | main_listing => 1, | ||||||
| 1057 | base_links => 1, | ||||||
| 1058 | }, | ||||||
| 1059 | }, | ||||||
| 1060 | authed_methods => { | ||||||
| 1061 | keyword => 'authed_methods', | ||||||
| 1062 | label => 'Authed Methods', | ||||||
| 1063 | descr => 'Controller methods that require auth', | ||||||
| 1064 | type => 'pair', | ||||||
| 1065 | pair_labels => [ 'Method', 'Group' ], | ||||||
| 1066 | pair_required => 0, | ||||||
| 1067 | multiple => 1, | ||||||
| 1068 | urgency => 0, | ||||||
| 1069 | sort_order => 82, | ||||||
| 1070 | applies_to => 'hashref', | ||||||
| 1071 | method_types => { | ||||||
| 1072 | hashref => 1, | ||||||
| 1073 | }, | ||||||
| 1074 | }, | ||||||
| 1075 | permissions => { | ||||||
| 1076 | keyword => 'permissions', | ||||||
| 1077 | label => 'Permissions', | ||||||
| 1078 | descr => 'Set table permissions e.g. crudcr--cr--', | ||||||
| 1079 | type => 'pair', | ||||||
| 1080 | pair_labels => [ 'Bits', 'Group' ], | ||||||
| 1081 | pair_required => 0, | ||||||
| 1082 | multiple => 0, | ||||||
| 1083 | urgency => 0, | ||||||
| 1084 | sort_order => 84, | ||||||
| 1085 | applies_to => 'hashref', | ||||||
| 1086 | method_types => { | ||||||
| 1087 | hashref => 1, | ||||||
| 1088 | }, | ||||||
| 1089 | }, | ||||||
| 1090 | literal => { | ||||||
| 1091 | keyword => 'literal', | ||||||
| 1092 | label => 'Perl Hashref', | ||||||
| 1093 | descr => 'Supply a custom perl hashref', | ||||||
| 1094 | type => 'text', | ||||||
| 1095 | multiple => 1, | ||||||
| 1096 | urgency => 0, | ||||||
| 1097 | sort_order => 86, | ||||||
| 1098 | applies_to => 'hashref', | ||||||
| 1099 | method_types => { | ||||||
| 1100 | hashref => 1, | ||||||
| 1101 | }, | ||||||
| 1102 | }, | ||||||
| 1103 | all_fields_but => { | ||||||
| 1104 | keyword => 'all_fields_but', | ||||||
| 1105 | label => 'Exclued These Fields', | ||||||
| 1106 | descr => 'Fields to exclude from a form ' |
||||||
| 1107 | . '[either all_fields_but or fields is REQUIRED]', | ||||||
| 1108 | type => 'text', | ||||||
| 1109 | multiple => 1, | ||||||
| 1110 | urgency => 5, | ||||||
| 1111 | sort_order => 90, | ||||||
| 1112 | applies_to => 'form', | ||||||
| 1113 | method_types => { | ||||||
| 1114 | AutoCRUD_form => 1, | ||||||
| 1115 | CRUD_form => 1, | ||||||
| 1116 | }, | ||||||
| 1117 | }, | ||||||
| 1118 | fields => { | ||||||
| 1119 | keyword => 'fields', | ||||||
| 1120 | label => 'Include These Fields', | ||||||
| 1121 | descr => 'Fields to include on a form ' |
||||||
| 1122 | . '[either all_fields_but or fields is REQUIRED]', | ||||||
| 1123 | type => 'text', | ||||||
| 1124 | multiple => 1, | ||||||
| 1125 | urgency => 5, | ||||||
| 1126 | sort_order => 100, | ||||||
| 1127 | applies_to => 'form', | ||||||
| 1128 | method_types => { | ||||||
| 1129 | AutoCRUD_form => 1, | ||||||
| 1130 | CRUD_form => 1, | ||||||
| 1131 | }, | ||||||
| 1132 | }, | ||||||
| 1133 | extra_keys => { | ||||||
| 1134 | keyword => 'extra_keys', | ||||||
| 1135 | label => 'Keys for form hash', | ||||||
| 1136 | descr => 'Extra keys to put in the form method hash', | ||||||
| 1137 | type => 'pair', | ||||||
| 1138 | pair_labels => [ 'key', 'value' ], | ||||||
| 1139 | pair_required => 1, | ||||||
| 1140 | multiple => 1, | ||||||
| 1141 | urgency => 0, | ||||||
| 1142 | sort_order => 110, | ||||||
| 1143 | applies_to => 'form', | ||||||
| 1144 | method_types => { | ||||||
| 1145 | AutoCRUD_form => 1, | ||||||
| 1146 | CRUD_form => 1, | ||||||
| 1147 | }, | ||||||
| 1148 | }, | ||||||
| 1149 | form_name => { | ||||||
| 1150 | keyword => 'form_name', | ||||||
| 1151 | label => 'Form Name', | ||||||
| 1152 | descr => 'Form name [used with date selections]', | ||||||
| 1153 | type => 'text', | ||||||
| 1154 | multiple => 0, | ||||||
| 1155 | urgency => 0, | ||||||
| 1156 | sort_order => 120, | ||||||
| 1157 | applies_to => 'form', | ||||||
| 1158 | method_types => { | ||||||
| 1159 | AutoCRUD_form => 1, | ||||||
| 1160 | CRUD_form => 1, | ||||||
| 1161 | }, | ||||||
| 1162 | }, | ||||||
| 1163 | expects => { | ||||||
| 1164 | keyword => 'expects', | ||||||
| 1165 | label => 'Input Parameters', | ||||||
| 1166 | descr => 'Things your SOAP method receives', | ||||||
| 1167 | type => 'pair', | ||||||
| 1168 | pair_required => 0, | ||||||
| 1169 | pair_labels => [ 'Name', 'Type' ], | ||||||
| 1170 | multiple => 1, | ||||||
| 1171 | urgency => 10, | ||||||
| 1172 | sort_order => 130, | ||||||
| 1173 | applies_to => 'SOAP', | ||||||
| 1174 | method_types => { | ||||||
| 1175 | SOAP => 1, | ||||||
| 1176 | SOAPDoc => 1, | ||||||
| 1177 | }, | ||||||
| 1178 | }, | ||||||
| 1179 | returns => { | ||||||
| 1180 | keyword => 'returns', | ||||||
| 1181 | label => 'Output Parameters', | ||||||
| 1182 | descr => 'Things your SOAP method returns', | ||||||
| 1183 | type => 'pair', | ||||||
| 1184 | pair_required => 0, | ||||||
| 1185 | pair_labels => [ 'Name', 'Type' ], | ||||||
| 1186 | multiple => 1, | ||||||
| 1187 | urgency => 10, | ||||||
| 1188 | sort_order => 140, | ||||||
| 1189 | applies_to => 'SOAP', | ||||||
| 1190 | method_types => { | ||||||
| 1191 | SOAP => 1, | ||||||
| 1192 | SOAPDoc => 1, | ||||||
| 1193 | }, | ||||||
| 1194 | }, | ||||||
| 1195 | }, | ||||||
| 1196 | ); | ||||||
| 1197 | |||||||
| 1198 | sub get_docs_for { | ||||||
| 1199 | 24 | 24 | 1 | 39 | my $class = shift; | ||
| 1200 | 24 | 33 | my $type = shift; | ||||
| 1201 | 24 | 51 | my @keywords = @_; | ||||
| 1202 | |||||||
| 1203 | 24 | 212 | my @retvals = ( $type ); | ||||
| 1204 | |||||||
| 1205 | 24 | 534 | foreach my $keyword ( @keywords ) { | ||||
| 1206 | 101 | 248 | push @retvals, $doc_for{ $type }{ $keyword }; | ||||
| 1207 | } | ||||||
| 1208 | |||||||
| 1209 | 24 | 166 | return @retvals; | ||||
| 1210 | } | ||||||
| 1211 | |||||||
| 1212 | sub get_full_doc_hash { | ||||||
| 1213 | 0 | 0 | 1 | return \%doc_for; | |||
| 1214 | } | ||||||
| 1215 | |||||||
| 1216 | 1; | ||||||
| 1217 | |||||||
| 1218 | =head1 NAME | ||||||
| 1219 | |||||||
| 1220 | Bigtop::Keywords - A central place to describe all bigtop keywords | ||||||
| 1221 | |||||||
| 1222 | =head1 SYNOPSIS | ||||||
| 1223 | |||||||
| 1224 | In your backend or backend type module: | ||||||
| 1225 | |||||||
| 1226 | use Bigtop::Keywords; | ||||||
| 1227 | # There is no need to use Bigtop::Parser since it uses you. | ||||||
| 1228 | |||||||
| 1229 | BEGIN { | ||||||
| 1230 | Bigtop::Parser->add_valid_keywords( | ||||||
| 1231 | Bigtop::Keywords->get_docs_for( | ||||||
| 1232 | $keyword_level, | ||||||
| 1233 | qw( your keywords here ) | ||||||
| 1234 | ) | ||||||
| 1235 | ); | ||||||
| 1236 | } | ||||||
| 1237 | |||||||
| 1238 | Note that this must be done in a BEGIN block. | ||||||
| 1239 | |||||||
| 1240 | Or, if you are writing a documenation tool: | ||||||
| 1241 | |||||||
| 1242 | my $keyword_for = Bigtop::Keywords->get_full_doc_hash(); | ||||||
| 1243 | |||||||
| 1244 | =head1 DESCRIPTION | ||||||
| 1245 | |||||||
| 1246 | Since many backends need to use the same keywords, it eventually dawned | ||||||
| 1247 | on me that a central place to describe would be a good thing. This is | ||||||
| 1248 | that place. By keeping all the keyword definitions here, all backends | ||||||
| 1249 | can share them. This became especially helpful with the birth of tentmaker. | ||||||
| 1250 | It wants to consistently tell users about the keywords. | ||||||
| 1251 | |||||||
| 1252 | If you write or modify a backend and need new keywords in the process, | ||||||
| 1253 | define them here and send in a patch. This will avoid name collisions | ||||||
| 1254 | and keep the tentmaker functioning. Read on for how to define the keywords. | ||||||
| 1255 | |||||||
| 1256 | =head1 DEFINING KEYWORDS | ||||||
| 1257 | |||||||
| 1258 | To define a new keyword, first decide at what level it will be used. | ||||||
| 1259 | That is, does it apply inside controller blocks, table blocks, or somewhere | ||||||
| 1260 | else. See L |
||||||
| 1261 | |||||||
| 1262 | Once you know where your keyword should be legal, find its level among | ||||||
| 1263 | the top level keys in the C<%docs_for> in this file. Inside the hash for | ||||||
| 1264 | your level add a new hash keyed by your keyword name (pick the name | ||||||
| 1265 | carefully, changing them after release is painful). The value for your | ||||||
| 1266 | new hash key is itself a hash. Here are the legal keys for the hash (all | ||||||
| 1267 | keys are optional unless marked required): | ||||||
| 1268 | |||||||
| 1269 | =over 4 | ||||||
| 1270 | |||||||
| 1271 | =item keyword | ||||||
| 1272 | |||||||
| 1273 | Required and must be the same as the key for the hash. The official name | ||||||
| 1274 | of the keyword. The user must type this to use the keyword (or get a tool | ||||||
| 1275 | to do it for her). | ||||||
| 1276 | |||||||
| 1277 | =item label | ||||||
| 1278 | |||||||
| 1279 | Required for tentmaker. The name tentmaker shows its users for this keyword. | ||||||
| 1280 | Traditionally, this is just the keyword beautified so the label for | ||||||
| 1281 | keyword 'contact_us' is 'Contact Us'. | ||||||
| 1282 | |||||||
| 1283 | =item descr | ||||||
| 1284 | |||||||
| 1285 | tentmaker shows this next to the input box for the keyword. Feel free | ||||||
| 1286 | to use a bit of html in the value for descr. For instance, when providing | ||||||
| 1287 | examples, surround them with pre tags. | ||||||
| 1288 | |||||||
| 1289 | =item sort_order | ||||||
| 1290 | |||||||
| 1291 | tentmaker uses this to order the statements within their category. A | ||||||
| 1292 | simple numeric sort is done on these values. | ||||||
| 1293 | |||||||
| 1294 | =item multiple | ||||||
| 1295 | |||||||
| 1296 | Indicates that the keyword can accept a list of values (or pairs of them | ||||||
| 1297 | if its type is pair). This only applies to types text, pair, and select. | ||||||
| 1298 | The others ignore it. See below for information about types. | ||||||
| 1299 | |||||||
| 1300 | =item repeatable | ||||||
| 1301 | |||||||
| 1302 | Indicates that the statement can be repeated. Currently only data | ||||||
| 1303 | statements may be repeated to any useful effect. To contrast, multiple | ||||||
| 1304 | means that the single statement can take many values in a comma separated | ||||||
| 1305 | list, while repeatable means that the keyword itself may be used many | ||||||
| 1306 | times each timw with one or more values. Again, only data statements | ||||||
| 1307 | are repeatble. | ||||||
| 1308 | |||||||
| 1309 | =item pair_labels | ||||||
| 1310 | |||||||
| 1311 | You probably want to use this key if your keyword's type is pair. | ||||||
| 1312 | A two element array reference with the labels to display over the two | ||||||
| 1313 | input columns of keywords whose type is pair. Example: | ||||||
| 1314 | |||||||
| 1315 | pair_labels => [ 'Name', 'Email Address' ], | ||||||
| 1316 | |||||||
| 1317 | =item pair_required | ||||||
| 1318 | |||||||
| 1319 | Required for keywords of type pair. | ||||||
| 1320 | |||||||
| 1321 | Use this key for all pair keywords. Make it true if a pair is always | ||||||
| 1322 | required for the keyword and false if items may have only the first half | ||||||
| 1323 | of a pair (like author pairs where the name is in the hash key position | ||||||
| 1324 | and the optional email address is in the value position). | ||||||
| 1325 | |||||||
| 1326 | Look for keywords of type pair for examples. | ||||||
| 1327 | |||||||
| 1328 | =item options | ||||||
| 1329 | |||||||
| 1330 | An array reference of hashes describing the options for the keyword. Use | ||||||
| 1331 | this only for keywords of type select. Example: | ||||||
| 1332 | |||||||
| 1333 | options => [ | ||||||
| 1334 | { label => 'User Sees This', value => 'internal_value' }, | ||||||
| 1335 | { label => 'Hourly', value => '24' }, | ||||||
| 1336 | ], | ||||||
| 1337 | |||||||
| 1338 | If you don't want a default, you should include a hash like this: | ||||||
| 1339 | |||||||
| 1340 | { label => '-- Choose One --', value => 'undefined' }, | ||||||
| 1341 | |||||||
| 1342 | The value 'undefined' is special to JavaScript. So, tentmaker will unset | ||||||
| 1343 | the value if you the user selects '-- Choose One --'. | ||||||
| 1344 | |||||||
| 1345 | =item quick_label | ||||||
| 1346 | |||||||
| 1347 | Only applies to field keywords. Indicates that this keyword should appear | ||||||
| 1348 | in the Field Quick Edit box in tentmaker. Fields appear there in | ||||||
| 1349 | the same order they appear in the full edit expanding box. That order | ||||||
| 1350 | is controlled by the sort_order (see below). | ||||||
| 1351 | |||||||
| 1352 | Quick editing does not allow pairs or multiples. You can set a quick_label | ||||||
| 1353 | for a multiple entry keyword, but the quick edit will only update the first | ||||||
| 1354 | one. If the user changes the one in the quick edit, only that one will be | ||||||
| 1355 | preserved. Pairs will not work in the quick edit box. | ||||||
| 1356 | |||||||
| 1357 | =item refresh | ||||||
| 1358 | |||||||
| 1359 | Unused and ignored. | ||||||
| 1360 | |||||||
| 1361 | This used to indicate that a field keyword update should trigger a full | ||||||
| 1362 | page refresh. There is now javascript support to update the DOM no | ||||||
| 1363 | matter what happens and it should stay that way. Temptation to set | ||||||
| 1364 | this flag indicates a lack of javascript courage. | ||||||
| 1365 | |||||||
| 1366 | =item urgency | ||||||
| 1367 | |||||||
| 1368 | Indicates how useful the keyword is. Most have urgency 0, they show | ||||||
| 1369 | up white on the screen. tentmaker currently understands these urgency values: | ||||||
| 1370 | |||||||
| 1371 | value screen color implied meaning | ||||||
| 1372 | ----------------------------------------------------------------- | ||||||
| 1373 | 10 red required by someone | ||||||
| 1374 | 5 yellow this or a related keyword is likely required | ||||||
| 1375 | 3 green many people use this regularly | ||||||
| 1376 | 1 blue-green many people use this at least occasionally | ||||||
| 1377 | 0 white less frequently used | ||||||
| 1378 | |||||||
| 1379 | Note that only values from the above list are understood by tentmaker. | ||||||
| 1380 | If you use other values, they will be treated as zero. | ||||||
| 1381 | |||||||
| 1382 | =item method_types | ||||||
| 1383 | |||||||
| 1384 | This tells tentmaker which method types understand a keyword. It is | ||||||
| 1385 | a hash. They key are individual method types. The values are 1. | ||||||
| 1386 | There is one special key 'all'. If it has a true value, then the keyword | ||||||
| 1387 | is available to all methods regardless of type. | ||||||
| 1388 | |||||||
| 1389 | =item field_type | ||||||
| 1390 | |||||||
| 1391 | Not yet used. Meant to tell tentmaker that a field keyword only applies | ||||||
| 1392 | to a certain html_form_type. | ||||||
| 1393 | |||||||
| 1394 | =item type | ||||||
| 1395 | |||||||
| 1396 | Essentially the tentmaker html form element for the keyword. | ||||||
| 1397 | Note that literal keywords do not need to set this key (and if they do, | ||||||
| 1398 | it will be ignored). They always get a textarea for their input. | ||||||
| 1399 | For other keyword levels choose from these input types (in order by | ||||||
| 1400 | utility): | ||||||
| 1401 | |||||||
| 1402 | =over 4 | ||||||
| 1403 | |||||||
| 1404 | =item text | ||||||
| 1405 | |||||||
| 1406 | This is the most common type. | ||||||
| 1407 | It tells tentmaker to use a text input box for the keyword. | ||||||
| 1408 | |||||||
| 1409 | =item boolean | ||||||
| 1410 | |||||||
| 1411 | Indicates that the value is either 1 or 0 and tells tentmaker to use | ||||||
| 1412 | a checkbox for the keyword. | ||||||
| 1413 | |||||||
| 1414 | =item pair | ||||||
| 1415 | |||||||
| 1416 | Indicates that the keyword admits either single values or pairs. | ||||||
| 1417 | A pair is two things separated by =>, like | ||||||
| 1418 | |||||||
| 1419 | name => `email@example.com` | ||||||
| 1420 | |||||||
| 1421 | You want to use the pair_labels and pair_required keys if you use this | ||||||
| 1422 | type, trust me. | ||||||
| 1423 | |||||||
| 1424 | =item textarea | ||||||
| 1425 | |||||||
| 1426 | Indicates that typical values for this keyword are large text blocks, | ||||||
| 1427 | so tentmaker should use a textarea for their input. | ||||||
| 1428 | |||||||
| 1429 | =item select | ||||||
| 1430 | |||||||
| 1431 | Indicates that only certain values are legal so tentmaker users should | ||||||
| 1432 | pick them from a list. You must use the options key with this type. | ||||||
| 1433 | You might also want to use the multiple key. | ||||||
| 1434 | |||||||
| 1435 | =item deprecated | ||||||
| 1436 | |||||||
| 1437 | Tells tentmaker not to show this keyword, which is usually an archaic | ||||||
| 1438 | spelling for a keyword. | ||||||
| 1439 | |||||||
| 1440 | =back | ||||||
| 1441 | |||||||
| 1442 | =back | ||||||
| 1443 | |||||||
| 1444 | =head2 KEYWORD LEVELS | ||||||
| 1445 | |||||||
| 1446 | There are several levels in the parse tree where keywords may appear. | ||||||
| 1447 | These are the levels: | ||||||
| 1448 | |||||||
| 1449 | =over 4 | ||||||
| 1450 | |||||||
| 1451 | =item config | ||||||
| 1452 | |||||||
| 1453 | Keywords in the bigtop level config block (where the backends are defined). | ||||||
| 1454 | |||||||
| 1455 | =item app | ||||||
| 1456 | |||||||
| 1457 | Keywords at the top level of the bigtop app block. | ||||||
| 1458 | |||||||
| 1459 | =item app_literal | ||||||
| 1460 | |||||||
| 1461 | The legal names of literal statements at the bigtop app block level. | ||||||
| 1462 | |||||||
| 1463 | =item table | ||||||
| 1464 | |||||||
| 1465 | Keywords at the top level of table blocks. | ||||||
| 1466 | |||||||
| 1467 | =item field | ||||||
| 1468 | |||||||
| 1469 | Keywords in field blocks (inside table blocks). | ||||||
| 1470 | |||||||
| 1471 | =item controller | ||||||
| 1472 | |||||||
| 1473 | Keywords at the top level of controller blocks. | ||||||
| 1474 | |||||||
| 1475 | =item controller_literal | ||||||
| 1476 | |||||||
| 1477 | The legal names of literal statements at the controller block level. | ||||||
| 1478 | |||||||
| 1479 | =item method | ||||||
| 1480 | |||||||
| 1481 | Keywords in method blocks (inside controller blocks). | ||||||
| 1482 | |||||||
| 1483 | =back | ||||||
| 1484 | |||||||
| 1485 | There are no other valid keyword locations in the current grammar. Adding | ||||||
| 1486 | new levels will require substantial change to the grammar, the parser, | ||||||
| 1487 | and all the backends. Thus, such changes are extremely unlikely (though | ||||||
| 1488 | some are in the back of my mind). | ||||||
| 1489 | |||||||
| 1490 | =head1 METHODS | ||||||
| 1491 | |||||||
| 1492 | There is only one method defined in this module. Use it as shown in | ||||||
| 1493 | the SYNOPSIS above. | ||||||
| 1494 | |||||||
| 1495 | =over 4 | ||||||
| 1496 | |||||||
| 1497 | =item get_docs_for | ||||||
| 1498 | |||||||
| 1499 | Parameters: | ||||||
| 1500 | |||||||
| 1501 | keyword_level | ||||||
| 1502 | list of keywords | ||||||
| 1503 | |||||||
| 1504 | Returns: | ||||||
| 1505 | |||||||
| 1506 | an array whose first element is the keyword_level and whose remaining | ||||||
| 1507 | elements are keyword hashes. | ||||||
| 1508 | This return is designed for direct passing to the add_valid_keywords | ||||||
| 1509 | method of Bigtop::Parser | ||||||
| 1510 | |||||||
| 1511 | =item get_full_doc_hash | ||||||
| 1512 | |||||||
| 1513 | Parameters: none | ||||||
| 1514 | |||||||
| 1515 | Returns: the entire internal hash representation of all the keywords. | ||||||
| 1516 | This is useful for automated tools, like C |
||||||
| 1517 | the vim syntax file. | ||||||
| 1518 | |||||||
| 1519 | =back | ||||||
| 1520 | |||||||
| 1521 | =head1 AUTHOR | ||||||
| 1522 | |||||||
| 1523 | Phil Crow E |
||||||
| 1524 | |||||||
| 1525 | =head1 COPYRIGHT and LICENSE | ||||||
| 1526 | |||||||
| 1527 | Copyright (C) 2006-7 by Phil Crow | ||||||
| 1528 | |||||||
| 1529 | This library is free software; you can redistribute it and/or modify | ||||||
| 1530 | it under the same terms as Perl itself, either Perl version 5.8.6 or, | ||||||
| 1531 | at your option, any later version of Perl 5 you may have available. | ||||||
| 1532 | |||||||
| 1533 | =cut | ||||||
| 1534 |