rich_table_component 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/README.md +156 -139
  2. data/app/helpers/component_helper.rb +176 -0
  3. data/app/helpers/documents_helper.rb +22 -0
  4. data/app/helpers/menus_helper.rb +182 -0
  5. data/app/helpers/paragraph_helper.rb +57 -0
  6. data/app/helpers/translations_helper.rb +9 -0
  7. data/app/views/application/_document_fields.html.haml +20 -0
  8. data/app/views/application/_edit.html.haml +11 -0
  9. data/app/views/application/_new.html.haml +11 -0
  10. data/app/views/application/access_denied.js.erb +5 -0
  11. data/app/views/application/create.js.erb +19 -0
  12. data/app/views/application/destroy.js.erb +9 -0
  13. data/app/views/application/destroy_fail.js.erb +2 -0
  14. data/app/views/application/edit.html.haml +8 -0
  15. data/app/views/application/edit.js.erb +28 -0
  16. data/app/views/application/index.js.erb +7 -0
  17. data/app/views/application/index.pdf.haml +87 -0
  18. data/app/views/application/index.xls.haml +64 -0
  19. data/app/views/application/new.html.haml +7 -0
  20. data/app/views/application/new.js.erb +23 -0
  21. data/app/views/application/recapitulation.js.erb +12 -0
  22. data/app/views/application/recapitulation.pdf.haml +68 -0
  23. data/app/views/application/recapitulation.xls.haml +41 -0
  24. data/app/views/application/session_expired.js.erb +5 -0
  25. data/app/views/application/show.js.erb +29 -0
  26. data/app/views/application/update.js.erb +15 -0
  27. data/app/views/layouts/print/pdf.html.haml +8 -0
  28. data/app/views/layouts/print/recapitulation.html.haml +8 -0
  29. data/app/views/rich_table_component/_notification.html.haml +9 -0
  30. data/app/views/rich_table_component/_pagination.html.haml +11 -0
  31. data/app/views/rich_table_component/_recapitulation_matrix_groups.html.haml +42 -0
  32. data/app/views/rich_table_component/component/_ajax_upload.html.haml +6 -0
  33. data/app/views/rich_table_component/component/_ajax_upload_result.html.haml +2 -0
  34. data/app/views/rich_table_component/component/_breadcrumbs.html.haml +25 -0
  35. data/app/views/rich_table_component/component/_breadcrumbs_dropdown.html.haml +18 -0
  36. data/app/views/rich_table_component/component/_tabbed.html.haml +5 -0
  37. data/app/views/rich_table_component/rtc/_advanced_search.html.haml +95 -0
  38. data/app/views/rich_table_component/rtc/_advanced_search_recapitulation.html.haml +90 -0
  39. data/app/views/rich_table_component/rtc/_component.html.haml +62 -0
  40. data/app/views/rich_table_component/rtc/_component_actions.html.haml +69 -0
  41. data/app/views/rich_table_component/rtc/_component_content.html.haml +37 -0
  42. data/app/views/rich_table_component/rtc/_component_title.html.haml +37 -0
  43. data/app/views/rich_table_component/rtc/_content.html.haml +22 -0
  44. data/app/views/rich_table_component/rtc/_footer.html.haml +4 -0
  45. data/app/views/rich_table_component/rtc/_header.html.haml +56 -0
  46. data/app/views/rich_table_component/rtc/_recapitulation_matrix.html.haml +25 -0
  47. data/app/views/rich_table_component/rtc/_recapitulation_matrix_form.html.haml +47 -0
  48. data/app/views/rich_table_component/rtc/_table.html.haml +22 -0
  49. data/lib/pagination_list_link_renderer.rb +51 -0
  50. data/lib/rich_table_component/version.rb +1 -1
  51. data/lib/rich_table_component.rb +0 -8
  52. data/rich_table_component.gemspec +0 -1
  53. data/vendor/assets/images/icons/file_extension/file_extension_.png +0 -0
  54. data/vendor/assets/images/icons/file_extension/file_extension_3gp.png +0 -0
  55. data/vendor/assets/images/icons/file_extension/file_extension_7z.png +0 -0
  56. data/vendor/assets/images/icons/file_extension/file_extension_ace.png +0 -0
  57. data/vendor/assets/images/icons/file_extension/file_extension_ai.png +0 -0
  58. data/vendor/assets/images/icons/file_extension/file_extension_aif.png +0 -0
  59. data/vendor/assets/images/icons/file_extension/file_extension_aiff.png +0 -0
  60. data/vendor/assets/images/icons/file_extension/file_extension_amr.png +0 -0
  61. data/vendor/assets/images/icons/file_extension/file_extension_asf.png +0 -0
  62. data/vendor/assets/images/icons/file_extension/file_extension_asx.png +0 -0
  63. data/vendor/assets/images/icons/file_extension/file_extension_bat.png +0 -0
  64. data/vendor/assets/images/icons/file_extension/file_extension_bin.png +0 -0
  65. data/vendor/assets/images/icons/file_extension/file_extension_bmp.png +0 -0
  66. data/vendor/assets/images/icons/file_extension/file_extension_bup.png +0 -0
  67. data/vendor/assets/images/icons/file_extension/file_extension_cab.png +0 -0
  68. data/vendor/assets/images/icons/file_extension/file_extension_cbr.png +0 -0
  69. data/vendor/assets/images/icons/file_extension/file_extension_cda.png +0 -0
  70. data/vendor/assets/images/icons/file_extension/file_extension_cdl.png +0 -0
  71. data/vendor/assets/images/icons/file_extension/file_extension_cdr.png +0 -0
  72. data/vendor/assets/images/icons/file_extension/file_extension_chm.png +0 -0
  73. data/vendor/assets/images/icons/file_extension/file_extension_dat.png +0 -0
  74. data/vendor/assets/images/icons/file_extension/file_extension_divx.png +0 -0
  75. data/vendor/assets/images/icons/file_extension/file_extension_dll.png +0 -0
  76. data/vendor/assets/images/icons/file_extension/file_extension_dmg.png +0 -0
  77. data/vendor/assets/images/icons/file_extension/file_extension_doc.png +0 -0
  78. data/vendor/assets/images/icons/file_extension/file_extension_dss.png +0 -0
  79. data/vendor/assets/images/icons/file_extension/file_extension_dvf.png +0 -0
  80. data/vendor/assets/images/icons/file_extension/file_extension_dwg.png +0 -0
  81. data/vendor/assets/images/icons/file_extension/file_extension_eml.png +0 -0
  82. data/vendor/assets/images/icons/file_extension/file_extension_eps.png +0 -0
  83. data/vendor/assets/images/icons/file_extension/file_extension_exe.png +0 -0
  84. data/vendor/assets/images/icons/file_extension/file_extension_fla.png +0 -0
  85. data/vendor/assets/images/icons/file_extension/file_extension_flv.png +0 -0
  86. data/vendor/assets/images/icons/file_extension/file_extension_gif.png +0 -0
  87. data/vendor/assets/images/icons/file_extension/file_extension_gz.png +0 -0
  88. data/vendor/assets/images/icons/file_extension/file_extension_hqx.png +0 -0
  89. data/vendor/assets/images/icons/file_extension/file_extension_htm.png +0 -0
  90. data/vendor/assets/images/icons/file_extension/file_extension_html.png +0 -0
  91. data/vendor/assets/images/icons/file_extension/file_extension_ifo.png +0 -0
  92. data/vendor/assets/images/icons/file_extension/file_extension_indd.png +0 -0
  93. data/vendor/assets/images/icons/file_extension/file_extension_iso.png +0 -0
  94. data/vendor/assets/images/icons/file_extension/file_extension_jar.png +0 -0
  95. data/vendor/assets/images/icons/file_extension/file_extension_jpeg.png +0 -0
  96. data/vendor/assets/images/icons/file_extension/file_extension_jpg.png +0 -0
  97. data/vendor/assets/images/icons/file_extension/file_extension_lnk.png +0 -0
  98. data/vendor/assets/images/icons/file_extension/file_extension_log.png +0 -0
  99. data/vendor/assets/images/icons/file_extension/file_extension_m4a.png +0 -0
  100. data/vendor/assets/images/icons/file_extension/file_extension_m4b.png +0 -0
  101. data/vendor/assets/images/icons/file_extension/file_extension_m4p.png +0 -0
  102. data/vendor/assets/images/icons/file_extension/file_extension_m4v.png +0 -0
  103. data/vendor/assets/images/icons/file_extension/file_extension_mcd.png +0 -0
  104. data/vendor/assets/images/icons/file_extension/file_extension_mdb.png +0 -0
  105. data/vendor/assets/images/icons/file_extension/file_extension_mid.png +0 -0
  106. data/vendor/assets/images/icons/file_extension/file_extension_mov.png +0 -0
  107. data/vendor/assets/images/icons/file_extension/file_extension_mp2.png +0 -0
  108. data/vendor/assets/images/icons/file_extension/file_extension_mp4.png +0 -0
  109. data/vendor/assets/images/icons/file_extension/file_extension_mpeg.png +0 -0
  110. data/vendor/assets/images/icons/file_extension/file_extension_mpg.png +0 -0
  111. data/vendor/assets/images/icons/file_extension/file_extension_msi.png +0 -0
  112. data/vendor/assets/images/icons/file_extension/file_extension_mswmm.png +0 -0
  113. data/vendor/assets/images/icons/file_extension/file_extension_ogg.png +0 -0
  114. data/vendor/assets/images/icons/file_extension/file_extension_pdf.png +0 -0
  115. data/vendor/assets/images/icons/file_extension/file_extension_png.png +0 -0
  116. data/vendor/assets/images/icons/file_extension/file_extension_pps.png +0 -0
  117. data/vendor/assets/images/icons/file_extension/file_extension_ppt.png +0 -0
  118. data/vendor/assets/images/icons/file_extension/file_extension_ps.png +0 -0
  119. data/vendor/assets/images/icons/file_extension/file_extension_psd.png +0 -0
  120. data/vendor/assets/images/icons/file_extension/file_extension_pst.png +0 -0
  121. data/vendor/assets/images/icons/file_extension/file_extension_ptb.png +0 -0
  122. data/vendor/assets/images/icons/file_extension/file_extension_pub.png +0 -0
  123. data/vendor/assets/images/icons/file_extension/file_extension_qbb.png +0 -0
  124. data/vendor/assets/images/icons/file_extension/file_extension_qbw.png +0 -0
  125. data/vendor/assets/images/icons/file_extension/file_extension_qxd.png +0 -0
  126. data/vendor/assets/images/icons/file_extension/file_extension_ram.png +0 -0
  127. data/vendor/assets/images/icons/file_extension/file_extension_rar.png +0 -0
  128. data/vendor/assets/images/icons/file_extension/file_extension_rm.png +0 -0
  129. data/vendor/assets/images/icons/file_extension/file_extension_rmvb.png +0 -0
  130. data/vendor/assets/images/icons/file_extension/file_extension_rtf.png +0 -0
  131. data/vendor/assets/images/icons/file_extension/file_extension_sea.png +0 -0
  132. data/vendor/assets/images/icons/file_extension/file_extension_ses.png +0 -0
  133. data/vendor/assets/images/icons/file_extension/file_extension_sit.png +0 -0
  134. data/vendor/assets/images/icons/file_extension/file_extension_sitx.png +0 -0
  135. data/vendor/assets/images/icons/file_extension/file_extension_ss.png +0 -0
  136. data/vendor/assets/images/icons/file_extension/file_extension_swf.png +0 -0
  137. data/vendor/assets/images/icons/file_extension/file_extension_tgz.png +0 -0
  138. data/vendor/assets/images/icons/file_extension/file_extension_thm.png +0 -0
  139. data/vendor/assets/images/icons/file_extension/file_extension_tif.png +0 -0
  140. data/vendor/assets/images/icons/file_extension/file_extension_tmp.png +0 -0
  141. data/vendor/assets/images/icons/file_extension/file_extension_torrent.png +0 -0
  142. data/vendor/assets/images/icons/file_extension/file_extension_ttf.png +0 -0
  143. data/vendor/assets/images/icons/file_extension/file_extension_txt.png +0 -0
  144. data/vendor/assets/images/icons/file_extension/file_extension_vcd.png +0 -0
  145. data/vendor/assets/images/icons/file_extension/file_extension_vob.png +0 -0
  146. data/vendor/assets/images/icons/file_extension/file_extension_wav.png +0 -0
  147. data/vendor/assets/images/icons/file_extension/file_extension_wma.png +0 -0
  148. data/vendor/assets/images/icons/file_extension/file_extension_wmv.png +0 -0
  149. data/vendor/assets/images/icons/file_extension/file_extension_wps.png +0 -0
  150. data/vendor/assets/images/icons/file_extension/file_extension_xls.png +0 -0
  151. data/vendor/assets/images/icons/file_extension/file_extension_xpi.png +0 -0
  152. data/vendor/assets/images/icons/file_extension/file_extension_zip.png +0 -0
  153. data/vendor/assets/images/loading_image.gif +0 -0
  154. data/vendor/assets/images/pbar-ani.gif +0 -0
  155. data/vendor/assets/javascripts/admin/starqle.grid.js +708 -0
  156. data/vendor/assets/javascripts/admin/starqle.ui.jquery.js +927 -0
  157. data/vendor/assets/javascripts/ckeditor/config.js +112 -0
  158. data/vendor/assets/javascripts/jquery-ui-1.8.13.custom.min.js +445 -0
  159. data/vendor/assets/javascripts/jquery.fileupload-ui.js +533 -0
  160. data/vendor/assets/javascripts/jquery.fileupload.js +975 -0
  161. data/vendor/assets/javascripts/jquery.tmpl.min.js +1 -0
  162. data/vendor/assets/javascripts/jquery.tokeninput.js +860 -0
  163. data/vendor/assets/javascripts/nested_attribute_action.js +19 -0
  164. data/vendor/assets/javascripts/rich_table_component.js +51 -0
  165. data/vendor/assets/stylesheets/fontfaces/england_hand_db/Freeware License.txt +5 -0
  166. data/vendor/assets/stylesheets/fontfaces/england_hand_db/england-webfont.eot +0 -0
  167. data/vendor/assets/stylesheets/fontfaces/england_hand_db/england-webfont.svg +146 -0
  168. data/vendor/assets/stylesheets/fontfaces/england_hand_db/england-webfont.ttf +0 -0
  169. data/vendor/assets/stylesheets/fontfaces/england_hand_db/england-webfont.woff +0 -0
  170. data/vendor/assets/stylesheets/fontfaces/england_hand_db/stylesheet.css +16 -0
  171. data/vendor/assets/stylesheets/fontfaces/museo300-regular-webfont.eot +0 -0
  172. data/vendor/assets/stylesheets/fontfaces/museo300-regular-webfont.svg +249 -0
  173. data/vendor/assets/stylesheets/fontfaces/museo300-regular-webfont.ttf +0 -0
  174. data/vendor/assets/stylesheets/fontfaces/museo300-regular-webfont.woff +0 -0
  175. data/vendor/assets/stylesheets/fontfaces/museo500-regular-webfont.eot +0 -0
  176. data/vendor/assets/stylesheets/fontfaces/museo500-regular-webfont.svg +249 -0
  177. data/vendor/assets/stylesheets/fontfaces/museo500-regular-webfont.ttf +0 -0
  178. data/vendor/assets/stylesheets/fontfaces/museo500-regular-webfont.woff +0 -0
  179. data/vendor/assets/stylesheets/fontfaces/museo700-regular-webfont.eot +0 -0
  180. data/vendor/assets/stylesheets/fontfaces/museo700-regular-webfont.svg +249 -0
  181. data/vendor/assets/stylesheets/fontfaces/museo700-regular-webfont.ttf +0 -0
  182. data/vendor/assets/stylesheets/fontfaces/museo700-regular-webfont.woff +0 -0
  183. data/vendor/assets/stylesheets/partial/_base_functions.sass +101 -0
  184. data/vendor/assets/stylesheets/partial/_base_variables.sass +76 -0
  185. data/vendor/assets/stylesheets/partial/_form.sass +57 -0
  186. data/vendor/assets/stylesheets/partial/_grid.css +374 -0
  187. data/vendor/assets/stylesheets/partial/_notification.sass +33 -0
  188. data/vendor/assets/stylesheets/partial/_position.sass +122 -0
  189. data/vendor/assets/stylesheets/partial/_starqle.ui.grid.sass +495 -0
  190. data/vendor/assets/stylesheets/partial/_style.sass +674 -0
  191. data/vendor/assets/stylesheets/partial/_tabbed.sass +33 -0
  192. data/vendor/assets/stylesheets/partial/_user_component.sass +2 -0
  193. data/vendor/assets/stylesheets/rich_table_component/_custom.sass +0 -0
  194. data/vendor/assets/stylesheets/rich_table_component.css +18 -0
  195. data/vendor/assets/stylesheets/rtc_bootstrap_and_overrides.css.less +315 -0
  196. data/vendor/assets/stylesheets/rtc_config.sass +31 -0
  197. data/vendor/assets/stylesheets/rtc_jquery.fileupload-ui.css +155 -0
  198. data/vendor/assets/stylesheets/smoothness/images/Thumbs.db +0 -0
  199. data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  200. data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  201. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  202. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  203. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  204. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  205. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  206. data/vendor/assets/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  207. data/vendor/assets/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  208. data/vendor/assets/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  209. data/vendor/assets/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  210. data/vendor/assets/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  211. data/vendor/assets/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  212. data/vendor/assets/stylesheets/smoothness/jquery-ui-1.8.11.custom.css +573 -0
  213. metadata +209 -17
