OSDN Git Service

w
authoryasushiito <yas@pen-chan.jp>
Sun, 22 Dec 2013 00:27:02 +0000 (09:27 +0900)
committeryasushiito <yas@pen-chan.jp>
Sun, 22 Dec 2013 00:27:02 +0000 (09:27 +0900)
15 files changed:
app/assets/javascripts/manifest/work/forms.js.coffee.erb
app/assets/javascripts/manifest/work/lists.js.coffee.erb
app/assets/javascripts/manifest/work/models.js.coffee.erb
app/assets/javascripts/manifest/work/system_resources.js.coffee.erb
app/helpers/application_helper.rb
app/views/layouts/system.html.erb
app/views/panels/_element_form.html.erb
app/views/panels/_form.html.erb
app/views/system/index.html.erb
config/environment.rb
lib/item.rb
lib/manifest/form.rb
lib/manifest/list.rb
lib/manifest/manifest.rb
public/manifest.json

index 0113b05..1ffef84 100644 (file)
 @forms = {\r
   Panel: 'panel',\r
   panel: {\r
-    attributes: {\r
+    fields: {\r
       caption: {\r
         column: 'caption',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       width: {\r
         column: 'width',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
         },\r
       },\r
       height: {\r
         column: 'height',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }, \r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          }, \r
+        },\r
+        row_break: true, \r
       },\r
       border: {\r
         column: 'border',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
         },\r
       },\r
       publish: {\r
         column: 'publish',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'magic_number',\r
-          key: 'comic_visible_items',\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'select',\r
+        },\r
+        row_break: true,\r
       },\r
       id: {\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       author_id: {\r
         column: 'author_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'caption',\r
       'width',\r
       'height',\r
   },\r
   PanelPicture: 'panel_picture',\r
   panel_picture: {\r
-    attributes: {\r
+    fields: {\r
       caption: {\r
         column: 'caption',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       x: {\r
         column: 'x',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       y: {\r
         column: 'y',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       width: {\r
         column: 'width',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
         },\r
         helpers: {\r
           size: {\r
             path: 'panels/size_helper',\r
             options: {\r
               class: 'panel_picture_width_tool', \r
-            }\r
-          }\r
+            },\r
+          },\r
         },\r
+        row_break: true,\r
       },\r
       height: {\r
         column: 'height',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }, \r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          }, \r
+        },\r
         helpers: {\r
           size: {\r
             path: 'panels/size_helper',\r
             options: {\r
               class: 'panel_picture_height_tool', \r
-            }\r
-          }\r
+            },\r
+          },\r
         },\r
+        row_break: true,\r
       },\r
       link: {\r
         column: 'link',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       id: {\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       panel_id: {\r
         column: 'panel_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       picture_id: {\r
         column: 'picture_id',\r
-        type: 'hidden',\r
         label: {\r
         },\r
+        field: {\r
+          type: 'hidden',\r
+        },\r
         helpers: {\r
           popup: {\r
             path: 'panels/popup_helper',\r
             source: 'pictures',\r
             options: {\r
-            }\r
-          }\r
-        }\r
-        options: {\r
-        }\r
+            },\r
+          },\r
+        },\r
       },\r
       z: {\r
         column: 'z',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       t: {\r
         column: 't',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'caption',\r
       'x',\r
       'y',\r
     ]\r
   },\r
   speech_balloon: {\r
-    attributes: {\r
+    fields: {\r
       'speech_balloon.id': {\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.panel_id': {\r
         column: 'panel_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.speech_balloon_template_id': {\r
         column: 'speech_balloon_template_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.caption': {\r
         column: 'caption',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       'speech_balloon.z': {\r
         column: 'z',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.t': {\r
         column: 't',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.classname': {\r
         column: 'classname',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech_balloon.settings': {\r
         column: 'settings',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'balloon.id': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'balloon.speech_balloon_id': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'speech_balloon_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'balloon.system_picture_id': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'system_picture_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'balloon.r': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'r',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
         },\r
         helpers: {\r
           tail_angle: {\r
             path: 'panels/tail_angle_helper',\r
             options: {\r
-            }\r
-          }\r
-        }\r
+            },\r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       'balloon.x': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'x',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       'balloon.y': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'y',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       'balloon.width': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'width',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       'balloon.height': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'height',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       'balloon.settings': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'settings',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.id': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.speech_balloon_id': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'speech_balloon_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.x': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'x',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.y': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'y',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.width': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'width',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.height': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'height',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       'speech.writing_format_id': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'writing_format_id',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'model',\r
-          model: 'writing_format',\r
-          method: 'enable_list',\r
-          caption: 'caption'\r
-        }\r
+        field: {\r
+          type: 'select',\r
+        },\r
       },\r
       'speech.font_size': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'font_size',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'magic_number',\r
-          key: 'speech_font_size_items',\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'select',\r
+        },\r
+        row_break: true,\r
       },\r
       'speech.text_align': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'text_align',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'magic_number',\r
-          key: 'speech_text_align_items',\r
-        }\r
+        field: {\r
+          type: 'select',\r
+        },\r
       },\r
       'speech.quotes': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'quotes',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'text',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       'speech.content': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'content',\r
-        type: 'text_area',\r
         label: {\r
-          row_break: true\r
+          row_break: true,\r
+        },\r
+        field: {\r
+          type: 'text_area',\r
+          options: {\r
+            size: '45x5', \r
+          },\r
         },\r
-        options: {\r
-          size: '45x5', \r
-        }\r
       },\r
       'speech.fore_color': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'fore_color',\r
-        type: 'hidden',\r
         label: {\r
-          row_break: true\r
+          row_break: true,\r
         },\r
