sbf 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/application.js +15 -0
- data/app/assets/javascripts/map.js +665 -0
- data/app/assets/javascripts/onemap.js +1928 -0
- data/app/assets/javascripts/units.js.coffee +3 -0
- data/app/assets/stylesheets/application.css +13 -0
- data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
- data/app/assets/stylesheets/scaffolds.css.scss +69 -0
- data/app/assets/stylesheets/units.css.scss +3 -0
- data/app/controllers/application_controller.rb +5 -0
- data/app/controllers/buses_controller.rb +5 -0
- data/app/controllers/units_controller.rb +74 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/helpers/units_helper.rb +2 -0
- data/app/models/ability.rb +39 -0
- data/app/models/block.rb +163 -0
- data/app/models/estate.rb +70 -0
- data/app/models/quota.rb +80 -0
- data/app/models/settings.rb +4 -0
- data/app/models/unit.rb +121 -0
- data/app/views/blocks/_map.html.erb +37 -0
- data/app/views/kaminari/twitter-bootstrap/_first_page.html.haml +8 -0
- data/app/views/kaminari/twitter-bootstrap/_last_page.html.haml +8 -0
- data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +19 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/rails_admin/application.html.haml +31 -0
- data/app/views/units/_form.html.erb +37 -0
- data/app/views/units/edit.html.erb +6 -0
- data/app/views/units/index.html.erb +30 -0
- data/app/views/units/index.json.jbuilder +4 -0
- data/app/views/units/new.html.erb +5 -0
- data/app/views/units/show.html.erb +29 -0
- data/app/views/units/show.json.jbuilder +1 -0
- data/config/initializers/rails_admin.rb +203 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20130721172422_create_blocks.rb +17 -0
- data/db/migrate/20130721173925_create_units.rb +16 -0
- data/db/migrate/20130721205526_create_estates.rb +12 -0
- data/db/migrate/20130722004104_add_estate_id_to_block.rb +5 -0
- data/db/migrate/20130722004318_update_estate_id_for_blocks.rb +13 -0
- data/db/migrate/20130722010900_remove_estate_from_blocks.rb +5 -0
- data/db/migrate/20130722105351_fix_numeric_columns.rb +39 -0
- data/db/migrate/20130910145656_create_quota.rb +16 -0
- data/db/migrate/20130910151554_populate_quota_table.rb +35 -0
- data/db/migrate/20130912181314_remove_ethnic_quota_from_blocks.rb +5 -0
- data/db/schema.rb +68 -0
- data/lib/kml/busstops-kml-105.kml +156 -0
- data/lib/kml/busstops-kml-106.kml +368 -0
- data/lib/kml/busstops-kml-108.kml +156 -0
- data/lib/kml/busstops-kml-135.kml +181 -0
- data/lib/kml/busstops-kml-136.kml +792 -0
- data/lib/kml/busstops-kml-137.kml +675 -0
- data/lib/kml/busstops-kml-138.kml +634 -0
- data/lib/kml/busstops-kml-139.kml +323 -0
- data/lib/kml/busstops-kml-140.kml +156 -0
- data/lib/kml/busstops-kml-165.kml +207 -0
- data/lib/kml/busstops-kml-166.kml +622 -0
- data/lib/kml/busstops-kml-167.kml +554 -0
- data/lib/kml/busstops-kml-168.kml +840 -0
- data/lib/kml/busstops-kml-169.kml +1401 -0
- data/lib/kml/busstops-kml-170.kml +1171 -0
- data/lib/kml/busstops-kml-171.kml +225 -0
- data/lib/kml/busstops-kml-187.kml +225 -0
- data/lib/kml/busstops-kml-188.kml +179 -0
- data/lib/kml/busstops-kml-196.kml +646 -0
- data/lib/kml/busstops-kml-197.kml +662 -0
- data/lib/kml/busstops-kml-198.kml +1005 -0
- data/lib/kml/busstops-kml-199.kml +1052 -0
- data/lib/kml/busstops-kml-200.kml +1331 -0
- data/lib/kml/busstops-kml-201.kml +1351 -0
- data/lib/kml/busstops-kml-218.kml +248 -0
- data/lib/kml/busstops-kml-219.kml +179 -0
- data/lib/kml/busstops-kml-220.kml +248 -0
- data/lib/kml/busstops-kml-221.kml +225 -0
- data/lib/kml/busstops-kml-225.kml +179 -0
- data/lib/kml/busstops-kml-226.kml +363 -0
- data/lib/kml/busstops-kml-227.kml +849 -0
- data/lib/kml/busstops-kml-228.kml +1015 -0
- data/lib/kml/busstops-kml-229.kml +759 -0
- data/lib/kml/busstops-kml-230.kml +557 -0
- data/lib/kml/busstops-kml-231.kml +998 -0
- data/lib/kml/busstops-kml-232.kml +2153 -0
- data/lib/kml/busstops-kml-233.kml +498 -0
- data/lib/kml/busstops-kml-234.kml +502 -0
- data/lib/kml/busstops-kml-235.kml +249 -0
- data/lib/kml/busstops-kml-249.kml +248 -0
- data/lib/kml/busstops-kml-250.kml +179 -0
- data/lib/kml/busstops-kml-251.kml +455 -0
- data/lib/kml/busstops-kml-252.kml +409 -0
- data/lib/kml/busstops-kml-253.kml +570 -0
- data/lib/kml/busstops-kml-254.kml +202 -0
- data/lib/kml/busstops-kml-256.kml +363 -0
- data/lib/kml/busstops-kml-257.kml +536 -0
- data/lib/kml/busstops-kml-258.kml +515 -0
- data/lib/kml/busstops-kml-259.kml +774 -0
- data/lib/kml/busstops-kml-260.kml +536 -0
- data/lib/kml/busstops-kml-261.kml +738 -0
- data/lib/kml/busstops-kml-262.kml +783 -0
- data/lib/kml/busstops-kml-263.kml +1044 -0
- data/lib/kml/busstops-kml-264.kml +543 -0
- data/lib/kml/busstops-kml-265.kml +624 -0
- data/lib/kml/busstops-kml-266.kml +934 -0
- data/lib/kml/busstops-kml-267.kml +883 -0
- data/lib/kml/busstops-kml-268.kml +187 -0
- data/lib/kml/busstops-kml-280.kml +271 -0
- data/lib/kml/busstops-kml-281.kml +248 -0
- data/lib/kml/busstops-kml-282.kml +639 -0
- data/lib/kml/busstops-kml-283.kml +501 -0
- data/lib/kml/busstops-kml-284.kml +432 -0
- data/lib/kml/busstops-kml-285.kml +432 -0
- data/lib/kml/busstops-kml-286.kml +363 -0
- data/lib/kml/busstops-kml-287.kml +272 -0
- data/lib/kml/busstops-kml-288.kml +792 -0
- data/lib/kml/busstops-kml-289.kml +801 -0
- data/lib/kml/busstops-kml-290.kml +673 -0
- data/lib/kml/busstops-kml-291.kml +474 -0
- data/lib/kml/busstops-kml-292.kml +256 -0
- data/lib/kml/busstops-kml-293.kml +748 -0
- data/lib/kml/busstops-kml-294.kml +999 -0
- data/lib/kml/busstops-kml-295.kml +769 -0
- data/lib/kml/busstops-kml-296.kml +1051 -0
- data/lib/kml/busstops-kml-297.kml +904 -0
- data/lib/kml/busstops-kml-298.kml +731 -0
- data/lib/kml/busstops-kml-299.kml +644 -0
- data/lib/kml/busstops-kml-300.kml +274 -0
- data/lib/kml/busstops-kml-302.kml +156 -0
- data/lib/kml/busstops-kml-311.kml +179 -0
- data/lib/kml/busstops-kml-312.kml +455 -0
- data/lib/kml/busstops-kml-313.kml +639 -0
- data/lib/kml/busstops-kml-314.kml +639 -0
- data/lib/kml/busstops-kml-315.kml +708 -0
- data/lib/kml/busstops-kml-316.kml +394 -0
- data/lib/kml/busstops-kml-317.kml +363 -0
- data/lib/kml/busstops-kml-318.kml +830 -0
- data/lib/kml/busstops-kml-319.kml +370 -0
- data/lib/kml/busstops-kml-320.kml +560 -0
- data/lib/kml/busstops-kml-321.kml +432 -0
- data/lib/kml/busstops-kml-322.kml +365 -0
- data/lib/kml/busstops-kml-323.kml +529 -0
- data/lib/kml/busstops-kml-324.kml +549 -0
- data/lib/kml/busstops-kml-325.kml +717 -0
- data/lib/kml/busstops-kml-326.kml +645 -0
- data/lib/kml/busstops-kml-327.kml +908 -0
- data/lib/kml/busstops-kml-328.kml +467 -0
- data/lib/kml/busstops-kml-329.kml +876 -0
- data/lib/kml/busstops-kml-330.kml +795 -0
- data/lib/kml/busstops-kml-331.kml +442 -0
- data/lib/kml/busstops-kml-342.kml +271 -0
- data/lib/kml/busstops-kml-343.kml +547 -0
- data/lib/kml/busstops-kml-344.kml +317 -0
- data/lib/kml/busstops-kml-345.kml +557 -0
- data/lib/kml/busstops-kml-346.kml +777 -0
- data/lib/kml/busstops-kml-347.kml +777 -0
- data/lib/kml/busstops-kml-348.kml +762 -0
- data/lib/kml/busstops-kml-349.kml +668 -0
- data/lib/kml/busstops-kml-350.kml +366 -0
- data/lib/kml/busstops-kml-351.kml +301 -0
- data/lib/kml/busstops-kml-352.kml +367 -0
- data/lib/kml/busstops-kml-353.kml +271 -0
- data/lib/kml/busstops-kml-354.kml +225 -0
- data/lib/kml/busstops-kml-355.kml +611 -0
- data/lib/kml/busstops-kml-356.kml +842 -0
- data/lib/kml/busstops-kml-357.kml +838 -0
- data/lib/kml/busstops-kml-358.kml +808 -0
- data/lib/kml/busstops-kml-359.kml +786 -0
- data/lib/kml/busstops-kml-360.kml +680 -0
- data/lib/kml/busstops-kml-361.kml +785 -0
- data/lib/kml/busstops-kml-362.kml +815 -0
- data/lib/kml/busstops-kml-363.kml +389 -0
- data/lib/kml/busstops-kml-374.kml +432 -0
- data/lib/kml/busstops-kml-376.kml +205 -0
- data/lib/kml/busstops-kml-377.kml +889 -0
- data/lib/kml/busstops-kml-378.kml +936 -0
- data/lib/kml/busstops-kml-379.kml +577 -0
- data/lib/kml/busstops-kml-380.kml +794 -0
- data/lib/kml/busstops-kml-381.kml +619 -0
- data/lib/kml/busstops-kml-382.kml +716 -0
- data/lib/kml/busstops-kml-383.kml +204 -0
- data/lib/kml/busstops-kml-385.kml +271 -0
- data/lib/kml/busstops-kml-386.kml +795 -0
- data/lib/kml/busstops-kml-387.kml +875 -0
- data/lib/kml/busstops-kml-388.kml +598 -0
- data/lib/kml/busstops-kml-389.kml +648 -0
- data/lib/kml/busstops-kml-390.kml +297 -0
- data/lib/kml/busstops-kml-391.kml +519 -0
- data/lib/kml/busstops-kml-392.kml +426 -0
- data/lib/kml/busstops-kml-393.kml +959 -0
- data/lib/kml/busstops-kml-394.kml +250 -0
- data/lib/kml/busstops-kml-395.kml +187 -0
- data/lib/kml/busstops-kml-405.kml +248 -0
- data/lib/kml/busstops-kml-407.kml +277 -0
- data/lib/kml/busstops-kml-408.kml +670 -0
- data/lib/kml/busstops-kml-409.kml +1094 -0
- data/lib/kml/busstops-kml-410.kml +1009 -0
- data/lib/kml/busstops-kml-411.kml +880 -0
- data/lib/kml/busstops-kml-412.kml +988 -0
- data/lib/kml/busstops-kml-413.kml +396 -0
- data/lib/kml/busstops-kml-417.kml +615 -0
- data/lib/kml/busstops-kml-418.kml +869 -0
- data/lib/kml/busstops-kml-419.kml +1174 -0
- data/lib/kml/busstops-kml-420.kml +463 -0
- data/lib/kml/busstops-kml-421.kml +253 -0
- data/lib/kml/busstops-kml-422.kml +180 -0
- data/lib/kml/busstops-kml-423.kml +865 -0
- data/lib/kml/busstops-kml-424.kml +664 -0
- data/lib/kml/busstops-kml-425.kml +457 -0
- data/lib/kml/busstops-kml-426.kml +179 -0
- data/lib/kml/busstops-kml-438.kml +157 -0
- data/lib/kml/busstops-kml-439.kml +388 -0
- data/lib/kml/busstops-kml-440.kml +248 -0
- data/lib/kml/busstops-kml-441.kml +409 -0
- data/lib/kml/busstops-kml-442.kml +411 -0
- data/lib/kml/busstops-kml-443.kml +795 -0
- data/lib/kml/busstops-kml-444.kml +321 -0
- data/lib/kml/busstops-kml-447.kml +226 -0
- data/lib/kml/busstops-kml-448.kml +668 -0
- data/lib/kml/busstops-kml-449.kml +508 -0
- data/lib/kml/busstops-kml-450.kml +796 -0
- data/lib/kml/busstops-kml-451.kml +783 -0
- data/lib/kml/busstops-kml-452.kml +157 -0
- data/lib/kml/busstops-kml-454.kml +670 -0
- data/lib/kml/busstops-kml-455.kml +1211 -0
- data/lib/kml/busstops-kml-456.kml +496 -0
- data/lib/kml/busstops-kml-457.kml +220 -0
- data/lib/kml/busstops-kml-470.kml +248 -0
- data/lib/kml/busstops-kml-473.kml +434 -0
- data/lib/kml/busstops-kml-474.kml +433 -0
- data/lib/kml/busstops-kml-475.kml +405 -0
- data/lib/kml/busstops-kml-478.kml +271 -0
- data/lib/kml/busstops-kml-479.kml +780 -0
- data/lib/kml/busstops-kml-480.kml +604 -0
- data/lib/kml/busstops-kml-481.kml +676 -0
- data/lib/kml/busstops-kml-482.kml +603 -0
- data/lib/kml/busstops-kml-483.kml +501 -0
- data/lib/kml/busstops-kml-484.kml +179 -0
- data/lib/kml/busstops-kml-485.kml +317 -0
- data/lib/kml/busstops-kml-486.kml +460 -0
- data/lib/kml/busstops-kml-487.kml +887 -0
- data/lib/kml/busstops-kml-488.kml +210 -0
- data/lib/kml/busstops-kml-501.kml +455 -0
- data/lib/kml/busstops-kml-502.kml +317 -0
- data/lib/kml/busstops-kml-503.kml +317 -0
- data/lib/kml/busstops-kml-504.kml +411 -0
- data/lib/kml/busstops-kml-505.kml +461 -0
- data/lib/kml/busstops-kml-506.kml +544 -0
- data/lib/kml/busstops-kml-509.kml +256 -0
- data/lib/kml/busstops-kml-510.kml +869 -0
- data/lib/kml/busstops-kml-511.kml +1146 -0
- data/lib/kml/busstops-kml-512.kml +963 -0
- data/lib/kml/busstops-kml-513.kml +1307 -0
- data/lib/kml/busstops-kml-514.kml +437 -0
- data/lib/kml/busstops-kml-515.kml +363 -0
- data/lib/kml/busstops-kml-516.kml +599 -0
- data/lib/kml/busstops-kml-517.kml +1078 -0
- data/lib/kml/busstops-kml-518.kml +709 -0
- data/lib/kml/busstops-kml-519.kml +179 -0
- data/lib/kml/busstops-kml-520.kml +225 -0
- data/lib/kml/busstops-kml-532.kml +363 -0
- data/lib/kml/busstops-kml-534.kml +179 -0
- data/lib/kml/busstops-kml-535.kml +989 -0
- data/lib/kml/busstops-kml-536.kml +1196 -0
- data/lib/kml/busstops-kml-537.kml +631 -0
- data/lib/kml/busstops-kml-540.kml +346 -0
- data/lib/kml/busstops-kml-541.kml +984 -0
- data/lib/kml/busstops-kml-542.kml +256 -0
- data/lib/kml/busstops-kml-543.kml +496 -0
- data/lib/kml/busstops-kml-544.kml +855 -0
- data/lib/kml/busstops-kml-545.kml +612 -0
- data/lib/kml/busstops-kml-546.kml +225 -0
- data/lib/kml/busstops-kml-547.kml +645 -0
- data/lib/kml/busstops-kml-548.kml +363 -0
- data/lib/kml/busstops-kml-549.kml +386 -0
- data/lib/kml/busstops-kml-550.kml +225 -0
- data/lib/kml/busstops-kml-551.kml +271 -0
- data/lib/kml/busstops-kml-566.kml +436 -0
- data/lib/kml/busstops-kml-567.kml +461 -0
- data/lib/kml/busstops-kml-568.kml +253 -0
- data/lib/kml/busstops-kml-571.kml +241 -0
- data/lib/kml/busstops-kml-572.kml +630 -0
- data/lib/kml/busstops-kml-573.kml +430 -0
- data/lib/kml/busstops-kml-574.kml +625 -0
- data/lib/kml/busstops-kml-575.kml +1110 -0
- data/lib/kml/busstops-kml-576.kml +1082 -0
- data/lib/kml/busstops-kml-577.kml +205 -0
- data/lib/kml/busstops-kml-581.kml +735 -0
- data/lib/kml/busstops-kml-582.kml +248 -0
- data/lib/kml/busstops-kml-594.kml +179 -0
- data/lib/kml/busstops-kml-595.kml +179 -0
- data/lib/kml/busstops-kml-597.kml +436 -0
- data/lib/kml/busstops-kml-598.kml +458 -0
- data/lib/kml/busstops-kml-601.kml +179 -0
- data/lib/kml/busstops-kml-602.kml +389 -0
- data/lib/kml/busstops-kml-603.kml +157 -0
- data/lib/kml/busstops-kml-605.kml +456 -0
- data/lib/kml/busstops-kml-606.kml +298 -0
- data/lib/kml/busstops-kml-607.kml +792 -0
- data/lib/kml/busstops-kml-608.kml +463 -0
- data/lib/kml/busstops-kml-626.kml +248 -0
- data/lib/kml/busstops-kml-628.kml +157 -0
- data/lib/kml/busstops-kml-629.kml +501 -0
- data/lib/kml/busstops-kml-630.kml +340 -0
- data/lib/kml/busstops-kml-631.kml +249 -0
- data/lib/kml/busstops-kml-632.kml +202 -0
- data/lib/kml/busstops-kml-633.kml +319 -0
- data/lib/kml/busstops-kml-635.kml +225 -0
- data/lib/kml/busstops-kml-636.kml +317 -0
- data/lib/kml/busstops-kml-638.kml +667 -0
- data/lib/kml/busstops-kml-656.kml +156 -0
- data/lib/kml/busstops-kml-657.kml +271 -0
- data/lib/kml/busstops-kml-660.kml +432 -0
- data/lib/kml/busstops-kml-662.kml +227 -0
- data/lib/kml/busstops-kml-663.kml +271 -0
- data/lib/kml/busstops-kml-664.kml +202 -0
- data/lib/kml/busstops-kml-665.kml +718 -0
- data/lib/kml/busstops-kml-666.kml +179 -0
- data/lib/kml/busstops-kml-667.kml +206 -0
- data/lib/kml/busstops-kml-669.kml +225 -0
- data/lib/kml/busstops-kml-688.kml +271 -0
- data/lib/kml/busstops-kml-690.kml +179 -0
- data/lib/kml/busstops-kml-691.kml +496 -0
- data/lib/kml/busstops-kml-692.kml +179 -0
- data/lib/kml/busstops-kml-693.kml +271 -0
- data/lib/kml/busstops-kml-695.kml +363 -0
- data/lib/kml/busstops-kml-696.kml +842 -0
- data/lib/kml/busstops-kml-697.kml +265 -0
- data/lib/kml/busstops-kml-698.kml +179 -0
- data/lib/kml/busstops-kml-700.kml +156 -0
- data/lib/kml/busstops-kml-719.kml +294 -0
- data/lib/kml/busstops-kml-721.kml +319 -0
- data/lib/kml/busstops-kml-722.kml +460 -0
- data/lib/kml/busstops-kml-723.kml +843 -0
- data/lib/kml/busstops-kml-724.kml +989 -0
- data/lib/kml/busstops-kml-725.kml +297 -0
- data/lib/kml/busstops-kml-726.kml +447 -0
- data/lib/kml/busstops-kml-727.kml +942 -0
- data/lib/kml/busstops-kml-728.kml +179 -0
- data/lib/kml/busstops-kml-75.kml +156 -0
- data/lib/kml/busstops-kml-750.kml +271 -0
- data/lib/kml/busstops-kml-751.kml +225 -0
- data/lib/kml/busstops-kml-752.kml +271 -0
- data/lib/kml/busstops-kml-753.kml +180 -0
- data/lib/kml/busstops-kml-754.kml +887 -0
- data/lib/kml/busstops-kml-755.kml +1067 -0
- data/lib/kml/busstops-kml-756.kml +609 -0
- data/lib/kml/busstops-kml-757.kml +448 -0
- data/lib/kml/busstops-kml-758.kml +391 -0
- data/lib/kml/busstops-kml-785.kml +341 -0
- data/lib/kml/busstops-kml-786.kml +365 -0
- data/lib/kml/busstops-kml-787.kml +662 -0
- data/lib/kml/busstops-kml-788.kml +1180 -0
- data/lib/kml/busstops-kml-789.kml +180 -0
- data/lib/kml/busstops-kml-816.kml +179 -0
- data/lib/kml/busstops-kml-817.kml +179 -0
- data/lib/kml/busstops-kml-818.kml +478 -0
- data/lib/kml/busstops-kml-819.kml +604 -0
- data/lib/kml/busstops-kml-820.kml +318 -0
- data/lib/kml/busstops-kml-849.kml +503 -0
- data/lib/kml/busstops-kml-850.kml +157 -0
- data/lib/kml/busstops-kml-877.kml +156 -0
- data/lib/kml/busstops-kml-908.kml +156 -0
- data/lib/kml/busstops-kml-969.kml +156 -0
- data/lib/sbf.rb +6 -0
- data/lib/sbf/engine.rb +19 -0
- data/lib/sbf/version.rb +3 -0
- data/lib/tasks/sbf_tasks.rake +4 -0
- metadata +467 -0
data/app/models/quota.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
class Quota < ActiveRecord::Base
|
2
|
+
belongs_to :block
|
3
|
+
has_many :units
|
4
|
+
|
5
|
+
has_one :estate, through: :block
|
6
|
+
|
7
|
+
# Warning: default_scope + join breaks update of records: https://github.com/rails/rails/issues/11199
|
8
|
+
default_scope { joins(:estate).readonly(false) }
|
9
|
+
|
10
|
+
# attr_accessible :malay, :chinese, :others
|
11
|
+
|
12
|
+
# include ActiveModel::ForbiddenAttributesProtection
|
13
|
+
|
14
|
+
def summary
|
15
|
+
"M:#{malay},C:#{chinese},I/O:#{others}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def full_summary
|
19
|
+
"(#{flat_type}) #{summary}"
|
20
|
+
end
|
21
|
+
|
22
|
+
rails_admin do
|
23
|
+
object_label_method :full_summary
|
24
|
+
|
25
|
+
list do
|
26
|
+
filters [:estate, :flat_type]
|
27
|
+
# sort_by :estate
|
28
|
+
|
29
|
+
field :estate, :enum do
|
30
|
+
pretty_value do
|
31
|
+
bindings[:view].link_to bindings[:object].estate.name, bindings[:view].rails_admin.show_path(:estate, bindings[:object].estate)
|
32
|
+
end
|
33
|
+
enum do
|
34
|
+
Estate.all.map(&:name).uniq.to_a
|
35
|
+
end
|
36
|
+
sortable "estates.name, flat_type, #{Block.sql_by_address}"
|
37
|
+
searchable 'estates.name'
|
38
|
+
queryable :true
|
39
|
+
|
40
|
+
column_width 50
|
41
|
+
end
|
42
|
+
field :flat_type do
|
43
|
+
pretty_value do
|
44
|
+
block_id = bindings[:object].block_id
|
45
|
+
unit_count = Unit.where(block_id: block_id, flat_type: bindings[:object].flat_type).count
|
46
|
+
"#{bindings[:object].flat_type} (#{unit_count})"
|
47
|
+
end
|
48
|
+
column_width 50
|
49
|
+
end
|
50
|
+
|
51
|
+
field :block do
|
52
|
+
pretty_value do
|
53
|
+
bindings[:view].link_to "#{bindings[:object].block.no} #{bindings[:object].block.street}",
|
54
|
+
bindings[:view].rails_admin.show_path(:block, bindings[:object].block)
|
55
|
+
end
|
56
|
+
sortable Block.sql_by_address
|
57
|
+
searchable [:no, :street]
|
58
|
+
queryable :true
|
59
|
+
|
60
|
+
column_width 100
|
61
|
+
end
|
62
|
+
|
63
|
+
field :malay do
|
64
|
+
column_width 50
|
65
|
+
end
|
66
|
+
field :chinese do
|
67
|
+
column_width 50
|
68
|
+
end
|
69
|
+
field :others do
|
70
|
+
column_width 50
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# edit do
|
75
|
+
# field :malay
|
76
|
+
# field :chinese
|
77
|
+
# field :others
|
78
|
+
# end
|
79
|
+
end
|
80
|
+
end
|
data/app/models/unit.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
class Unit < ActiveRecord::Base
|
2
|
+
belongs_to :block
|
3
|
+
belongs_to :flat_block, foreign_key: :block_id, class_name: 'Block'
|
4
|
+
belongs_to :quota
|
5
|
+
|
6
|
+
# not intuitive, but this works better with rails_admin than delegate
|
7
|
+
has_one :estate, through: :flat_block
|
8
|
+
|
9
|
+
delegate :probable_date, :delivery_date, :lease_start, to: :flat_block
|
10
|
+
|
11
|
+
default_scope { includes(:estate) }
|
12
|
+
|
13
|
+
rails_admin do
|
14
|
+
# Found associations:
|
15
|
+
|
16
|
+
configure :estate, :has_one_association
|
17
|
+
configure :block, :belongs_to_association
|
18
|
+
configure :quota, :belongs_to_association
|
19
|
+
|
20
|
+
# Found columns:
|
21
|
+
|
22
|
+
# configure :id, :integer
|
23
|
+
configure :no, :string
|
24
|
+
configure :price, :integer
|
25
|
+
configure :area, :integer
|
26
|
+
configure :flat_type, :string
|
27
|
+
# configure :block_id, :integer # Hidden
|
28
|
+
configure :created_at, :datetime
|
29
|
+
configure :updated_at, :datetime
|
30
|
+
|
31
|
+
configure :probable_date, :string
|
32
|
+
configure :delivery_date, :string
|
33
|
+
configure :lease_start, :string
|
34
|
+
|
35
|
+
# Cross-section configuration:
|
36
|
+
|
37
|
+
object_label_method :no # Name of the method called for pretty printing an *instance* of ModelName
|
38
|
+
# label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
|
39
|
+
# label_plural 'My models' # Same, plural
|
40
|
+
weight 2 # Navigation priority. Bigger is higher.
|
41
|
+
# parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
|
42
|
+
# navigation_label # Sets dropdown entry's name in navigation. Only for parents!
|
43
|
+
|
44
|
+
# Section specific configuration:
|
45
|
+
|
46
|
+
list do
|
47
|
+
filters [:estate, :flat_type, :price, :area] # Array of field names which filters should be shown by default in the table header
|
48
|
+
# items_per_page 100 # Override default_items_per_page
|
49
|
+
sort_by "flat_type desc, price" # Sort column (default is primary key)
|
50
|
+
sort_reverse false # Sort direction (default is true for primary key, last created first)
|
51
|
+
|
52
|
+
field :estate, :enum do
|
53
|
+
pretty_value do
|
54
|
+
bindings[:view].link_to bindings[:object].estate.name, bindings[:view].rails_admin.show_path(:estate, bindings[:object].estate)
|
55
|
+
end
|
56
|
+
enum do
|
57
|
+
Estate.all.map(&:name).uniq.to_a
|
58
|
+
end
|
59
|
+
sortable 'estates.name'
|
60
|
+
searchable 'estates.name'
|
61
|
+
queryable :true
|
62
|
+
|
63
|
+
column_width 50
|
64
|
+
end
|
65
|
+
field :flat_type do
|
66
|
+
column_width 50
|
67
|
+
end
|
68
|
+
field :block do
|
69
|
+
pretty_value do
|
70
|
+
bindings[:view].link_to "#{bindings[:object].block.no} #{bindings[:object].block.street}",
|
71
|
+
bindings[:view].rails_admin.show_path(:block, bindings[:object].block)
|
72
|
+
end
|
73
|
+
sortable Block.sql_by_address
|
74
|
+
searchable [:no, :street]
|
75
|
+
queryable :true
|
76
|
+
|
77
|
+
column_width 100
|
78
|
+
end
|
79
|
+
field :no do
|
80
|
+
column_width 50
|
81
|
+
end
|
82
|
+
field :price do
|
83
|
+
column_width 50
|
84
|
+
end
|
85
|
+
field :area do
|
86
|
+
column_width 10
|
87
|
+
end
|
88
|
+
|
89
|
+
field :probable_date do
|
90
|
+
pretty_value { bindings[:object].block.probable_date }
|
91
|
+
sortable 'blocks.probable_date'
|
92
|
+
column_width 50
|
93
|
+
end
|
94
|
+
field :delivery_date do
|
95
|
+
pretty_value { bindings[:object].block.delivery_date }
|
96
|
+
sortable Block.sql_by_delivery_date
|
97
|
+
column_width 50
|
98
|
+
end
|
99
|
+
field :lease_start do
|
100
|
+
pretty_value { bindings[:object].block.lease_start }
|
101
|
+
sortable Block.sql_by_lease_start
|
102
|
+
column_width 50
|
103
|
+
end
|
104
|
+
|
105
|
+
# field :ethnic_quota do
|
106
|
+
# pretty_value { bindings[:object].block.short_ethnic_quota }
|
107
|
+
# sortable 'blocks.ethnic_quota'
|
108
|
+
# column_width 25
|
109
|
+
# end
|
110
|
+
|
111
|
+
field :quota do
|
112
|
+
pretty_value { bindings[:object].quota.summary }
|
113
|
+
column_width 50
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# also see the create, update, modal and nested sections, which override edit in specific cases (resp. when creating, updating, modifying from another model in a popup modal or modifying from another model nested form)
|
118
|
+
# you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
|
119
|
+
# using `field` instead of `configure` will exclude all other fields and force the ordering
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<% content_for :head do %>
|
2
|
+
|
3
|
+
<!-- script src="http://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places&sensor=false" type="text/javascript"></script -->
|
4
|
+
|
5
|
+
<!-- script src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.8"></script -->
|
6
|
+
<!-- script type='text/JavaScript' src="http://www.onemap.sg/API/JS?accessKEY=<%= Settings.onemap_api_key %>&v=2.8&type=full"></script -->
|
7
|
+
<!-- script src="http://t1.onemap.sg/om_js/arcgis_js_api/library/2.8/arcgis/js/default.js" type="text/javascript"></script -->
|
8
|
+
<!-- %= javascript_include_tag 'onemap' % -->
|
9
|
+
<!-- link rel="stylesheet" type="text/css" href="http://t1.onemap.sg/om_js/arcgis_js_api/library/2.8/arcgis/js/dojo/dijit/themes/tundra/tundra.css"/ -->
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<div id="address" data-address="<%= address %>"><%= address %></div>
|
13
|
+
<div id="map_canvas" style="width: 100%; height: 1000px;"></div>
|
14
|
+
<div class="tundra">
|
15
|
+
<div id="div_onemap" style="width: 100%; height: 1000px;"></div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<script type="text/javascript">
|
19
|
+
// var _OneMapGlobalToken = "KUWmLBEUle8AfnRqj2x1V7Pi06pXTwLdlNu94ltLSB0iqtypbv0/WWUxdoh0t0QxakK93PVbieR1OTBHQ3qxcaiWGbsfj3aj";
|
20
|
+
var infowindow;
|
21
|
+
var OneMap;
|
22
|
+
var mashup;
|
23
|
+
var address;
|
24
|
+
|
25
|
+
var themeGraphicsLayer;
|
26
|
+
var gra;
|
27
|
+
|
28
|
+
var omResults;
|
29
|
+
|
30
|
+
var onemap_path = "http://www.onemap.sg/API/JS?accessKEY=<%= Settings.onemap_api_key %>&v=2.8";
|
31
|
+
|
32
|
+
// below is the local version of onemap for debugging without interference of jquery conflicts,
|
33
|
+
// as the original embeds jquery 1.3.2
|
34
|
+
//onemap_path = "<%= asset_path('onemap.js') %>";
|
35
|
+
</script>
|
36
|
+
|
37
|
+
<%= javascript_include_tag 'map' %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
-# Link to the "First" page
|
2
|
+
-# available local variables
|
3
|
+
-# url: url to the first page
|
4
|
+
-# current_page: a page object for the currently displayed page
|
5
|
+
-# total_pages: total number of pages
|
6
|
+
-# per_page: number of items to fetch per page
|
7
|
+
-# remote: data-remote
|
8
|
+
%li.first= link_to raw(t 'admin.pagination.first'), url, :class => (remote ? 'pjax' : '')
|
@@ -0,0 +1,8 @@
|
|
1
|
+
-# Link to the "Last" page
|
2
|
+
-# available local variables
|
3
|
+
-# url: url to the last page
|
4
|
+
-# current_page: a page object for the currently displayed page
|
5
|
+
-# total_pages: total number of pages
|
6
|
+
-# per_page: number of items to fetch per page
|
7
|
+
-# remote: data-remote
|
8
|
+
%li.next= link_to raw(t 'admin.pagination.last'), url, :class => (remote ? 'pjax' : '')
|
@@ -0,0 +1,19 @@
|
|
1
|
+
-# The container tag
|
2
|
+
-# available local variables
|
3
|
+
-# current_page: a page object for the currently displayed page
|
4
|
+
-# total_pages: total number of pages
|
5
|
+
-# per_page: number of items to fetch per page
|
6
|
+
-# remote: data-remote
|
7
|
+
-# paginator: the paginator that renders the pagination tags inside
|
8
|
+
= paginator.render do
|
9
|
+
.pagination
|
10
|
+
%ul
|
11
|
+
= first_page_tag unless current_page.first?
|
12
|
+
= prev_page_tag
|
13
|
+
- each_page do |page|
|
14
|
+
- if page.left_outer? or page.right_outer? or page.inside_window?
|
15
|
+
= page_tag page
|
16
|
+
- elsif !page.was_truncated?
|
17
|
+
= gap_tag
|
18
|
+
= next_page_tag
|
19
|
+
= last_page_tag unless current_page.last?
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Sbf2013</title>
|
5
|
+
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
|
6
|
+
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
|
5
|
+
%meta{:content => "NONE,NOARCHIVE", :name => "robots"}
|
6
|
+
= csrf_meta_tag
|
7
|
+
= stylesheet_link_tag "rails_admin/rails_admin.css", :media => :all
|
8
|
+
= javascript_include_tag "rails_admin/rails_admin.js"
|
9
|
+
|
10
|
+
= yield :head
|
11
|
+
%body.rails_admin
|
12
|
+
#loading.label.label-warning{:style => 'display:none; position:fixed; right:20px; bottom:20px; z-index:100000'}= t('admin.loading')
|
13
|
+
.navbar.navbar-fixed-top
|
14
|
+
.navbar-inner
|
15
|
+
.container-fluid
|
16
|
+
%a.brand.pjax{:href => dashboard_path}
|
17
|
+
= _get_plugin_name[0] || 'Rails'
|
18
|
+
%small= _get_plugin_name[1] || 'Admin'
|
19
|
+
.nav-collapse
|
20
|
+
= render :partial => 'layouts/rails_admin/secondary_navigation'
|
21
|
+
.container-fluid
|
22
|
+
.row-fluid
|
23
|
+
/ .span3
|
24
|
+
|
25
|
+
.span12
|
26
|
+
.row-fluid
|
27
|
+
.well.sidebar-nav
|
28
|
+
%ul.nav.nav-list= main_navigation
|
29
|
+
%ul.nav.nav-list= static_navigation
|
30
|
+
.row-fluid
|
31
|
+
.content{:'data-pjax-container' => true}= render :template => 'layouts/rails_admin/pjax'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<%= form_for(@unit) do |f| %>
|
2
|
+
<% if @unit.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@unit.errors.count, "error") %> prohibited this unit from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @unit.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%= msg %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label :no %><br>
|
16
|
+
<%= f.text_field :no %>
|
17
|
+
</div>
|
18
|
+
<div class="field">
|
19
|
+
<%= f.label :price %><br>
|
20
|
+
<%= f.text_field :price %>
|
21
|
+
</div>
|
22
|
+
<div class="field">
|
23
|
+
<%= f.label :area %><br>
|
24
|
+
<%= f.text_field :area %>
|
25
|
+
</div>
|
26
|
+
<div class="field">
|
27
|
+
<%= f.label :flat_type %><br>
|
28
|
+
<%= f.text_field :flat_type %>
|
29
|
+
</div>
|
30
|
+
<div class="field">
|
31
|
+
<%= f.label :block %><br>
|
32
|
+
<%= f.text_field :block %>
|
33
|
+
</div>
|
34
|
+
<div class="actions">
|
35
|
+
<%= f.submit %>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<h1>Listing units</h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th>No</th>
|
7
|
+
<th>Price</th>
|
8
|
+
<th>Area</th>
|
9
|
+
<th>Flat type</th>
|
10
|
+
<th>Block</th>
|
11
|
+
<th>Estate</th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
|
15
|
+
<tbody>
|
16
|
+
<% @units.each do |unit| %>
|
17
|
+
<% block = unit.block %>
|
18
|
+
<tr>
|
19
|
+
<td><%= unit.no %></td>
|
20
|
+
<td><%= unit.price %></td>
|
21
|
+
<td><%= unit.area %></td>
|
22
|
+
<td><%= unit.flat_type %></td>
|
23
|
+
<td><%= block.id %></td>
|
24
|
+
<td><%= block.estate.name %></td>
|
25
|
+
</tr>
|
26
|
+
<% end %>
|
27
|
+
</tbody>
|
28
|
+
</table>
|
29
|
+
|
30
|
+
<br>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
<strong>No:</strong>
|
5
|
+
<%= @unit.no %>
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<strong>Price:</strong>
|
10
|
+
<%= @unit.price %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<p>
|
14
|
+
<strong>Area:</strong>
|
15
|
+
<%= @unit.area %>
|
16
|
+
</p>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
<strong>Flat type:</strong>
|
20
|
+
<%= @unit.flat_type %>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
<strong>Block:</strong>
|
25
|
+
<%= @unit.block %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
<%= link_to 'Edit', edit_unit_path(@unit) %> |
|
29
|
+
<%= link_to 'Back', units_path %>
|