data/README.md CHANGED
@@ -19,9 +19,9 @@ Or install it yourself as:
19
19
  ## Usage
20
20
 
21
21
 
22
- penggunaan:
23
22
 
24
- CONTROLLER
23
+
24
+ ### CONTROLLER
25
25
 
26
26
  rich_table_component(relation = {}, _sort_column = {}, _sort_direction = nil, pagination = true)
27
27
 
@@ -69,17 +69,15 @@ contoh penggunaan pada controller:
69
69
 
70
70
 
71
71
 
72
- VIEW
72
+ ### VIEW
73
73
  = render 'shared/rtc/component'
74
74
 
75
75
  Merender file shared/rtc/_component.html.haml
76
76
 
77
77
 
78
- ##################################
79
78
  PARAMETER:
80
- ##################################
81
79
 
82
- rtc_controller_name
80
+ #### rtc_controller_name
83
81
  value: string
84
82
  default: controller_name atau string dari controller yang menghandle request
85
83
  description:
@@ -87,40 +85,40 @@ rtc_controller_name
87
85
 
88
86
 
89
87
 
90
- rtc_partial
88
+ #### rtc_partial
91
89
  value: string
92
90
  default: rtc_controller_name.singularize (jika default, merender file partial pada directory yang memanggil)
93
91
 