-        options: {\r
+        field: {\r
+          type: 'hidden',\r
         },\r
         helpers: {\r
           color: {\r
             path: 'panels/color_helper',\r
             options: {\r
             },\r
-            wrapper: 'speech-fore_color-wrap'\r
-          }\r
-        }\r
+            wrapper: 'speech-fore_color-wrap',\r
+          },\r
+        },\r
       },\r
       'speech.settings': {\r
         model: 'speech',\r
         part: 'speech',\r
         column: 'settings',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
     },\r
   },\r
   CircleSpeechBalloon: 'circle_speech_balloon',\r
   circle_speech_balloon: {\r
     base: 'speech_balloon',\r
-    attributes: {\r
+    fields: {\r
     },\r
-    fields: [\r
-        'speech_balloon.caption',\r
-        'balloon.r',\r
-        'balloon.x',\r
-        'balloon.y',\r
-        'balloon.width',\r
-        'balloon.height',\r
-        'balloon.id',\r
-        'balloon.speech_balloon_id',\r
-        'balloon.system_picture_id',\r
-        'balloon.settings',\r
-        'speech.writing_format_id',\r
-        'speech.font_size',\r
-        'speech.text_align',\r
-        'speech.quotes',\r
-        'speech.content',\r
-        'speech.fore_color',\r
-        'speech.id',\r
-        'speech.speech_balloon_id',\r
-        'speech.x',\r
-        'speech.y',\r
-        'speech.width',\r
-        'speech.height',\r
-        'speech.settings',\r
-        'speech_balloon.id',\r
-        'speech_balloon.panel_id',\r
-        'speech_balloon.speech_balloon_template_id',\r
-        'speech_balloon.classname',\r
-        'speech_balloon.z',\r
-        'speech_balloon.t',\r
-        'speech_balloon.settings',\r
+    field_names: [\r
+      'speech_balloon.caption',\r
+      'balloon.r',\r
+      'balloon.x',\r
+      'balloon.y',\r
+      'balloon.width',\r
+      'balloon.height',\r
+      'balloon.id',\r
+      'balloon.speech_balloon_id',\r
+      'balloon.system_picture_id',\r
+      'balloon.settings',\r
+      'speech.writing_format_id',\r
+      'speech.font_size',\r
+      'speech.text_align',\r
+      'speech.quotes',\r
+      'speech.content',\r
+      'speech.fore_color',\r
+      'speech.id',\r
+      'speech.speech_balloon_id',\r
+      'speech.x',\r
+      'speech.y',\r
+      'speech.width',\r
+      'speech.height',\r
+      'speech.settings',\r
+      'speech_balloon.id',\r
+      'speech_balloon.panel_id',\r
+      'speech_balloon.speech_balloon_template_id',\r
+      'speech_balloon.classname',\r
+      'speech_balloon.z',\r
+      'speech_balloon.t',\r
+      'speech_balloon.settings',\r
     ]\r
   },\r
   PlainSpeechBalloon: 'plain_speech_balloon',\r
   plain_speech_balloon: {\r
     base: 'speech_balloon',\r
-    attributes: {\r
+    fields: {\r
       'balloon.r': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'r',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
         },\r
-        options: {\r
+        field: {\r
+          type: 'hidden',\r
         },\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'speech_balloon.caption',\r
       'balloon.r',\r
       'balloon.x',\r
   SquareSpeechBalloon: 'square_speech_balloon',\r
   square_speech_balloon: {\r
     base: 'speech_balloon',\r
-    attributes: {\r
+    fields: {\r
       'balloon.r': {\r
         model: 'balloon',\r
         part: 'balloon',\r
         column: 'r',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
         },\r
-        options: {\r
+        field: {\r
+          type: 'hidden',\r
         },\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'speech_balloon.caption',\r
       'balloon.r',\r
       'balloon.x',\r
   },\r
   GroundPicture: 'ground_picture',\r
   ground_picture: {\r
-    attributes: {\r
+    fields: {\r
       id: {\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       panel_id: {\r
         column: 'panel_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       picture_id: {\r
         column: 'picture_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       caption: {\r
         column: 'caption',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       repeat: {\r
         column: 'repeat',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'magic_number',\r
-          key: 'ground_picture_repeat_items',\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'select',\r
+          options: {\r
+            source: 'magic_number',\r
+            key: 'ground_picture_repeat_items',\r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       x: {\r
         column: 'x',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       y: {\r
         column: 'y',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
+        row_break: true,\r
       },\r
       z: {\r
         column: 'z',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       t: {\r
         column: 't',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'caption',\r
       'repeat',\r
       'x',\r
   },\r
   GroundColor: 'ground_color',\r
   ground_color: {\r
-    attributes: {\r
+    fields: {\r
       id: {\r
         column: 'id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       panel_id: {\r
         column: 'panel_id',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       caption: {\r
         column: 'caption',\r
-        type: 'text',\r
         label: {\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'text',\r
+        },\r
+        row_break: true,\r
       },\r
       code: {\r
         column: 'code',\r
-        type: 'hidden',\r
         label: {\r
-          row_break: true\r
+          row_break: true,\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-          row_break: true\r
-        }\r
         helpers: {\r
           color: {\r
             path: 'panels/color_helper',\r
             wrapper: 'ground_color-code-wrap'\r
           }\r
         },\r
+        row_break: true,\r
       },\r
       orientation: {\r
         column: 'orientation',\r
-        type: 'select',\r
         label: {\r
         },\r
-        options: {\r
-          source: 'magic_number',\r
-          key: 'ground_color_orientation_items',\r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'select',\r
+        },\r
+        row_break: true,\r
       },\r
       xy: {\r
         column: 'xy',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          },\r
+        },\r
       },\r
       wh: {\r
         column: 'wh',\r
-        type: 'number',\r
         label: {\r
         },\r
-        options: {\r
-          size: 5, \r
-          row_break: true\r
-        }\r
+        field: {\r
+          type: 'number',\r
+          options: {\r
+            size: 5, \r
+          }\r
+        },\r
+        row_break: true,\r
       },\r
       z: {\r
         column: 'z',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
       t: {\r
         column: 't',\r
-        type: 'hidden',\r
         label: {\r
-          type: 'hidden'\r
+          type: 'hidden',\r
+        },\r
+        field: {\r
+          type: 'hidden',\r
         },\r
-        options: {\r
-        }\r
       },\r
     },\r
-    fields: [\r
+    field_names: [\r
       'id',\r
       'panel_id',\r
       'caption',\r
index 6a325df..66cff9f 100644 (file)
       public_list: {\r
         type: 'public',\r
       },\r
+      select_items: {\r
+        type: 'system_resource',\r
+      },\r
       speech_balloons: {\r
         type: 'has_many',\r
         association_name: 'speech_balloons',\r
       public_list: {\r
         type: 'public',\r
       },\r
+      select_items: {\r
+        type: 'system_resource',\r
+      },\r
       speeches: {\r
         type: 'has_many',\r
         association_name: 'speeches',\r
       public_list: {\r
         type: 'public',\r
       },\r
+      select_items: {\r
+        type: 'system_resource',\r
+      },\r
       licenses: {\r
         type: 'has_many',\r
         association_name: 'licenses',\r
index 3c1f88f..981efb4 100644 (file)
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      list: {\r
-        name: 'public'\r
-      },\r
-      caption: {\r
-        type: 'column',\r
-        name: 'title'\r
-      },\r
-    },\r
   },\r
   ScrollPanel: 'scroll_panel',\r
   scroll_panel: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'title'\r
-      },\r
-    },\r
   },\r
   Story: 'story',\r
   story: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'method',\r
-        name: 'title_with_t',\r
-      },\r
-    },\r
   },\r
   StorySheet: 'story_sheet',\r
   story_sheet: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'caption'\r
-      },\r
-    },\r
   },\r
   SheetPanel: 'sheet_panel',\r
   sheet_panel: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'method',\r
-        name: 'plain_scenario',\r
-      },\r
-    },\r
   },\r
   PanelPicture: 'panel_picture',\r
   panel_picture: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'method',\r
-        name: 'plain_scenario',\r
-      },\r
-    },\r
   }, \r
   Balloon: 'balloon',\r
   balloon: {\r
         type: 'number',\r
         source: {\r
           type: 'model',\r
-          model: 'writing_format',\r
-          method: 'enable_list',\r
-          caption: 'caption'\r
+          key: 'writing_format_items',\r
         },\r
         rules : {\r
           required: true,\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'enable_list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'caption',\r
-      },\r
-    },\r
   },\r
   WritingFormat: 'writing_format',\r
   writing_format: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'enable_list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'caption',\r
-      },\r
-    },\r
   },\r
   LicenseGroup: 'license_group',\r
   license_group: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'caption',\r
-      },\r
-    },\r
   },\r
   License: 'license',\r
   license: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'name',\r
