OSDN Git Service

fe392be6ba723d81c45f3c9fa028d41112910a59
[pettanr/pettanr.git] / app / assets / javascripts / editor / panel_editor / element.js.coffee
1 class Editor.EditorModule.DockModule.ElementBay extends Editor.EditorModule.DockModule.BoardBay\r
2   \r
3   initialize: (options) ->\r
4     super(options)\r
5     @current_index = 1\r
6     @boards = new Editor.EditorModule.DockModule.ElementBay.Boards({\r
7       parent: this\r
8     })\r
9     @listenTo(@boards, 'sorted', @sorted)\r
10     @removed_elements = []\r
11   \r
12   add_element: (element) ->\r
13     @shift_z()\r
14     tab = new Editor.EditorModule.DockModule.ElementBoard({\r
15       parent: this, index: @current_index, name: element.item_name(), element: element\r
16     })\r
17     bl = new Editor.EditorModule.DockModule.TabModule.ElementBoardLabel({\r
18       parent: tab, \r
19       name: element.item_name()\r
20     })\r
21     bb = new Editor.EditorModule.DockModule.TabModule.ElementBoardBody({parent: tab})\r
22     @listenTo(bl, 'destroy', @destroy)\r
23     @add_tab(tab, bl, bb)\r
24     @boards.add_element_tab(tab)\r
25     @boards.$el.tabs('refresh')\r
26     if element.constructor.has_picture()\r
27       @trigger('add:credit', element)\r
28     @sorted()    # recalc z\r
29     @current_index++\r
30   \r
31   find_tab: (element) ->\r
32     t = null\r
33     _.each @tabs, (tab) =>\r
34       if tab.element\r
35         if tab.element.cid == element.cid\r
36           t = tab\r
37           return\r
38     t\r
39   \r
40   remove_element: (element) ->\r
41     if !element.isNew()\r
42       element.set({_destroy: true}, {silent: true})\r
43       @removed_elements.push element\r
44     tab = @find_tab(element)\r
45     tab.label.remove()\r
46     tab.body.remove()\r
47     console.log @tabs.indexOf(tab)\r
48     @tabs.splice(@tabs.indexOf(tab), 1)\r
49     #@tabs = _.compact(@tabs)\r
50     @unshift_z()\r
51     @sorted()    # recalc t\r
52   \r
53   shift_z: () ->\r
54     new_tab_z = @new_tab.label.z()\r
55     _.each @tabs, (tab) ->\r
56       z = tab.label.z()\r
57       tab.label.$el.attr('data-z', z + 1) if z >= new_tab_z  # new tab too\r
58   \r
59   unshift_z: () ->\r
60     @boards.labels.reorder()\r
61   \r
62   add_new_tab: () ->\r
63     @new_tab = new Editor.EditorModule.DockModule.NewElementBoard({\r
64       parent: this, index: 0, name: 'new'\r
65     })\r
66     bb = new Editor.EditorModule.DockModule.TabModule.NewElementBoardBody({parent: @new_tab})\r
67     @add_tab(\r
68       @new_tab, \r
69       new Editor.EditorModule.DockModule.TabModule.NewElementBoardLabel({\r
70         parent: @new_tab\r
71       }), \r
72       bb\r
73     )\r
74     @listenTo(bb, 'pick', @pick)\r
75     @listenTo(bb, 'dialog:open', @open_dialog)\r
76     @listenTo(bb, 'dialog:close', @close_dialog)\r
77     @boards.add_element_tab(@new_tab)\r
78   \r
79   render: () ->\r
80     this.$el.html('')\r
81     @delegateEvents({'activate': 'activate'})\r
82     this.$el.attr('id', @body.dom_id())\r
83     this.$el.append(@boards.render().el)\r
84     _this = this\r
85     @boards.$el.tabs({\r
86       activate: (e, ui) ->\r
87         ui.newPanel.trigger('activate')\r
88     })\r
89     this\r
90   \r
91   init_tabs: () ->\r
92     @add_new_tab()\r
93     list = @root_item().zorderd_elements()\r
94     _.each list, (element) =>\r
95       @add_element(element)\r
96   \r
97   activate: () ->\r
98     _.each @tabs, (tab) ->\r
99       return if not tab.element  # without new element tab\r
100       if tab.body.$el.css('display') != 'none'\r
101         tab.body.refresh()\r
102   \r
103   sorted: () ->\r
104     # data-z copy to model\r
105     new_tab_z = @new_tab.label.z()\r
106     _.each @tabs, (tab) ->\r
107       if tab.element   # without new_tab\r
108         z = tab.label.z()\r
109         z-- if z > new_tab_z  # from 0, 1, new tab, 3... to 1, 2, 3...\r
110         tab.element.set({\r
111           z: z + 1\r
112         }, {silent: true})\r
113         tab.element.trigger('sort')\r
114   \r
115   panel_body: () ->\r
116     @dock().editor().body\r
117   \r
118   save_data: () ->\r
119     attrs = {}\r
120     _.each @tabs, (tab) ->\r
121       return if not tab.element  # without new element tab\r
122       form = tab.body.form\r
123       name = form.item.table_name() + '_attributes'\r
124       attrs[name] ||= []\r
125       attrs[name].push(form.save_data())\r
126     _.each @removed_elements, (element) ->\r
127       name = element.table_name() + '_attributes'\r
128       attrs[name] ||= []\r
129       attrs[name].push({id: element.get('id'), _destroy: true})\r
130     attrs\r
131   \r
132   pick: (new_item) ->\r
133     @add_element(new_item)\r
134     z = @new_tab.label.z()\r
135     new_item.set({z: z}, {silent: true})\r
136     @trigger('pick', new_item)\r
137   \r
138   open_dialog: (dialog) ->\r
139     @trigger('dialog:open', dialog)\r
140   \r
141   close_dialog: (dialog) ->\r
142     @trigger('dialog:close', dialog)\r
143   \r
144   destroy: (element) ->\r
145     @remove_element(element)\r
146     @trigger('destroy', element)\r
147   \r
148 class Editor.EditorModule.DockModule.TabModule.ElementBayLabel extends Editor.EditorModule.DockModule.TabModule.BayLabel\r
149   \r
150 class Editor.EditorModule.DockModule.TabModule.ElementBayBody extends Editor.EditorModule.DockModule.TabModule.BayBody\r
151   \r
152   render: () ->\r
153     @body.render()\r
154   \r