94
92
 
95
- rtc_title
93
+ #### rtc_title
96
94
  value: boolean, Hash{ title: 'Judul', wrapper: 'h1'/'h2'/'h3'/'h4' }, or string
97
95
  default: true
98
96
  description:
99
97
 
100
98
 
101
99
 
102
- rtc_header
100
+ #### rtc_header
103
101
  value: boolean
104
102
  default: true
105
103
  description:
106
104
  Menampilkan kotak header tabel jika true, dan tidak ditampilkan jika false
107
105
 
108
106
 
109
- rtc_column_header
107
+ #### rtc_column_header
110
108
  value: boolean
111
109
  default: true
112
110
  description:
113
111
  Menampilkan kotak header kolom header jika true, dan tidak ditampilkan jika false
114
112
 
115
113
 
116
- rtc_footer
114
+ #### rtc_footer
117
115
  value: boolean
118
116
  default: true
119
117
  description:
120
118
  Menampilkan kotak footer tabel jika true, dan tidak ditampilkan jika false
121
119
 
122
120
 
123
- headers (required)
121
+ #### headers (required)
124
122
  value: Array of Object
125
123
  description:
126
124
  Mendefinisikan atribut/kolom yang akan ditampilkan sebagai kolom header, berupa atribut pada model atau asosiasi model