-      },\r
-    },\r
   },\r
   Artist: 'artist',\r
   artist: {\r
         type: 'datetime',\r
       }\r
     },\r
-    select: {\r
-      method: 'list',\r
-      caption: {\r
-        type: 'column',\r
-        name: 'name',\r
-      },\r
-    },\r
   },\r
   SystemPicture: 'system_picture',\r
   system_picture: {\r
index 0cd4333..1fe57fb 100644 (file)
   ], \r
 }\r
 @select_items = {\r
-  provider_status_status_items: [\r
-    ['select_items.provider_status.status.waiting', 0], \r
-    ['select_items.provider_status.status.receiving', 1], \r
-  ],\r
-  demander_status_status_items: [\r
-    ['select_items.demander_status.status.waiting', 0], \r
-    ['select_items.demander_status.status.rejected', 1], \r
-    ['select_items.demander_status.status.requesting', 2], \r
-    ['select_items.demander_status.status.approved', 3], \r
-  ],\r
-  scroll_visible_items: [\r
-    ['select_items.scroll.visible.private', 0], \r
-    ['select_items.scroll.visible.public', 1], \r
-  ],\r
-  comic_visible_items: [\r
-    ['select_items.comic.visible.private', 0], \r
-    ['select_items.comic.visible.public', 1], \r
-  ],\r
-  story_visible_items: [\r
-    ['select_items.story.visible.private', 0], \r
-    ['select_items.story.visible.public', 1], \r
-  ],\r
-  sheet_visible_items: [\r
-    ['select_items.sheet.visible.private', 0], \r
-    ['select_items.sheet.visible.public', 1], \r
-  ],\r
-  panel_visible_items: [\r
-    ['select_items.panel.visible.private', 0], \r
-    ['select_items.panel.visible.public', 1], \r
-  ],\r
-  ground_picture_repeat_items: [\r
-    ['select_items.ground_pictures.repeat.repeat', 0], \r
-    ['select_items.ground_pictures.repeat.repeat-x', 1], \r
-    ['select_items.ground_pictures.repeat.repeat-y', 2], \r
-    ['select_items.ground_pictures.repeat.no-repeat', 3], \r
-  ],\r
-  ground_color_orientation_items: [\r
-    ['select_items.ground_color.orientation.horizontal', 0], \r
-    ['select_items.ground_color.orientation.vertical', 1], \r
-  ],\r
-  speech_font_size_items: [\r
-    ['select_items.speeches.font_size.ultra_small', 0.2], \r
-    ['select_items.speeches.font_size.very_small', 0.4], \r
-    ['select_items.speeches.font_size.small', 0.6], \r
-    ['select_items.speeches.font_size.semi_small', 0.8], \r
-    ['select_items.speeches.font_size.normal', 1.0], \r
-    ['select_items.speeches.font_size.semi_large', 1.5], \r
-    ['select_items.speeches.font_size.large', 2.0], \r
-    ['select_items.speeches.font_size.very_large', 3.5], \r
-    ['select_items.speeches.font_size.ultra_large', 5.0], \r
-  ],\r
-  speech_text_align_items: [\r
-    ['select_items.speeches.text_align.none', 0], \r
-    ['select_items.speeches.text_align.left', 1], \r
-    ['select_items.speeches.text_align.right', 2], \r
-    ['select_items.speeches.text_align.center', 3], \r
-  ],\r
+  model_loader: {\r
+    writing_format_items: {\r
+      model: 'writing_format',\r
+      list_name: 'select_items',\r
+      caption: 'caption'\r
+    },\r
+    license_group_items: {\r
+      model: 'license_group',\r
+      list_name: 'select_items',\r
+      caption: 'caption'\r
+    },\r
+    speech_balloon_template_items: {\r
+      model: 'speech_balloon_template',\r
+      list_name: 'select_items',\r
+      caption: 'caption'\r
+    },\r
+  },\r
+  magic_number: {\r
+    provider_status_status_items: [\r
+      ['select_items.provider_status.status.waiting', 0], \r
+      ['select_items.provider_status.status.receiving', 1], \r
+    ],\r
+    demander_status_status_items: [\r
+      ['select_items.demander_status.status.waiting', 0], \r
+      ['select_items.demander_status.status.rejected', 1], \r
+      ['select_items.demander_status.status.requesting', 2], \r
+      ['select_items.demander_status.status.approved', 3], \r
+    ],\r
+    scroll_visible_items: [\r
+      ['select_items.scroll.visible.private', 0], \r
+      ['select_items.scroll.visible.public', 1], \r
+    ],\r
+    comic_visible_items: [\r
+      ['select_items.comic.visible.private', 0], \r
+      ['select_items.comic.visible.public', 1], \r
+    ],\r
+    story_visible_items: [\r
+      ['select_items.story.visible.private', 0], \r
+      ['select_items.story.visible.public', 1], \r
+    ],\r
+    sheet_visible_items: [\r
+      ['select_items.sheet.visible.private', 0], \r
+      ['select_items.sheet.visible.public', 1], \r
+    ],\r
+    panel_visible_items: [\r
+      ['select_items.panel.visible.private', 0], \r
+      ['select_items.panel.visible.public', 1], \r
+    ],\r
+    ground_picture_repeat_items: [\r
+      ['select_items.ground_pictures.repeat.repeat', 0], \r
+      ['select_items.ground_pictures.repeat.repeat-x', 1], \r
+      ['select_items.ground_pictures.repeat.repeat-y', 2], \r
+      ['select_items.ground_pictures.repeat.no-repeat', 3], \r
+    ],\r
+    ground_color_orientation_items: [\r
+      ['select_items.ground_color.orientation.horizontal', 0], \r
+      ['select_items.ground_color.orientation.vertical', 1], \r
+    ],\r
+    speech_font_size_items: [\r
+      ['select_items.speeches.font_size.ultra_small', 0.2], \r
+      ['select_items.speeches.font_size.very_small', 0.4], \r
+      ['select_items.speeches.font_size.small', 0.6], \r
+      ['select_items.speeches.font_size.semi_small', 0.8], \r
+      ['select_items.speeches.font_size.normal', 1.0], \r
+      ['select_items.speeches.font_size.semi_large', 1.5], \r
+      ['select_items.speeches.font_size.large', 2.0], \r
+      ['select_items.speeches.font_size.very_large', 3.5], \r
+      ['select_items.speeches.font_size.ultra_large', 5.0], \r
+    ],\r
+    speech_text_align_items: [\r
+      ['select_items.speeches.text_align.none', 0], \r
+      ['select_items.speeches.text_align.left', 1], \r
+      ['select_items.speeches.text_align.right', 2], \r
+      ['select_items.speeches.text_align.center', 3], \r
+    ],\r
+  },\r
 }\r
