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
|
@@ -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
|