@@ -128,14 +126,14 @@ headers (required)
128
126
  [:nip, :name, 'department', :nidn, :certification_number, 'user.email']
129
127
 
130
128
 
131
- columns_width
129
+ #### columns_width
132
130
  value: Array of Integer
133
131
  default: [] / empty array
134
132
  description:
135
133
  Mengatur ukuran tiap kolom pada tabel. Nilai array merupakan rasio ukuran, misal: [1, 2, 2] berarti [20%, 40%, 40%]
136
134
 
137
135
 
138
- search_constraint
136
+ #### search_constraint
139
137
  value: symbol
140
138
  default: nil
141
139
  description:
@@ -145,7 +143,7 @@ search_constraint
145
143
 
146
144
 
147
145
 
148
- advanced_search_attributes
146
+ #### advanced_search_attributes
149
147
  value: Array of Object. Object can be string or symbol or hash {input: ..., params: simple_form input params}
150
148
  default: nil
151
149
  description:
@@ -165,7 +163,7 @@ advanced_search_attributes
165
163
  :certification_number ]
166
164
 
167
165
 
168
- export_attributes
166
+ #### export_attributes
169
167
  value: Array of Object. Object can be string or symbol
170
168
  default: nil,
171
169
  description:
@@ -174,48 +172,48 @@ export_attributes
174
172
  [:nip, :name, 'department', :nidn, :certification_number, 'user.email']