index 007d3ac..10fc051 100644 (file)
@@ -25,7 +25,7 @@ module ApplicationHelper
   end
   
   def t_selected_item(name, index)
-    t(MagicNumber[name][index][0])
+    t(manifest.select_items['magic_number'][name][index][0])
   end
   
   def item_tag 
index 9937819..4bec89d 100644 (file)
@@ -2,8 +2,9 @@
 <html>
 <head>
   <title><%= h(MagicNumber['profile']['admins']['caption']) %></title>
-  <%= stylesheet_link_tag "test.css" %>
+  <%= stylesheet_link_tag "application" %>
   <%= javascript_include_tag "application" %>
+  <%= raw panel_editor_javascript_include_tags %>
   <%= csrf_meta_tags %>
 </head>
 <body>
index dfc8d5d..150ada6 100644 (file)
@@ -1,75 +1,16 @@
-<% element_name = elm.element_name %>
-<% extend_element_name = elm.extend_element_name %>
-<% form_configurations = Pettanr::Application::manifest.profiler_managers[extend_element_name] %>
-<% base_attributes = if form_configurations['base'] %>
-  <% @configurations['forms'][form_configurations['base']]['attributes'] %>
-<% else %>
-  <% {} %>
-<% end %>
-<% extend_attributes = form_configurations['attributes'] || {} %>
-<% form_attributes = base_attributes.merge(extend_attributes) %>
-<% form_model_name = form_configurations['model'] || form_configurations['base'] || element_name %>
-<%= form_for(elm, :html => elm.tag_attributes('form', 'data-form-name' => extend_element_name)) do |f| %>
-  <% form_configurations['fields'].each do |field_name| %>
-    <% field_configurations = form_attributes[field_name] || {} %>
-    <% field_model_name = field_configurations['model'] || form_model_name %>
-    <% model_configurations =  @configurations['models'][field_model_name] %>
-    <% column = field_configurations['column'] %>
-    <% model_configurations['attributes'] %>
-    <% primary_key = model_configurations['attributes'][column]['primary_key'] %>
-    
-    <% next if primary_key and elm.new_record? %>
-    
-    <% options = field_configurations['options'] || {} %>
-    <% opt = {} %>
-    <% opt.merge!('data-model' => field_model_name) %>
-    <% field_element = if field_configurations['part'] %>
-      <% elm.__send__ field_configurations['part'] %>
-    <% else %>
-      <% elm %>
-    <% end %>
-    <% name = if field_configurations['part'] %>
-      <% form_model_name + '[' + field_model_name + '_attributes][' + column + ']' %>
-    <% else %>
-      <% form_model_name + '[' + column + ']' %>
-    <% end %>
+<%= form_for(element, :html => element.tag_attributes('form', 'data-form-name' => element.form_name)) do |f| %>
+  <% form.each_field do |field| %>
     <div class="field">
-      <% label = field_configurations['label'] || {}  %>
-      <% if label['type'] and label['type'] == 'hidden' %>
-      <% else %>
-        <%= t 'activerecord.attributes.' + field_model_name + '.' +  column %>
+      <% if field.label? %>
+        <%= field.label %>
       <% end %>
-      <% if label['row_break'] %>
+      <% if field.label_break? %>
         <br>
       <% end %>
-      <% case field_configurations['type'] %>
-      <% when 'text' %>
-        <% opt['size'] = field_configurations['options']['size'] if field_configurations['options']['size'] %>
-        <%= text_field_tag name, field_element.attributes[column], field_element.field_tag_attributes(column, no_attr, opt) %>
-      <% when 'text_area' %>
-        <% opt['size'] = field_configurations['options']['size'] if field_configurations['options']['size'] %>
-        <%= text_area_tag name, field_element.attributes[column], field_element.field_tag_attributes(column, no_attr, opt) %>
-      <% when 'number' %>
-        <% opt['size'] = field_configurations['options']['size'] if field_configurations['options']['size'] %>
-        <%= number_field_tag name, field_element.attributes[column], field_element.field_tag_attributes(column, no_attr, opt) %>
-      <% when 'hidden' %>
-        <%= hidden_field_tag name, field_element.attributes[column], field_element.field_tag_attributes(column, no_attr, opt) %>
-      <% when 'select' %>
-        <% items = case options['source'] %>
-        <% when 'model' %>
-          <% select_model = options['model'] %>
-          <% select_class = @configurations['models'][select_model]['class_name'] %>
-          <% l = select_class.constantize.__send__ options['method'] %>
-          <% l.map {|i| [i.attributes[options['caption']], i.id] } %>
-        <% when 'magic_number' %>
-          <% t_select_items(MagicNumber[options['key']]) %>
-        <% else %>
-        <% end %>
-        <%= select_tag name, options_for_select(items, field_element.attributes[column]), field_element.field_tag_attributes(column, no_attr, opt) %>
-      <% end %>
-      <% if field_configurations['helpers'] %>
+      <%= field.field.render self %>
+      <% if field.has_helper? %>
         <span id="<%= elm.tag_id 'helpers' -%>">
-          <% field_configurations['helpers'].each do |n, helper| %>
+          <% field.each_helper do |n, helper| %>
             <% if helper['wrapper'] %>
               <div class="<%= helper['wrapper'] -%>">
             <% end %>
@@ -81,9 +22,8 @@
         </span>
       <% end %>
     </div>
-    <% if options['row_break'] %>
-      <div class="row_break">
-      </div>
+    <% if field.row_break? %>
+      <div class="row_break"></div>
     <% end %>
   <% end %>
 <% end %>
