sbf 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 %>
|