175
173
 
176
174
 
177
- add_form_remote
175
+ #### add_form_remote
178
176
  value: boolean
179
177
  default: false
180
178
  description:
181
179
  Menghidupkan form ajax pada button tambah jika true
182
180
 
183
181
 
184
- rtc_empty_data_message
182
+ #### rtc_empty_data_message
185
183
  value: string
186
184
  default: sanitize "Data #{t(rtc_controller_name)} kosong"
187
185
  description:
188
186
  text yang ditampilkan pada tabel jika data kosong. text dapat dalam format html
189
187
 
190
188
 
191
- search_key
189
+ #### search_key
192
190
  value: string
193
191
  default: 'q'
194
192
  description:
195
193
  Param key yang dibutuhkan pada fitur pencarian menggunakan gem ransack. Jika tidak menggunakan ransack, pada controller tidak perlu memiliki instance @q
196
194
 
197
195
 
198
- rtc_button_new
196
+ #### rtc_button_new
199
197
  value: boolean
200
198
  default: true
201
199
  description:
202
200
  Render default button new if true
203
201
 
204
- rtc_actions
202
+ #### rtc_actions
205
203
  value: Element or Array of Element
206
204
  default: nil
207
205
  description:
208
206
  Render element(s) side by side with button new
209
207
 
210
208
 
211
- toggle_view
209
+ #### toggle_view
212
210
  value: boolean
213
211
  default: false
214
212
  description:
215
213
  render toggle rtc view. thumbnail/list
216
214
 
217
215
 
218
- table_title
216
+ #### table_title
219
217
  value: string
220
218
  default: controller_name
221
219
  description:
@@ -233,58 +231,57 @@ table_title
233
231
 
234
232
 
235
233
 
236
- CONTOH KASUS:
237
-
238
- ===============================================================================================================================
239
- Kasus normal ==================================================================================================================
240
- ===============================================================================================================================
234
+ ### CONTOH KASUS:
241
235
 
242
- Menampilkan rtc berupa list `page` pada halaman `index` controller `PagesController` atau `PagesController#index`. RTC yang ingin ditampilkan secara lengkap (memiliki fitur advanced search dan export pdf & xls)
236
+ #### Kasus normal
243
237
 
244
- Yang perlu dilakukan:
245
- 1. Controller: Pada `PagesController` pages_controller.rb dalam method `index` harus memiliki instance @q dan @pages repond dengan respond_to_remote :index, @pages
238
+ Menampilkan rtc berupa list `page` pada halaman `index` controller `PagesController` atau `PagesController#index`. RTC yang ingin ditampilkan secara lengkap (memiliki fitur advanced search dan export pdf & xls)
246
239
 
247
- def index
248
- ...
249
- @q = Page.search(params[:q])
250
- @pages = rich_table_component @q.result
251
- respond_to_remote :index, @pages
252
- end
240
+ Yang perlu dilakukan:
241
+ 1. Controller: Pada `PagesController` pages_controller.rb dalam method `index` harus memiliki instance @q dan @pages repond dengan respond_to_remote :index, @pages
242
+ ```ruby
243
+ def index
244
+ ...
245
+ @q = Page.search(params[:q])
246
+ @pages = rich_table_component @q.result
247
+ respond_to_remote :index, @pages
248
+ end
249
+ ```
253
250
 
254
251
 
255
- 2. View: Pada view/pages/index.html.haml
252
+ 2. View: Pada view/pages/index.html.haml
253
+ ```haml
254
+ = render 'shared/rtc/component',
255
+ headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
256
+ columns_width: [2, 6, 1, 1, 1],
257
+ search_constraint: :title_or_body_or_author_name_or_author_email_cont,
258
+ add_form_remote: true,
259
+ export_attributes: [:title, :body, ['author.name', 'author'], 'author.email'],
260
+ advanced_search_attributes: [ :title,
261
+ :body,
262
+ 'author.name',
263
+ 'author.email',
264
+ 'author.address.city.name']
265
+ ```
266
+
267
+ 3. View: Pada view/pages/_page.html.haml
268
+ ```haml
269
+ // Jumlah td disesuaikan dengan jumlah element pada headers, untuk kasus ini berjumlah 5
270
+ %tr
271
+ %td
272
+ = page.title
273
+ %td
274
+ = page.body
275
+ %td
276
+ = page.author.name
277
+ %td
278
+ = page.author.email
279
+ %td
280
+ = link_to delete .....
281
+ ```
282
+
283
+ #### Kasus me-render partial custom yang berbeda
256
284
 
257
- = render 'shared/rtc/component',
258
- headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
259
- columns_width: [2, 6, 1, 1, 1],
260
- search_constraint: :title_or_body_or_author_name_or_author_email_cont,
261
- add_form_remote: true,
262
- export_attributes: [:title, :body, ['author.name', 'author'], 'author.email'],
263
- advanced_search_attributes: [ :title,
264
- :body,
265
- 'author.name',
266
- 'author.email',
267
- 'author.address.city.name']
268
-
269
-
270
- 3. View: Pada view/pages/_page.html.haml
271
- // Jumlah td disesuaikan dengan jumlah element pada headers, untuk kasus ini berjumlah 5
272
- %tr
273
- %td
274
- = page.title
275
- %td
276
- = page.body
277
- %td
278
- = page.author.name
279
- %td
280
- = page.author.email
281
- %td
282
- = link_to delete .....
283
-
284
-
285
- ===============================================================================================================================
286
- Kasus me-render partial custom yang berbeda ===================================================================================
287
- ===============================================================================================================================
288
285
  Secara default baris yang dirender adalah _model.html.haml, misal _page.html.haml