index 4496d4f..6831233 100644 (file)
@@ -56,7 +56,9 @@
       <% @panel.panel_elements.each do |elm| %>
         <div <%= raw elm.tag_attr(:tab_panel) -%>>
           <div id="elements-tabs-<%= elm.t -%>">
-            <%= render 'element_form', :elm => elm, :no_attr => 0 %>
+            <% form_manager = Pettanr::Application::manifest.form_managers[element.form_name] %>
+            <% form = form_manager.open element, @operators, mounted %>
+            <%= render 'element_form', :elm => elm, :mounted => 0 %>
             <%= hidden_field_tag '_destroy', '', elm.field_tag_attributes(:_destroy, 0) %>
           </div>
         </div>
     </div>
   <% end %>
 </div>
-  <%= text_area_tag "json", '', :id => 'pettanr-configurations' %>
-  <%# %>
 <div <%= raw @panel.tag_attr('popup') -%> style="display: none;" >
 </div>
index 779d5f1..a61db68 100644 (file)
@@ -20,3 +20,4 @@
 <div>
 システム画像の管理
 </div>
+  <%= text_area_tag "json", '', :id => 'pettanr-configurations' %>
index 7cceeb6..ef29c07 100644 (file)
@@ -17,3 +17,4 @@ require 'element'
 require 'element_part'
 # Initialize the rails application
 Pettanr::Application.initialize!
+Pettanr::Application.manifest.init
index 5e4aa45..88663b2 100644 (file)
@@ -84,6 +84,18 @@ class Pettanr::Item < ActiveRecord::Base
     self.class.item_name
   end
   
+  def extend_column
+    nil
+  end
+  
+  def extend_item_name
+    self.extend_column ? self.attributes[self.extend_column] : self.item_name
+  end
+  
+  def form_name
+    self.extend_item_name
+  end
+  
   def valid_encode
     self.class.valid_encode_columns.each do |a|
       next if attributes[a] == nil
index 74bd865..a499c83 100644 (file)
 module Pettanr
   class FormManager
     class Form
+      class Field
+        class Text
+          def initialize conf, field
+            @conf = conf
+            @field = field
+          end
+          
+          def tag_options
+            opt = @field.tag_options.merge(@conf['options'])
+            @field.element.field_tag_attributes(self.column, self.mounted, opt)
+          end
+          
+          def render view
+            view.text_field_tag @field.tag_name, @field.tag_value, self.tag_options
+          end
+          
+        end
+        
+        class TextArea < Text
+          def render view
+            view.text_area_tag @field.tag_name, @field.tag_value, self.tag_options
+          end
+          
+        end
+        
+        class Number < Text
+          def render view
+            view.number_field_tag @field.tag_name, @field.tag_value, self.tag_options
+          end
+          
+        end
+        
+        class Hidden < Text
+          def render view
+            view.hidden_field_tag @field.tag_name, @field.tag_value, self.tag_options
+          end
+          
+        end
+        
+        class Select
+          def initialize conf, field
+            @conf = conf
+            @field = field
+            @model = Pettanr::Application::manifest.model(@field.model_name)
+            @source_conf = @model.attributes[@field.column]['source']
+          end
+          
+          def items
+            Pettanr::Application::manifest.select_items[@source_conf['model']][@source_conf['key']]
+          end
+          
+          def render view
+            view.select_tag @field.tag_name, options_for_select(items, @field.tag_value), self.tag_options
+          end
+          
+        end
+        
+        attr :part, :column, :type, :mounted, :model_name, :tag_options
+        @@type = {
+          'text' => Text, 'text_area' => TextArea, 'number' => Number, 
+          'hidden' => Hidden, 'select' => Select
+        }
+        def initialize form, mounted, conf, manifest
+          @form = form
+          @mounted = mounted
+          @conf = conf
+          @manifest = manifest
+          
+          @model_name = @conf['model'] || @form.model_name
+          @part = @conf['part']
+          @column = @conf['column']
+          @label_conf = @conf['label'] || {}
+          @field_conf = @conf['field']
+          @tag_options = {'data-model' => @model_name}
+          
+          @model_manifest =  @manifest.model(@model_name)
+          model_attribute_conf =  @model_manifest.attributes[self.column] || {}
+          @primary_key = model_attribute_conf['primary_key']
+        end
+        
+        def element
+          @element ||= if self.part?
+            @form.element.__send__ self.part
+          else
+            @form.element
+          end
+        end
+        
+        def part?
+          self.part != nil
+        end
+        
+        def ignore_field?
+          @primary_key and self.element.new_record?
+        end
+        
+        def label?
+          @label['type'] == nil or @label['type'] != 'hidden'
+        end
+        
+        def label view
+          view.t 'activerecord.attributes.' + field_model_name + '.' +  column
+        end
+        
+        def label_break?
+          @label['row_break'] == true
+        end
+        
+        def tag_name
+          if self.part?
+            self.form.model_name + '[' + self.model_name + '_attributes][' + self.column + ']'
+          else
+            self.form.model_name + '[' + self.column + ']'
+          end
+        end
+        
+        def tag_value
+          self.element.attributes[self.column]
+        end
+        
+        def field
+          @field ||= @@type[@field_conf['type']].new @field_conf, self
+        end
+        
+        def has_helper?
+        end
+        
+        def helpers
+        end
+        
+        def row_break?
+          @conf['row_break'] == true
+        end
+        
+      end
+      
+      attr :element, :mounted, :attributes, :fields, :model_name
+      def initialize element, operators, mounted, manifest
+        @manifest = manifest
+        @mounted = mounted
+        
+        @base = @manifest.base
+        
+        base_field_confs = if @base
+          base_form = Pettanr::Application::manifest.form_managers[@base]
+          base_form.fields
+        else
+          {}
+        end
+        extend_field_confs = @manifest.fields
+        @field_confs = base_field_confs.merge(extend_field_confs)
+        @fields = @manifest.field_names.map do |field_name|
+          field_conf = @field_confs[field_name]
+          Field.new self, @mounted, field_conf, manifest
+        end
+        @model_name = @manifest['model'] || @base || element.model_name
+      end
+      
+      def each_field
+        @fields.each do |field|
+          next if field.ignore_field?
+          yield field
+        end
+      end
+      
     end
     
-    attr :form_manifest, :item_name, :manifest, :form_conf
+    attr :form_manifest, :item_name, :manifest, :form_conf
     def initialize form_manifest
       @form_manifest = form_manifest
       @item_name = @form_manifest.item_name
       @manifest = @form_manifest.manifest
       @form_conf = @form_manifest.conf
-      attributes = @form_manifest.conf
       
     end
     
