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
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree .
|
13
|
+
*/
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
Customize RailsAdmin theme here.
|
3
|
+
Copy this file to your app/assets/stylesheets/rails_admin/custom/theming.css.scss, leave this one untouched
|
4
|
+
Don't require it in your application.rb
|
5
|
+
|
6
|
+
Look at the markup in RailsAdmin and go there to get inspiration from:
|
7
|
+
|
8
|
+
http://twitter.github.com/bootstrap/
|
9
|
+
|
10
|
+
Test me: (actual color should be the one defined in variables.css.scss if you did)
|
11
|
+
|
12
|
+
body{ background-color: $linkColor; }
|
13
|
+
*/
|
@@ -0,0 +1,69 @@
|
|
1
|
+
body {
|
2
|
+
background-color: #fff;
|
3
|
+
color: #333;
|
4
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
5
|
+
font-size: 13px;
|
6
|
+
line-height: 18px;
|
7
|
+
}
|
8
|
+
|
9
|
+
p, ol, ul, td {
|
10
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
11
|
+
font-size: 13px;
|
12
|
+
line-height: 18px;
|
13
|
+
}
|
14
|
+
|
15
|
+
pre {
|
16
|
+
background-color: #eee;
|
17
|
+
padding: 10px;
|
18
|
+
font-size: 11px;
|
19
|
+
}
|
20
|
+
|
21
|
+
a {
|
22
|
+
color: #000;
|
23
|
+
&:visited {
|
24
|
+
color: #666;
|
25
|
+
}
|
26
|
+
&:hover {
|
27
|
+
color: #fff;
|
28
|
+
background-color: #000;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
div {
|
33
|
+
&.field, &.actions {
|
34
|
+
margin-bottom: 10px;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
#notice {
|
39
|
+
color: green;
|
40
|
+
}
|
41
|
+
|
42
|
+
.field_with_errors {
|
43
|
+
padding: 2px;
|
44
|
+
background-color: red;
|
45
|
+
display: table;
|
46
|
+
}
|
47
|
+
|
48
|
+
#error_explanation {
|
49
|
+
width: 450px;
|
50
|
+
border: 2px solid red;
|
51
|
+
padding: 7px;
|
52
|
+
padding-bottom: 0;
|
53
|
+
margin-bottom: 20px;
|
54
|
+
background-color: #f0f0f0;
|
55
|
+
h2 {
|
56
|
+
text-align: left;
|
57
|
+
font-weight: bold;
|
58
|
+
padding: 5px 5px 5px 15px;
|
59
|
+
font-size: 12px;
|
60
|
+
margin: -7px;
|
61
|
+
margin-bottom: 0px;
|
62
|
+
background-color: #c00;
|
63
|
+
color: #fff;
|
64
|
+
}
|
65
|
+
ul li {
|
66
|
+
font-size: 12px;
|
67
|
+
list-style: square;
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
class UnitsController < ApplicationController
|
2
|
+
before_action :set_unit, only: [:show, :edit, :update, :destroy]
|
3
|
+
|
4
|
+
# GET /units
|
5
|
+
# GET /units.json
|
6
|
+
def index
|
7
|
+
@units = Unit.all
|
8
|
+
end
|
9
|
+
|
10
|
+
# GET /units/1
|
11
|
+
# GET /units/1.json
|
12
|
+
def show
|
13
|
+
end
|
14
|
+
|
15
|
+
# GET /units/new
|
16
|
+
def new
|
17
|
+
@unit = Unit.new
|
18
|
+
end
|
19
|
+
|
20
|
+
# GET /units/1/edit
|
21
|
+
def edit
|
22
|
+
end
|
23
|
+
|
24
|
+
# POST /units
|
25
|
+
# POST /units.json
|
26
|
+
def create
|
27
|
+
@unit = Unit.new(unit_params)
|
28
|
+
|
29
|
+
respond_to do |format|
|
30
|
+
if @unit.save
|
31
|
+
format.html { redirect_to @unit, notice: 'Unit was successfully created.' }
|
32
|
+
format.json { render action: 'show', status: :created, location: @unit }
|
33
|
+
else
|
34
|
+
format.html { render action: 'new' }
|
35
|
+
format.json { render json: @unit.errors, status: :unprocessable_entity }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# PATCH/PUT /units/1
|
41
|
+
# PATCH/PUT /units/1.json
|
42
|
+
def update
|
43
|
+
respond_to do |format|
|
44
|
+
if @unit.update(unit_params)
|
45
|
+
format.html { redirect_to @unit, notice: 'Unit was successfully updated.' }
|
46
|
+
format.json { head :no_content }
|
47
|
+
else
|
48
|
+
format.html { render action: 'edit' }
|
49
|
+
format.json { render json: @unit.errors, status: :unprocessable_entity }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# DELETE /units/1
|
55
|
+
# DELETE /units/1.json
|
56
|
+
def destroy
|
57
|
+
@unit.destroy
|
58
|
+
respond_to do |format|
|
59
|
+
format.html { redirect_to units_url }
|
60
|
+
format.json { head :no_content }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
# Use callbacks to share common setup or constraints between actions.
|
66
|
+
def set_unit
|
67
|
+
@unit = Unit.find(params[:id])
|
68
|
+
end
|
69
|
+
|
70
|
+
# Never trust parameters from the scary internet, only allow the white list through.
|
71
|
+
def unit_params
|
72
|
+
params.require(:unit).permit(:no, :price, :area, :flat_type, :block_id)
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Ability
|
2
|
+
include CanCan::Ability
|
3
|
+
|
4
|
+
def initialize(user)
|
5
|
+
can :access, :rails_admin
|
6
|
+
can :dashboard
|
7
|
+
|
8
|
+
can :read, :all
|
9
|
+
# can :edit, Quota
|
10
|
+
# can :update, Quota
|
11
|
+
|
12
|
+
# Define abilities for the passed in user here. For example:
|
13
|
+
#
|
14
|
+
# user ||= User.new # guest user (not logged in)
|
15
|
+
# if user.admin?
|
16
|
+
# can :manage, :all
|
17
|
+
# else
|
18
|
+
# can :read, :all
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# The first argument to `can` is the action you are giving the user
|
22
|
+
# permission to do.
|
23
|
+
# If you pass :manage it will apply to every action. Other common actions
|
24
|
+
# here are :read, :create, :update and :destroy.
|
25
|
+
#
|
26
|
+
# The second argument is the resource the user can perform the action on.
|
27
|
+
# If you pass :all it will apply to every resource. Otherwise pass a Ruby
|
28
|
+
# class of the resource.
|
29
|
+
#
|
30
|
+
# The third argument is an optional hash of conditions to further filter the
|
31
|
+
# objects.
|
32
|
+
# For example, here the user can only update published articles.
|
33
|
+
#
|
34
|
+
# can :update, Article, :published => true
|
35
|
+
#
|
36
|
+
# See the wiki for details:
|
37
|
+
# https://github.com/ryanb/cancan/wiki/Defining-Abilities
|
38
|
+
end
|
39
|
+
end
|
data/app/models/block.rb
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
class Block < ActiveRecord::Base
|
2
|
+
has_many :units, -> { order(:no) }
|
3
|
+
has_many :quotas, -> { order(:flat_type) }
|
4
|
+
|
5
|
+
belongs_to :estate
|
6
|
+
|
7
|
+
default_scope { includes(:quotas).joins(:estate) }
|
8
|
+
|
9
|
+
def address
|
10
|
+
"#{no} #{street}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def long_address
|
14
|
+
address
|
15
|
+
.gsub('Rd','Road')
|
16
|
+
.gsub('Nth','North')
|
17
|
+
.gsub('Ave','Avenue')
|
18
|
+
.gsub('St','Street')
|
19
|
+
.gsub('Ctrl','Central')
|
20
|
+
.gsub('Jln','Jalan')
|
21
|
+
.gsub('Lor ','Lorong ')
|
22
|
+
.gsub('Upp ','Upper ')
|
23
|
+
.gsub('Hts','Heights')
|
24
|
+
.gsub('Gdn','Garden')
|
25
|
+
.gsub('Bt','Bukit')
|
26
|
+
.gsub("C'Wealth","Commonwealth")
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def sort_by_delivery_date(collection=self.all)
|
31
|
+
collection.sort { |a,b| compare_delivery_date(a,b) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def compare_delivery_date(a,b)
|
35
|
+
begin
|
36
|
+
date_a = a.delivery_date.to_date
|
37
|
+
rescue
|
38
|
+
date_a = Date.new
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
date_b = b.delivery_date.to_date
|
43
|
+
rescue
|
44
|
+
date_b = Date.new
|
45
|
+
end
|
46
|
+
|
47
|
+
date_a <=> date_b
|
48
|
+
end
|
49
|
+
|
50
|
+
def psql_date_regex
|
51
|
+
'\'\d{1,2}\s+\w{3}\s+\d{2,4}\''
|
52
|
+
end
|
53
|
+
|
54
|
+
def sql_by_delivery_date
|
55
|
+
case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
|
56
|
+
when :mysql2
|
57
|
+
# mysql does not support (col1, col2) asc|desc
|
58
|
+
'str_to_date(blocks.delivery_date, \'%d %M %Y\'), str_to_date(blocks.lease_start, \'%d %M %Y\')'
|
59
|
+
when :postgresql
|
60
|
+
# trick to allow non-dates to be sorted ahead
|
61
|
+
%Q{(
|
62
|
+
to_date(substring(blocks.delivery_date || \'01 Jan 1900\' from #{psql_date_regex}), \'DD Mon YYYY\'),
|
63
|
+
to_date(substring(blocks.lease_start from #{psql_date_regex}), \'DD Mon YYYY\')
|
64
|
+
)}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def sql_by_lease_start
|
69
|
+
case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
|
70
|
+
when :mysql2
|
71
|
+
'str_to_date(blocks.lease_start, \'%d %M %Y\')'
|
72
|
+
when :postgresql
|
73
|
+
%Q{(
|
74
|
+
to_date(substring(blocks.lease_start from #{psql_date_regex}), \'DD Mon YYYY\'),
|
75
|
+
substring(blocks.lease_start from \'\\w+\')
|
76
|
+
)}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def sql_by_address
|
81
|
+
case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
|
82
|
+
when :mysql2
|
83
|
+
'concat(blocks.street, blocks.no)'
|
84
|
+
when :postgresql
|
85
|
+
'(blocks.street || blocks.no)'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
rails_admin do
|
91
|
+
# Found associations:
|
92
|
+
|
93
|
+
configure :estate, :belongs_to_association
|
94
|
+
configure :units, :has_many_association
|
95
|
+
configure :quotas, :has_many_association
|
96
|
+
|
97
|
+
# Found columns:
|
98
|
+
|
99
|
+
configure :id, :integer
|
100
|
+
configure :no, :string
|
101
|
+
configure :street, :string
|
102
|
+
configure :probable_date, :string
|
103
|
+
configure :delivery_date, :string
|
104
|
+
configure :lease_start, :string
|
105
|
+
configure :created_at, :datetime
|
106
|
+
configure :updated_at, :datetime
|
107
|
+
configure :estate_id, :integer # Hidden
|
108
|
+
|
109
|
+
# Cross-section configuration:
|
110
|
+
|
111
|
+
object_label_method :no # Name of the method called for pretty printing an *instance* of ModelName
|
112
|
+
# label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
|
113
|
+
# label_plural 'My models' # Same, plural
|
114
|
+
weight 1 # Navigation priority. Bigger is higher.
|
115
|
+
# parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
|
116
|
+
# navigation_label # Sets dropdown entry's name in navigation. Only for parents!
|
117
|
+
|
118
|
+
# Section specific configuration:
|
119
|
+
|
120
|
+
list do
|
121
|
+
# filters [:id, :name] # Array of field names which filters should be shown by default in the table header
|
122
|
+
# items_per_page 100 # Override default_items_per_page
|
123
|
+
# sort_by :id # Sort column (default is primary key)
|
124
|
+
# sort_reverse true # Sort direction (default is true for primary key, last created first)
|
125
|
+
|
126
|
+
field :estate
|
127
|
+
field :no
|
128
|
+
field :street
|
129
|
+
field :probable_date do
|
130
|
+
column_width 100
|
131
|
+
end
|
132
|
+
field :delivery_date do
|
133
|
+
column_width 100
|
134
|
+
sortable Block.sql_by_delivery_date
|
135
|
+
end
|
136
|
+
field :lease_start do
|
137
|
+
column_width 100
|
138
|
+
sortable Block.sql_by_lease_start
|
139
|
+
end
|
140
|
+
field :quotas
|
141
|
+
end
|
142
|
+
|
143
|
+
show do
|
144
|
+
field :estate
|
145
|
+
field :address do
|
146
|
+
pretty_value do
|
147
|
+
# inline javascript for loading of libraries should be placed in <head>
|
148
|
+
bindings[:view].render :partial => 'blocks/map', :locals => {address: bindings[:object].long_address}
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
field :probable_date
|
153
|
+
field :delivery_date
|
154
|
+
field :lease_start
|
155
|
+
field :quotas
|
156
|
+
field :units
|
157
|
+
end
|
158
|
+
|
159
|
+
# 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)
|
160
|
+
# you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
|
161
|
+
# using `field` instead of `configure` will exclude all other fields and force the ordering
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Estate < ActiveRecord::Base
|
2
|
+
has_many :blocks, -> { order(:no) }
|
3
|
+
has_many :units, -> { order(:no) }, through: :blocks
|
4
|
+
|
5
|
+
default_scope { includes(:blocks) }
|
6
|
+
|
7
|
+
rails_admin do
|
8
|
+
# Found associations:
|
9
|
+
|
10
|
+
configure :blocks, :has_many_association
|
11
|
+
configure :units, :has_many_association
|
12
|
+
|
13
|
+
# Found columns:
|
14
|
+
|
15
|
+
configure :id, :integer
|
16
|
+
configure :name, :string
|
17
|
+
configure :total, :integer
|
18
|
+
configure :created_at, :datetime
|
19
|
+
configure :updated_at, :datetime
|
20
|
+
|
21
|
+
# Cross-section configuration:
|
22
|
+
|
23
|
+
# object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
|
24
|
+
# label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
|
25
|
+
# label_plural 'My models' # Same, plural
|
26
|
+
# weight 0 # Navigation priority. Bigger is higher.
|
27
|
+
# parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
|
28
|
+
# navigation_label # Sets dropdown entry's name in navigation. Only for parents!
|
29
|
+
|
30
|
+
# Section specific configuration:
|
31
|
+
|
32
|
+
list do
|
33
|
+
# filters [:id, :name] # Array of field names which filters should be shown by default in the table header
|
34
|
+
# items_per_page 100 # Override default_items_per_page
|
35
|
+
sort_by :name # Sort column (default is primary key)
|
36
|
+
# sort_reverse true # Sort direction (default is true for primary key, last created first)
|
37
|
+
|
38
|
+
field :name do
|
39
|
+
pretty_value do
|
40
|
+
bindings[:view].link_to bindings[:object].name, bindings[:view].rails_admin.show_path(:estate, bindings[:object])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
field :total
|
44
|
+
field :blocks
|
45
|
+
end
|
46
|
+
|
47
|
+
show do
|
48
|
+
field :id
|
49
|
+
field :name
|
50
|
+
field :total do
|
51
|
+
pretty_value do
|
52
|
+
e = bindings[:object]
|
53
|
+
r = Quota.where(block_id: e.blocks).select('flat_type, sum(malay) as m, sum(chinese) as c, sum(others) as o').group(:flat_type)
|
54
|
+
h = Hash.new
|
55
|
+
r.each do |q|
|
56
|
+
h[q.flat_type] = [q.m,q.c,q.o]
|
57
|
+
end
|
58
|
+
|
59
|
+
"#{bindings[:object].total} #{h}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
field :blocks
|
63
|
+
field :units
|
64
|
+
end
|
65
|
+
|
66
|
+
# 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)
|
67
|
+
# you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
|
68
|
+
# using `field` instead of `configure` will exclude all other fields and force the ordering
|
69
|
+
end
|
70
|
+
end
|