289
286
  untuk merender partial yang berbeda untuk model page misalnya: _subscriber_page.html.haml dapat dilakukan dengan mendefinisikan parameter `rtc_partial` dengan lokasi file partial tersebut `pages/subscriber_page`
290
287
 
@@ -304,117 +301,135 @@ Jika pada rtc terdapat button tambah, edit, atau apapun yang mengharuskan merend
304
301
 
305
302
 
306
303
 
307
- ===============================================================================================================================
308
- Kasus mengacu controller yang berbeda =========================================================================================
309
- ===============================================================================================================================
304
+ #### Kasus mengacu controller yang berbeda
305
+
310
306
  Misal menampilkan koleksi post pada home
311
307
 
312
308
  Controller: home#index
313
- ...
314
- @q = Post.search(params[:q])
315
- @posts = rich_table_component @q.result
316
- ...
309
+ ```ruby
310
+ ...
311
+ @q = Post.search(params[:q])
312
+ @posts = rich_table_component @q.result
313
+ ...
314
+ ```
317
315
 
318
316
  View:
319
- = render 'shared/rtc/component',
320
- headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
321
- columns_width: [2, 6, 1, 1, 1],
322
- search_constraint: :title_or_body_or_author_name_or_author_email_cont,
323
- rtc_controller_name: 'posts'
324
-
325
-
317
+ ```haml
318
+ = render 'shared/rtc/component',
319
+ headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
320
+ columns_width: [2, 6, 1, 1, 1],
321
+ search_constraint: :title_or_body_or_author_name_or_author_email_cont,
322
+ rtc_controller_name: 'posts'
323
+ ```
326
324
 
327
325
 
328
- ===============================================================================================================================
329
- Kasus dua atau lebih table dalam halaman yang sama ===========================================================================
330
- ===============================================================================================================================
331
326
 
327
+ #### Kasus dua atau lebih table dalam halaman yang sama
332
328
 
333
329
  Misal menampilkan koleksi post pada home
334
330
 
335
- Controller: home#index
336
- ...
337
- @q = Post.search(params[:q])
338
- @posts = rich_table_component @q.result
331
+ Controller: home#index
332
+ ```ruby
333
+ def index
334
+ ...
335
+ @q = Post.search(params[:q])
336
+ @posts = rich_table_component @q.result
339
337
 
340
- @p = Post.search(params[:p], search_key: :p)
341
- @second_posts = rich_table_component @p.result
338
+ @p = Post.search(params[:p], search_key: :p)
339
+ @second_posts = rich_table_component @p.result
342
340
 
343
- @r = Post.search(params[:r], search_key: :r)
344
- @third_posts = rich_table_component @p.result
345
- ...
341
+ @r = Post.search(params[:r], search_key: :r)
342
+ @third_posts = rich_table_component @p.result
343
+ ...
344
+ end
345
+ ```
346
346
 
347
347
  View:
348
- = render 'shared/rtc/component',
348
+
349
+ ```haml
350
+ = render 'shared/rtc/component',
349
351
  headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
350
352
  columns_width: [2, 6, 1, 1, 1],
351
353
  search_constraint: :title_or_body_or_author_name_or_author_email_cont,
352
354
  rtc_controller_name: 'posts'
355
+ ```
353
356
 
354
- = render 'shared/rtc/component',
357
+ ```haml
358
+ = render 'shared/rtc/component',
355
359
  headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
356
360
  columns_width: [2, 6, 1, 1, 1],
357
361
  search_constraint: :title_or_body_or_author_name_or_author_email_cont,
358
362
  rtc_controller_name: 'second_posts',
359
363
  rtc_partial: 'posts/second_post',
360
364
  search_key: 'p'
365
+ ```
361
366
 
362
- = render 'shared/rtc/component',
367
+ ```haml
368
+ = render 'shared/rtc/component',
363
369
  headers: [:title, :body, ['author.name', 'author'], 'author.email', nil],
364
370
  columns_width: [2, 6, 1, 1, 1],
365
371
  search_constraint: :title_or_body_or_author_name_or_author_email_cont,
366
372
  rtc_controller_name: 'third_posts',
367
373
  rtc_partial: 'posts/third_post',
368
374
  search_key: 'r'
375
+ ```
376
+
369
377
 
370
378
 
379
+ #### Kasus updating tapi bukan dari tombol edit standar (misal: approve/reject)
371
380
 
372
- ===============================================================================================================================
373
- Kasus updating tapi bukan dari tombol edit standar (misal: approve/reject) ====================================================
374
- ===============================================================================================================================
375
381
  tambahkan class html '.edit' pada button custom
376
382
  pada method terakhir yang terpanggil sebelum baris terupdate, harus respond remote to :update,
377
383
  dan harus memiliki params[:rtc_partial] yang diassign di controller ATAU dilempar dari form ATAU button edit
378
384
  - assign di controller: params[:rtc_partial] = 'admin/departments/student'
379
385
  - assign pada form (jika melewati modal form, seperti edit pada umumnya)
380
- simple_form_for ... do |f|
381
- = hidden_field_tag 'rtc_partial', 'admin/departments/student'
382
- ...
383
- end
386
+
387
+ ```ruby
388
+ simple_form_for ... do |f|
389
+ = hidden_field_tag 'rtc_partial', 'admin/departments/student'
390
+ ...
391
+ end
392
+ ```
384
393
  - assign dari button (jika tidak melewati modal)