-    def attributes
-    end
-    
-    def open list_name, item, operators
-      Form.new item_name, item, operators, @manifest
+    def open element, operators, mounted
+      Form.new element, operators, mounted, @form_manifest
     end
     
   end
index 59c0dfd..29839e0 100644 (file)
@@ -90,6 +90,13 @@ module Pettanr
       end
     end
     
+    class SystemResourceList < BaseList
+      def items
+        @model.enable_list
+      end
+      
+    end
+    
     class HasManyList < BaseList
       def initialize page, page_size, operators, item_name, list_name, conf, manifest
         super
@@ -189,7 +196,7 @@ module Pettanr
     end
     
     @@types = {
-      'public' => PublicList, 'private' => PrivateList, 
+      'public' => PublicList, 'private' => PrivateList, 'system_resource' => SystemResourceList,
       'has_many' => HasManyList, 'filter' => FilterList, 
       'through_filter' => ThroughFilterList, 'element_filter' => ElementFilterList
     }
index b13d961..8ba98cf 100644 (file)
@@ -93,14 +93,14 @@ module Pettanr
     end
     
     class Form
-      attr :item_name, :conf, :manifest, :icon, :symbol, :caption, :summary, :date, :edit
+      attr :item_name, :conf, :manifest, :base, :fields, :field_names
       def initialize item_name, conf, manifest
         @item_name = item_name
         @conf = conf || {}
         @manifest = manifest
-      end
-      
-      def attributes
+        @base = @conf['base']
+        @fields = @conf['fields'] || {}
+        @field_names = @conf['field_names'] || []
       end
       
     end
@@ -145,9 +145,21 @@ module Pettanr
         @filers[item_name] = Filer.new item_name, filer_conf, self
         @filer_managers[item_name] = Pettanr::FilerManager.new @filers[item_name]
       }
-      (@locals['forms'] || {}).each {|item_name, form_conf|
-        @forms[item_name] = Form.new item_name, form_conf, self
-        @form_managers[item_name] = Pettanr::FormManager.new @forms[item_name]
+      (@locals['forms'] || {}).each {|form_name, form_conf|
+        @forms[form_name] = Form.new form_name, form_conf, self
+        @form_managers[form_name] = Pettanr::FormManager.new @forms[form_name]
+      }
+    end
+    
+    def init
+      select_items_loader
+    end
+    
+    def select_items_loader
+      (@select_items['model_loader'] || {}).each {|name, conf|
+        list = Pettanr::Application::manifest.list_managers[conf['model']].open conf['list_name'], nil, nil, nil
+        @select_items['model'] ||= {}
+        @select_items['model'][name] = list.items.map {|item| [item.caption, item.id]}
       }
     end
     
@@ -171,8 +183,8 @@ module Pettanr
       @filers[item_name] || @filers[item_name.tableize]
     end
     
-    def form item_name
-      @forms[item_name] || @forms[item_name.tableize]
+    def form form_name
+      @forms[form_name] || @forms[form_name.tableize]
     end
     
   end
index 7cf7b8e..6efe81e 100644 (file)
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "list": {\r
-          "name": "public"\r
-        },\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "title"\r
-        }\r
       }\r
     },\r
     "ScrollPanel": "scroll_panel",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "title"\r
-        }\r
       }\r
     },\r
     "Story": "story",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "method",\r
-          "name": "title_with_t"\r
-        }\r
       }\r
     },\r
     "StorySheet": "story_sheet",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "caption"\r
-        }\r
       }\r
     },\r
     "SheetPanel": "sheet_panel",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "method",\r
-          "name": "plain_scenario"\r
-        }\r
       }\r
     },\r
     "PanelPicture": "panel_picture",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "method",\r
-          "name": "plain_scenario"\r
-        }\r
       }\r
     },\r
     "Balloon": "balloon",\r
           "type": "number",\r
           "source": {\r
             "type": "model",\r
-            "model": "writing_format",\r
-            "method": "enable_list",\r
-            "caption": "caption"\r
+            "key": "writing_format_items"\r
           },\r
           "rules": {\r
             "required": true,\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "enable_list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "caption"\r
-        }\r
       }\r
     },\r
     "WritingFormat": "writing_format",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "enable_list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "caption"\r
-        }\r
       }\r
     },\r
     "LicenseGroup": "license_group",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "caption"\r
-        }\r
       }\r
     },\r
     "License": "license",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "name"\r
-        }\r
       }\r
     },\r
     "Artist": "artist",\r
         "updated_at": {\r
           "type": "datetime"\r
         }\r
-      },\r
-      "select": {\r
-        "method": "list",\r
-        "caption": {\r
-          "type": "column",\r
-          "name": "name"\r
-        }\r
       }\r
     },\r
     "SystemPicture": "system_picture",\r
         "public_list": {\r
           "type": "public"\r
         },\r