385
- link_to 'approve', approve_post_path(post, rtc_partial: 'admin/departments/student'), remote: :true, class: 'btn edit'
394
+ ```ruby
395
+ = link_to 'approve', approve_post_path(post, rtc_partial: 'admin/departments/student'), remote: :true, class: 'btn edit'
396
+ ```
386
397
 
387
398
  Jika model yang diupdate berbeda dengan model controllernya, misal mengupdate `post` pada halaman `UsersController#show`,
388
399
  sertakan rtc_controller_name berdampingan dengan rtc_partial,
389
400
  contoh:
390
401
  link_to 'approve', approve_post_path(post, rtc_controller_name: 'admin/departments/student', rtc_partial: 'admin/departments/student'), remote: :true, class: 'btn edit'
391
402
 
392
- =====================================
403
+
393
404
  a) Aksi tidak memunculkan modal, tetapi langsung update. Dengan custom method, model yang diupdate sesuai dengan controller
394
405
 
395
406
  View:
396
407
  tambahkan class html '.edit' pada button custom
397
408
 
398
- ...
399
- = link_to 'approve', approve_post_path(post), remote: :true, class: 'btn edit'
400
- ...
409
+ ```ruby
410
+ ...
411
+ = link_to 'approve', approve_post_path(post), remote: :true, class: 'btn edit'
412
+ ...
413
+ ```
401
414
 
402
415
  Controller
403
416
 
417
+ ```ruby
418
+ ...
419
+ def approve
420
+ # updating post
421
+ @post = Post.find(params[:id])
404
422
  ...
405
- def approve
406
- # updating post
407
- @post = Post.find(params[:id])
408
- ...
409
- respond_to do |format|
410
- if @post.update_attributes(params[:post])
411
- format_remote format, :update, @post
412
- else
413
- format_remote format, :edit, @post
414
- end
423
+ respond_to do |format|
424
+ if @post.update_attributes(params[:post])
425
+ format_remote format, :update, @post
426
+ else
427
+ format_remote format, :edit, @post
415
428
  end
416
429
  end
417
- ...
430
+ end
431
+ ...
432
+ ```
418
433
 
419
434
 
420
435
  b) Aksi tidak memunculkan modal, tetapi langsung update. Dengan custom method, model yang diupdate BERBEDA dengan controller.
@@ -423,29 +438,31 @@ b) Aksi tidak memunculkan modal, tetapi langsung update. Dengan custom method, m
423
438
  View:
424
439
  tambahkan class html '.edit' pada button custom
425
440
 
426
- ...
427
- = link_to 'approve', approve_post_path(post, rtc_controller_name: 'posts', rtc_partial: 'users/post'), remote: :true, class: 'btn edit'
428
- ...
441
+
442
+ ```ruby
443
+ ...
444
+ = link_to 'approve', approve_post_path(post, rtc_controller_name: 'posts', rtc_partial: 'users/post'), remote: :true, class: 'btn edit'
445
+ ...
446
+ ```
429
447
 
430
448
  Controller
431
-
449
+
450
+ ```ruby
451
+ ...
452
+ def approve
453
+ # updating post
454
+ @post = Post.find(params[:id])
432
455
  ...
433
- def approve
434
- # updating post
435
- @post = Post.find(params[:id])
436
- ...
437
- respond_to do |format|
438
- if @post.update_attributes(params[:post])
439
- format_remote format, :update, @post
440
- else
441
- format_remote format, :edit, @post
442
- end
456
+ respond_to do |format|
457
+ if @post.update_attributes(params[:post])
458
+ format_remote format, :update, @post
459
+ else
460
+ format_remote format, :edit, @post
443
461
  end
444
462
  end
445
- ...
446
-
447
-
448
-
463
+ end
464
+ ...
465
+ ```
449
466
 
450
467
 
451
468
 