+        "select_items": {\r
+          "type": "system_resource"\r
+        },\r
         "speech_balloons": {\r
           "type": "has_many",\r
           "association_name": "speech_balloons"\r
         "public_list": {\r
           "type": "public"\r
         },\r
+        "select_items": {\r
+          "type": "system_resource"\r
+        },\r
         "speeches": {\r
           "type": "has_many",\r
           "association_name": "speeches"\r
         "public_list": {\r
           "type": "public"\r
         },\r
+        "select_items": {\r
+          "type": "system_resource"\r
+        },\r
         "licenses": {\r
           "type": "has_many",\r
           "association_name": "licenses"\r
     ]\r
   },\r
   "select_items": {\r
-    "provider_status_status_items": [\r
-      [\r
-        "select_items.provider_status.status.waiting",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.provider_status.status.receiving",\r
-        1\r
-      ]\r
-    ],\r
-    "demander_status_status_items": [\r
-      [\r
-        "select_items.demander_status.status.waiting",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.demander_status.status.rejected",\r
-        1\r
-      ],\r
-      [\r
-        "select_items.demander_status.status.requesting",\r
-        2\r
-      ],\r
-      [\r
-        "select_items.demander_status.status.approved",\r
-        3\r
-      ]\r
-    ],\r
-    "scroll_visible_items": [\r
-      [\r
-        "select_items.scroll.visible.private",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.scroll.visible.public",\r
-        1\r
-      ]\r
-    ],\r
-    "comic_visible_items": [\r
-      [\r
-        "select_items.comic.visible.private",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.comic.visible.public",\r
-        1\r
-      ]\r
-    ],\r
-    "story_visible_items": [\r
-      [\r
-        "select_items.story.visible.private",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.story.visible.public",\r
-        1\r
-      ]\r
-    ],\r
-    "sheet_visible_items": [\r
-      [\r
-        "select_items.sheet.visible.private",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.sheet.visible.public",\r
-        1\r
-      ]\r
-    ],\r
-    "panel_visible_items": [\r
-      [\r
-        "select_items.panel.visible.private",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.panel.visible.public",\r
-        1\r
-      ]\r
-    ],\r
-    "ground_picture_repeat_items": [\r
-      [\r
-        "select_items.ground_pictures.repeat.repeat",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.ground_pictures.repeat.repeat-x",\r
-        1\r
-      ],\r
-      [\r
-        "select_items.ground_pictures.repeat.repeat-y",\r
-        2\r
-      ],\r
-      [\r
-        "select_items.ground_pictures.repeat.no-repeat",\r
-        3\r
-      ]\r
-    ],\r
-    "ground_color_orientation_items": [\r
-      [\r
-        "select_items.ground_color.orientation.horizontal",\r
-        0\r
-      ],\r
-      [\r
-        "select_items.ground_color.orientation.vertical",\r
-        1\r
-      ]\r
-    ],\r
-    "speech_font_size_items": [\r
-      [\r
-        "select_items.speeches.font_size.ultra_small",\r
-        0.2\r
-      ],\r
-      [\r
-        "select_items.speeches.font_size.very_small",\r
-        0.4\r
+    "model_loader": {\r
+      "writing_format_items": {\r
+        "model": "writing_format",\r
+        "list_name": "select_items",\r
+        "caption": "caption"\r
+      },\r
+      "license_group_items": {\r
+        "model": "license_group",\r
+        "list_name": "select_items",\r
+        "caption": "caption"\r
+      },\r
+      "speech_balloon_template_items": {\r
+        "model": "speech_balloon_template",\r
+        "list_name": "select_items",\r
+        "caption": "caption"\r
+      }\r
+    },\r
+    "magic_number": {\r
+      "provider_status_status_items": [\r
+        [\r
+          "select_items.provider_status.status.waiting",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.provider_status.status.receiving",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.small",\r
-        0.6\r
+      "demander_status_status_items": [\r
+        [\r
+          "select_items.demander_status.status.waiting",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.demander_status.status.rejected",\r
+          1\r
+        ],\r
+        [\r
+          "select_items.demander_status.status.requesting",\r
+          2\r
+        ],\r
+        [\r
+          "select_items.demander_status.status.approved",\r
+          3\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.semi_small",\r
-        0.8\r
+      "scroll_visible_items": [\r
+        [\r
+          "select_items.scroll.visible.private",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.scroll.visible.public",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.normal",\r
-        1\r
+      "comic_visible_items": [\r
+        [\r
+          "select_items.comic.visible.private",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.comic.visible.public",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.semi_large",\r
-        1.5\r
+      "story_visible_items": [\r
+        [\r
+          "select_items.story.visible.private",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.story.visible.public",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.large",\r
-        2\r
+      "sheet_visible_items": [\r
+        [\r
+          "select_items.sheet.visible.private",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.sheet.visible.public",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.very_large",\r
-        3.5\r
+      "panel_visible_items": [\r
+        [\r
+          "select_items.panel.visible.private",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.panel.visible.public",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.font_size.ultra_large",\r
-        5\r
-      ]\r
-    ],\r
-    "speech_text_align_items": [\r
-      [\r
-        "select_items.speeches.text_align.none",\r
-        0\r
+      "ground_picture_repeat_items": [\r
+        [\r
+          "select_items.ground_pictures.repeat.repeat",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.ground_pictures.repeat.repeat-x",\r
+          1\r
+        ],\r
+        [\r
+          "select_items.ground_pictures.repeat.repeat-y",\r
+          2\r
+        ],\r
+        [\r
+          "select_items.ground_pictures.repeat.no-repeat",\r
+          3\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.text_align.left",\r
-        1\r
+      "ground_color_orientation_items": [\r
+        [\r
+          "select_items.ground_color.orientation.horizontal",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.ground_color.orientation.vertical",\r
+          1\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.text_align.right",\r
-        2\r
+      "speech_font_size_items": [\r
+        [\r
+          "select_items.speeches.font_size.ultra_small",\r
+          0.2\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.very_small",\r
+          0.4\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.small",\r
+          0.6\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.semi_small",\r
+          0.8\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.normal",\r
+          1\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.semi_large",\r
+          1.5\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.large",\r
+          2\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.very_large",\r
+          3.5\r
+        ],\r
+        [\r
+          "select_items.speeches.font_size.ultra_large",\r
+          5\r
+        ]\r
       ],\r
-      [\r
-        "select_items.speeches.text_align.center",\r
-        3\r
+      "speech_text_align_items": [\r
+        [\r
+          "select_items.speeches.text_align.none",\r
+          0\r
+        ],\r
+        [\r
+          "select_items.speeches.text_align.left",\r
+          1\r
+        ],\r
+        [\r
+          "select_items.speeches.text_align.right",\r
+          2\r
+        ],\r
+        [\r
+          "select_items.speeches.text_align.center",\r
+          3\r
+        ]\r
       ]\r
-    ]\r
+    }\r
   },\r
   "locals": {\r
     "profilers": {\r
     "forms": {\r
       "Panel": "panel",\r
       "panel": {\r
-        "attributes": {\r
+        "fields": {\r
           "caption": {\r
             "column": "caption",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "width": {\r
             "column": "width",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "height": {\r
             "column": "height",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "border": {\r
             "column": "border",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "publish": {\r
             "column": "publish",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "magic_number",\r
-              "key": "comic_visible_items",\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "select"\r
+            },\r
+            "row_break": true\r
           },\r
           "id": {\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "author_id": {\r
             "column": "author_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "caption",\r
           "width",\r
           "height",\r
       },\r
       "PanelPicture": "panel_picture",\r
       "panel_picture": {\r
-        "attributes": {\r
+        "fields": {\r
           "caption": {\r
             "column": "caption",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "x": {\r
             "column": "x",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "y": {\r
             "column": "y",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "width": {\r
             "column": "width",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             },\r
             "helpers": {\r
               "size": {\r
                   "class": "panel_picture_width_tool"\r
                 }\r
               }\r
-            }\r
+            },\r
+            "row_break": true\r
           },\r
           "height": {\r
             "column": "height",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             },\r
             "helpers": {\r
               "size": {\r
                   "class": "panel_picture_height_tool"\r
                 }\r
               }\r
-            }\r
+            },\r
+            "row_break": true\r
           },\r
           "link": {\r
             "column": "link",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "id": {\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "panel_id": {\r
             "column": "panel_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "picture_id": {\r
             "column": "picture_id",\r
-            "type": "hidden",\r
             "label": {},\r
+            "field": {\r
+              "type": "hidden"\r
+            },\r
             "helpers": {\r
               "popup": {\r
                 "path": "panels/popup_helper",\r
                 "source": "pictures",\r
                 "options": {}\r
               }\r
-            },\r
-            "options": {}\r
+            }\r
           },\r
           "z": {\r
             "column": "z",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "t": {\r
             "column": "t",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "caption",\r
           "x",\r
           "y",\r
         ]\r
       },\r
       "speech_balloon": {\r
-        "attributes": {\r
+        "fields": {\r
           "speech_balloon.id": {\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.panel_id": {\r
             "column": "panel_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.speech_balloon_template_id": {\r
             "column": "speech_balloon_template_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.caption": {\r
             "column": "caption",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "speech_balloon.z": {\r
             "column": "z",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.t": {\r
             "column": "t",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.classname": {\r
             "column": "classname",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech_balloon.settings": {\r
             "column": "settings",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "balloon.id": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "balloon.speech_balloon_id": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "speech_balloon_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "balloon.system_picture_id": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "system_picture_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "balloon.r": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "r",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             },\r
             "helpers": {\r
               "tail_angle": {\r
                 "path": "panels/tail_angle_helper",\r
                 "options": {}\r
               }\r
-            }\r
+            },\r
+            "row_break": true\r
           },\r
           "balloon.x": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "x",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "balloon.y": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "y",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "balloon.width": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "width",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "balloon.height": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "height",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "balloon.settings": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "settings",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.id": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.speech_balloon_id": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "speech_balloon_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.x": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "x",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.y": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "y",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.width": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "width",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.height": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "height",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "speech.writing_format_id": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "writing_format_id",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "model",\r
-              "model": "writing_format",\r
-              "method": "enable_list",\r
-              "caption": "caption"\r
+            "field": {\r
+              "type": "select"\r
             }\r
           },\r
           "speech.font_size": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "font_size",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "magic_number",\r
-              "key": "speech_font_size_items",\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "select"\r
+            },\r
+            "row_break": true\r
           },\r
           "speech.text_align": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "text_align",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "magic_number",\r
-              "key": "speech_text_align_items"\r
+            "field": {\r
+              "type": "select"\r
             }\r
           },\r
           "speech.quotes": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "quotes",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "text",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "speech.content": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "content",\r
-            "type": "text_area",\r
             "label": {\r
               "row_break": true\r
             },\r
-            "options": {\r
-              "size": "45x5"\r
+            "field": {\r
+              "type": "text_area",\r
+              "options": {\r
+                "size": "45x5"\r
+              }\r
             }\r
           },\r
           "speech.fore_color": {\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "fore_color",\r
-            "type": "hidden",\r
             "label": {\r
               "row_break": true\r
             },\r
-            "options": {},\r
+            "field": {\r
+              "type": "hidden"\r
+            },\r
             "helpers": {\r
               "color": {\r
                 "path": "panels/color_helper",\r
             "model": "speech",\r
             "part": "speech",\r
             "column": "settings",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         }\r
       },\r
       "CircleSpeechBalloon": "circle_speech_balloon",\r
       "circle_speech_balloon": {\r
         "base": "speech_balloon",\r
-        "attributes": {},\r
-        "fields": [\r
+        "fields": {},\r
+        "field_names": [\r
           "speech_balloon.caption",\r
           "balloon.r",\r
           "balloon.x",\r
       "PlainSpeechBalloon": "plain_speech_balloon",\r
       "plain_speech_balloon": {\r
         "base": "speech_balloon",\r
-        "attributes": {\r
+        "fields": {\r
           "balloon.r": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "r",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "speech_balloon.caption",\r
           "balloon.r",\r
           "balloon.x",\r
       "SquareSpeechBalloon": "square_speech_balloon",\r
       "square_speech_balloon": {\r
         "base": "speech_balloon",\r
-        "attributes": {\r
+        "fields": {\r
           "balloon.r": {\r
             "model": "balloon",\r
             "part": "balloon",\r
             "column": "r",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "speech_balloon.caption",\r
           "balloon.r",\r
           "balloon.x",\r
       },\r
       "GroundPicture": "ground_picture",\r
       "ground_picture": {\r
-        "attributes": {\r
+        "fields": {\r
           "id": {\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "panel_id": {\r
             "column": "panel_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "picture_id": {\r
             "column": "picture_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "caption": {\r
             "column": "caption",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "repeat": {\r
             "column": "repeat",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "magic_number",\r
-              "key": "ground_picture_repeat_items",\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "select",\r
+              "options": {\r
+                "source": "magic_number",\r
+                "key": "ground_picture_repeat_items"\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "x": {\r
             "column": "x",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "y": {\r
             "column": "y",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "z": {\r
             "column": "z",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "t": {\r
             "column": "t",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "caption",\r
           "repeat",\r
           "x",\r
       },\r
       "GroundColor": "ground_color",\r
       "ground_color": {\r
-        "attributes": {\r
+        "fields": {\r
           "id": {\r
             "column": "id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "panel_id": {\r
             "column": "panel_id",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "caption": {\r
             "column": "caption",\r
-            "type": "text",\r
             "label": {},\r
-            "options": {\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "text"\r
+            },\r
+            "row_break": true\r
           },\r
           "code": {\r
             "column": "code",\r
-            "type": "hidden",\r
             "label": {\r
               "row_break": true\r
             },\r
-            "options": {\r
-              "row_break": true\r
+            "field": {\r
+              "type": "hidden"\r
             },\r
             "helpers": {\r
               "color": {\r
                 "options": {},\r
                 "wrapper": "ground_color-code-wrap"\r
               }\r
-            }\r
+            },\r
+            "row_break": true\r
           },\r
           "orientation": {\r
             "column": "orientation",\r
-            "type": "select",\r
             "label": {},\r
-            "options": {\r
-              "source": "magic_number",\r
-              "key": "ground_color_orientation_items",\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "select"\r
+            },\r
+            "row_break": true\r
           },\r
           "xy": {\r
             "column": "xy",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
             }\r
           },\r
           "wh": {\r
             "column": "wh",\r
-            "type": "number",\r
             "label": {},\r
-            "options": {\r
-              "size": 5,\r
-              "row_break": true\r
-            }\r
+            "field": {\r
+              "type": "number",\r
+              "options": {\r
+                "size": 5\r
+              }\r
+            },\r
+            "row_break": true\r
           },\r
           "z": {\r
             "column": "z",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           },\r
           "t": {\r
             "column": "t",\r
-            "type": "hidden",\r
             "label": {\r
               "type": "hidden"\r
             },\r
-            "options": {}\r
+            "field": {\r
+              "type": "hidden"\r
+            }\r
           }\r
         },\r
-        "fields": [\r
+        "field_names": [\r
           "id",\r
           "panel_id",\r
           "caption",\r