@@ -0,0 +1,176 @@
1
+ module ComponentHelper
2
+
3
+
4
+ # rendering link for sortable column that used by rich table component
5
+ def sort_link(column = {}, options = {})
6
+ new_params = Hash.new
7
+ new_params.merge! params
8
+ case column
9
+ when Hash
10
+ new_params.merge!(column[:params]) if column[:params].present?
11
+ options[:title] ||= column[:title].to_s
12
+
13
+ if column[:value].present?
14
+ options[:title] = column[:label]
15
+ column = column[:value]
16
+ else
17
+ column = column[:column]
18
+ end
19
+ when Array
20
+ options[:title] = column[1].presence || column.first.to_s.split('.').last(2).join('_')
21
+ column = column.first
22
+ end
23
+
24
+ options[:title] = options[:title].presence || column.to_s.split('.').last(2).join('_')
25
+
26
+ options[:controller] ||= controller_name
27
+
28
+ options[:params][:rtc_controller_name] = options[:rtc_controller_name].presence || controller_name
29
+ options[:params][:rtc_partial] = options[:rtc_partial] if options[:rtc_partial].present?
30
+
31
+ css_class = (column == sort_column) ? "current #{sort_direction}" : nil
32
+ direction = (column == sort_column && sort_direction == "asc") ? "desc" : "asc"
33
+ options[:params].stringify_keys!
34
+ new_params.merge!(options[:params])
35
+ if !action_name.eql? 'index'
36
+ new_params.merge!({pgos: true})
37
+ end
38
+ new_params.merge!({controller: options[:controller], sort: column, direction: direction, page: params[:page]}.stringify_keys!)
39
+ #new_params.merge!({controller: options[:controller], sort: column, direction: direction, page: params[:page]})
40
+
41
+ link_to t("#{options[:title]}"), new_params, {class: css_class, remote: true, title: t("#{options[:title]}")}
42
+ end
43
+
44
+
45
+
46
+
47
+ # Return part div
48
+ def part(opts = {})
49
+ content_tag :div, class: "part #{opts[:class]}" do
50
+ if opts[:label].present?
51
+ content_tag(:span, opts[:label], class: "part_label") +
52
+ content_tag(:span, opts[:value], class: "part_value", title: opts[:title], rel: 'tooltip')
53
+ else
54
+ content_tag(:span, opts[:value], class: "part_value", title: opts[:title], rel: 'tooltip')
55
+ end
56
+ end
57
+ end
58
+
59
+
60
+
61
+ def icon(ico, text = '', pos = 'left')
62
+ if pos.eql? 'right'
63
+ sanitize text + ' <i class="icon-' + ico + '"></i>'
64
+ else
65
+ sanitize '<i class="icon-' + ico + '"></i> ' + text
66
+ end
67
+ end
68
+
69
+
70
+
71
+ def button_form_actions(fobj)
72
+ result = ''
73
+ # result << (fobj.error :base).presence || ''
74
+ result << '<div class="form-actions">'
75
+ result << (fobj.button :submit, 'Simpan', class: 'btn btn-large btn-primary btn_submit')
76
+ result << '</div>'
77
+ result.html_safe
78
+ end
79
+
80
+
81
+
82
+ def button_edit(obj, opts = {})
83
+ opts[:scope_params] ||= {}
84
+ ( link_to icon('pencil'), {controller: obj.class.name.tableize, id: obj, action: :edit}.merge(opts[:scope_params]), remote: true, title: 'Ubah data', rel: 'tooltip', class: 'btn btn-mini edit' ).html_safe
85
+ end
86
+
87
+ def button_delete(obj, opts = {})
88
+ opts[:scope_params] ||= {}
89
+ ( link_to icon('trash'), {controller: obj.class.name.tableize, id: obj, action: :destroy}.merge(opts[:scope_params]), confirm: 'Apa and yakin?', method: :delete, remote: true, title: 'Hapus data', rel: 'tooltip', class: 'btn btn-mini btn-danger delete' ).html_safe
90
+ end
91
+
92
+ def button_edit_delete(obj)
93
+ [button_edit(obj), button_delete(obj)].join(' ').strip.html_safe
94
+ end
95
+
96
+ def button_edit_with_cancan(obj, opts = {})
97
+ can?(:edit, obj) ? button_edit(obj, opts).html_safe : ''
98
+ end
99
+
100
+ def button_delete_with_cancan(obj, opts = {})
101
+ can?(:delete, obj) ? button_delete(obj, opts).html_safe : ''
102
+ end
103
+
104
+ def button_edit_delete_with_cancan(obj, opts = {})
105
+ [button_edit_with_cancan(obj, opts), button_delete_with_cancan(obj, opts)].join(' ').strip.html_safe
106
+ end
107
+
108
+
109
+
110
+ def uneditable_input_control(value, label = ' ')
111
+ content_tag :div, class: "control-group" do
112
+ content_tag(:label, label, class: "control-label") +
113
+ content_tag(:div, class: "controls") do
114
+ content_tag(:div, value, class: "uneditable-input input-xlarge")
115
+ end
116
+ end
117
+ end
118
+
119
+
120
+ def uneditable_textarea_control(value, label = ' ')
121
+ content_tag :div, class: "control-group" do
122
+ content_tag(:label, label, class: "control-label") +
123
+ content_tag(:div, class: "controls") do
124
+ content_tag(:div, value, class: "uneditable-textarea input-xlarge")
125
+ end
126
+ end
127
+ end
128
+
129
+
130
+ def lvr_row_id(item)
131
+ "#{item.class.name.tableize.singularize}_list_view_row_#{item.id}"
132
+ end
133
+
134
+ def lvr_row_class(item)
135
+ "#{controller_name}_#{item.class.name.tableize.singularize}_list_view_row"
136
+ end
137
+
138
+ def component_by_page slug
139
+ comp_page = Page.find_by_slug slug
140
+ result = ''
141
+ if comp_page
142
+ result =
143
+ "<div class='component'>" +
144
+ " <div class='component_title'>" +
145
+ " <h2> #{comp_page.name}" +
146
+ " </h2>" +
147
+ " </div>" +
148
+ " <div class='component_content'>#{truncate_html(comp_page.description, 300)}" +
149
+ " </div>" +
150
+ "</div>"
151
+ end
152
+ result.html_safe
153
+ end
154
+
155
+ def with_html_title text
156
+ "<span title='#{text}'>#{text}</span>".html_safe if text.present?
157
+ end
158
+
159
+ def time_period(sdate, edate)
160
+ strsdate = sdate.present? ? (mdate sdate) : "-"
161
+ stredate = edate.present? ? (mdate edate) : "-"
162
+ "#{strsdate} #{t('to')} #{stredate}"
163
+ end
164
+
165
+ # Needed for constructing dot format in recapitulation matrix
166
+ def mapping_label(arr)
167
+ arr.unshift('mapping').flatten.join('.')
168
+ end
169
+
170
+ def render_rtc(options)
171
+ render partial: 'rich_table_component/rtc/component', locals: options
172
+ end
173
+
174
+ end
175
+
176
+