.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Reset font and text properties given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-small;\n font-weight: normal;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Reset font and text properties given new insertion method\n font-family: @font-family-base;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: @line-height-base;\n text-align: left;\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/public/js/accounts.js b/public/js/accounts.js
index 5435c2d6b9..ae240b8500 100644
--- a/public/js/accounts.js
+++ b/public/js/accounts.js
@@ -1,11 +1,23 @@
-$(function () {
+/* global $ */
+
+// Return a helper with preserved width of cells
+var fixHelper = function (e, ui) {
+ "use strict";
+ ui.children().each(function () {
+ $(this).width($(this).width());
+ });
+ return ui;
+};
+
+$(function () {
+ "use strict";
if (typeof(googleLineChart) === "function" && typeof accountID !== 'undefined') {
googleLineChart('chart/account/' + accountID, 'overview-chart');
}
// sortable!
- if (typeof $(".sortable-table tbody").sortable != "undefined") {
+ if (typeof $(".sortable-table tbody").sortable !== "undefined") {
$(".sortable-table tbody").sortable(
{
helper: fixHelper,
@@ -19,23 +31,14 @@ $(function () {
});
-// Return a helper with preserved width of cells
-var fixHelper = function (e, ui) {
- ui.children().each(function () {
- $(this).width($(this).width());
- });
- return ui;
-};
-
function sortStop(event, ui) {
+ "use strict";
var current = $(ui.item);
var thisDate = current.data('date');
var originalBG = current.css('backgroundColor');
- if (current.prev().data('date') != thisDate && current.next().data('date') != thisDate) {
- //console.log('False!');
- //console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
+ if (current.prev().data('date') !== thisDate && current.next().data('date') !== thisDate) {
// animate something with color:
current.animate({
backgroundColor: "#d9534f"
@@ -59,10 +62,6 @@ function sortStop(event, ui) {
// do extra animation when done?
$.post('/transaction/reorder', {items: submit, date: thisDate, _token: token});
- console.log(submit);
-
- //console.log('TRUE!');
- //console.log('[' + current.prev().data('date') + '] [' + thisDate + '] [' + current.next().data('date') + ']');
current.animate({
backgroundColor: "#5cb85c"
diff --git a/public/js/bills.js b/public/js/bills.js
index 5f45f2a90b..58dd7ae943 100644
--- a/public/js/bills.js
+++ b/public/js/bills.js
@@ -1,7 +1,9 @@
-$(document).ready(function () {
+/* global googleComboChart, billID */
- if (typeof(googleComboChart) === 'function' && typeof(billID) !== 'undefined') {
- googleComboChart('chart/bill/' + billID, 'bill-overview');
- }
- }
+$(document).ready(function () {
+ "use strict";
+ if (typeof(googleComboChart) === 'function' && typeof(billID) !== 'undefined') {
+ googleComboChart('chart/bill/' + billID, 'bill-overview');
+ }
+ }
);
\ No newline at end of file
diff --git a/public/js/budgets.js b/public/js/budgets.js
index 1ab91d8b23..3493c81fc0 100644
--- a/public/js/budgets.js
+++ b/public/js/budgets.js
@@ -1,12 +1,104 @@
+/* globals $, budgeted:false, currencySymbol, budgetIncomeTotal ,budgetedMuch, budgetedPercentage, token, budgetID, repetitionID, spent, budgeted*/
+
+function drawSpentBar() {
+ "use strict";
+
+ var overspent = spent > budgeted;
+ var pct;
+
+ if (overspent) {
+ // draw overspent bar
+ pct = (budgeted / spent) * 100;
+ $('.spentBar .progress-bar-warning').css('width', pct + '%');
+ $('.spentBar .progress-bar-danger').css('width', (100 - pct) + '%');
+ } else {
+ // draw normal bar:
+ pct = (spent / budgeted) * 100;
+ $('.spentBar .progress-bar-info').css('width', pct + '%');
+ }
+}
+
+function drawBudgetedBar() {
+ "use strict";
+ var budgetedMuch = budgeted > budgetIncomeTotal;
+
+ // recalculate percentage:
+
+ var pct;
+ if (budgetedMuch) {
+ // budgeted too much.
+ pct = (budgetIncomeTotal / budgeted) * 100;
+ $('.budgetedBar .progress-bar-warning').css('width', pct + '%');
+ $('.budgetedBar .progress-bar-danger').css('width', (100 - pct) + '%');
+ $('.budgetedBar .progress-bar-info').css('width', 0);
+ } else {
+ pct = (budgeted / budgetIncomeTotal) * 100;
+ $('.budgetedBar .progress-bar-warning').css('width', 0);
+ $('.budgetedBar .progress-bar-danger').css('width', 0);
+ $('.budgetedBar .progress-bar-info').css('width', pct + '%');
+ }
+
+ $('#budgetedAmount').html(currencySymbol + ' ' + budgeted.toFixed(2));
+}
+
+function updateBudgetedAmounts(e) {
+ "use strict";
+ var target = $(e.target);
+ var id = target.data('id');
+ var value = target.val();
+ var original = target.data('original');
+ var difference = value - original;
+ if (difference !== 0) {
+ // add difference to 'budgeted' var
+ budgeted = budgeted + difference;
+
+ // update original:
+ target.data('original', value);
+ // run drawBudgetedBar() again:
+ drawBudgetedBar();
+
+ // send a post to Firefly to update the amount:
+ $.post('budgets/amount/' + id, {amount: value, _token: token}).success(function (data) {
+ // update the link if relevant:
+ if (data.repetition > 0) {
+ $('.budget-link[data-id="' + id + '"]').attr('href', 'budgets/show/' + id + '/' + data.repetition);
+ } else {
+ $('.budget-link[data-id="' + id + '"]').attr('href', 'budgets/show/' + id);
+ }
+ });
+ }
+
+
+ console.log('Budget id is ' + id);
+ console.log('Difference = ' + (value - original ));
+
+}
+
$(function () {
- updateRanges();
- //$('input[type="range"]').change(updateSingleRange);
- $('input[type="range"]').on('input', updateSingleRange);
- //$('input[type="number"]').on('change', updateSingleRange);
- $('input[type="number"]').on('input', updateSingleRange);
+ "use strict";
+
$('.updateIncome').on('click', updateIncome);
+ /*
+ On start, fill the "spent"-bar using the content from the page.
+ */
+ drawSpentBar();
+ drawBudgetedBar();
+ /*
+ When the input changes, update the percentages for the budgeted bar:
+ */
+ $('input[type="number"]').on('input', updateBudgetedAmounts);
+
+
+ //updateRanges();
+ //$('input[type="range"]').on('input', updateSingleRange);
+ //$('input[type="number"]').on('input', updateSingleRange);
+
+
+ /*
+ Draw the charts, if necessary:
+ */
if (typeof budgetID !== 'undefined' && typeof repetitionID === 'undefined') {
googleColumnChart('chart/budget/' + budgetID, 'budgetOverview');
}
@@ -17,139 +109,138 @@ $(function () {
});
-function updateSingleRange(e) {
- // get some values:
- var input = $(e.target);
- var id = input.data('id');
- var value = parseInt(input.val());
- var spent = parseFloat($('#spent-' + id).data('value'));
-
- // update small display:
- if (value > 0) {
- // show the input:
- $('#budget-info-' + id + ' span').show();
- $('#budget-info-' + id + ' input').show();
-
- // update the text:
- $('#budget-description-' + id).text('Budgeted: ');
- } else {
- // hide the input:
- $('#budget-info-' + id + ' span').hide();
- $('#budget-info-' + id + ' input').hide();
-
- // update the text:
- $('#budget-description-' + id).html('
No budget');
- }
-
- // update the range display text:
- $('#budget-range-display-' + id).text('\u20AC ' + value.toFixed(2));
-
- // send a post to Firefly to update the amount:
- $.post('budgets/amount/' + id, {amount: value, _token: token}).success(function (data) {
- // update the link if relevant:
- $('#budget-link-' + id).attr('href', 'budgets/show/' + id + '/' + data.repetition);
- });
- if (input.attr('type') == 'number') {
- // update the range-input:
- $('#budget-range-' + id).val(value);
- } else {
- // update the number-input:
- $('#budget-info-' + id + ' input').val(value);
- }
-
- // update or hide the bar, whichever is necessary.
- updateTotal();
- return value;
-}
-
-function updateTotal() {
- var sum = 0;
- $('input[type="range"]').each(function (i, v) {
- // get some values:
- sum += parseInt($(v).val());
- });
-
- /**
- * Update total sum:
- */
- var totalAmount = parseInt($('#totalAmount').data('value'));
- var pct;
- if (sum <= totalAmount) {
- pct = sum / totalAmount * 100;
- $('#progress-bar-default').css('width', pct + '%');
- $('#progress-bar-warning').css('width', '0');
- $('#progress-bar-danger').css('width', '0');
- $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-success').removeClass('text-danger');
- } else {
- // we gaan er X overheen,
-
- pct = totalAmount / sum * 100;
- var danger = 100 - pct;
- var err = 100 - danger;
- $('#progress-bar-default').css('width', 0);
- $('#progress-bar-warning').css('width', err + '%');
- $('#progress-bar-danger').css('width', danger + '%');
- $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-danger').removeClass('text-success');
- }
-
-}
-
-function updateIncome(e) {
+//function updateSingleRange(e) {
+// "use strict";
+// // get some values:
+// var input = $(e.target);
+// var id = input.data('id');
+// var value = parseInt(input.val());
+// var spent = parseFloat($('#spent-' + id).data('value'));
+//
+// // update small display:
+// if (value > 0) {
+// // show the input:
+// $('#budget-info-' + id + ' span').show();
+// $('#budget-info-' + id + ' input').show();
+//
+// // update the text:
+// $('#budget-description-' + id).text('Budgeted: ');
+// } else {
+// // hide the input:
+// $('#budget-info-' + id + ' span').hide();
+// $('#budget-info-' + id + ' input').hide();
+//
+// // update the text:
+// $('#budget-description-' + id).html('
No budget');
+// }
+//
+// // update the range display text:
+// $('#budget-range-display-' + id).text('\u20AC ' + value.toFixed(2));
+//
+// // send a post to Firefly to update the amount:
+// $.post('budgets/amount/' + id, {amount: value, _token: token}).success(function (data) {
+// // update the link if relevant:
+// $('#budget-link-' + id).attr('href', 'budgets/show/' + id + '/' + data.repetition);
+// });
+// if (input.attr('type') === 'number') {
+// // update the range-input:
+// $('#budget-range-' + id).val(value);
+// } else {
+// // update the number-input:
+// $('#budget-info-' + id + ' input').val(value);
+// }
+//
+// // update or hide the bar, whichever is necessary.
+// updateTotal();
+// return value;
+//}
+//
+//function updateTotal() {
+// "use strict";
+// var sum = 0;
+// $('input[type="range"]').each(function (i, v) {
+// // get some values:
+// sum += parseInt($(v).val());
+// });
+//
+// /**
+// * Update total sum:
+// */
+// var totalAmount = parseInt($('#totalAmount').data('value'));
+// var pct;
+// if (sum <= totalAmount) {
+// pct = sum / totalAmount * 100;
+// $('#progress-bar-default').css('width', pct + '%');
+// $('#progress-bar-warning').css('width', '0');
+// $('#progress-bar-danger').css('width', '0');
+// $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-success').removeClass('text-danger');
+// } else {
+// // we gaan er X overheen,
+//
+// pct = totalAmount / sum * 100;
+// var danger = 100 - pct;
+// var err = 100 - danger;
+// $('#progress-bar-default').css('width', 0);
+// $('#progress-bar-warning').css('width', err + '%');
+// $('#progress-bar-danger').css('width', danger + '%');
+// $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-danger').removeClass('text-success');
+// }
+//
+//}
+//
+function updateIncome() {
+ "use strict";
$('#monthlyBudgetModal').empty().load('budgets/income', function () {
$('#monthlyBudgetModal').modal('show');
});
return false;
}
-
-function updateRanges() {
- /**
- * Update all ranges.
- */
- var sum = 0;
- $('input[type="range"]').each(function (i, v) {
- // get some values:
- var input = $(v);
- var id = input.data('id');
- var value = parseInt(input.val());
-
- // calculate sum:
- sum += value;
-
- // update small display:
- $('#budget-range-display-' + id).text('\u20AC ' + value.toFixed(2));
-
- // update progress bar (if relevant)
- var barHolder = $('#budget-progress-' + id);
- var spent = parseFloat(barHolder.data('spent'));
-
- // send a post to Firefly to update the amount:
- $.post('budgets/amount/' + id, {amount: value, _token: token}).success(function (data) {
- });
-
- });
-
- /**
- * Update total sum:
- */
- var totalAmount = parseInt($('#totalAmount').data('value'));
- if (sum <= totalAmount) {
- var pct = sum / totalAmount * 100;
- $('#progress-bar-default').css('width', pct + '%');
- $('#progress-bar-warning').css('width', '0');
- $('#progress-bar-danger').css('width', '0');
- $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-success').removeClass('text-danger');
- } else {
- // we gaan er X overheen,
-
- var pct = totalAmount / sum * 100;
- var danger = 100 - pct;
- var err = 100 - danger;
- $('#progress-bar-default').css('width', 0);
- $('#progress-bar-warning').css('width', err + '%');
- $('#progress-bar-danger').css('width', danger + '%');
- $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-danger').removeClass('text-success');
- }
-
-
-}
\ No newline at end of file
+//
+//function updateRanges() {
+// "use strict";
+//
+//
+// var sum = 0;
+// $('input[type="range"]').each(function (i, v) {
+// // get some values:
+// var input = $(v);
+// var id = input.data('id');
+// var value = parseInt(input.val());
+//
+// // calculate sum:
+// sum += value;
+//
+// // update small display:
+// $('#budget-range-display-' + id).text('\u20AC ' + value.toFixed(2));
+//
+// // send a post to Firefly to update the amount:
+// $.post('budgets/amount/' + id, {amount: value, _token: token});
+//
+// });
+//
+// /**
+// * Update total sum:
+// */
+// var totalAmount = parseInt($('#totalAmount').data('value'));
+// var pct;
+// if (sum <= totalAmount) {
+// pct = sum / totalAmount * 100;
+// $('#progress-bar-default').css('width', pct + '%');
+// $('#progress-bar-warning').css('width', '0');
+// $('#progress-bar-danger').css('width', '0');
+// $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-success').removeClass('text-danger');
+// } else {
+// // we gaan er X overheen,
+//
+// pct = totalAmount / sum * 100;
+// var danger = 100 - pct;
+// var err = 100 - danger;
+// $('#progress-bar-default').css('width', 0);
+// $('#progress-bar-warning').css('width', err + '%');
+// $('#progress-bar-danger').css('width', danger + '%');
+// $('#budgetedAmount').text('\u20AC ' + sum.toFixed(2)).addClass('text-danger').removeClass('text-success');
+// }
+//
+//
+//}
\ No newline at end of file
diff --git a/public/js/categories.js b/public/js/categories.js
index d4fb5c692f..073b8e2355 100644
--- a/public/js/categories.js
+++ b/public/js/categories.js
@@ -1,5 +1,6 @@
+/* globals $, categoryID */
$(function () {
-
+ "use strict";
if (typeof categoryID !== 'undefined') {
googleColumnChart('chart/category/' + categoryID + '/all', 'all');
googleColumnChart('chart/category/' + categoryID + '/month', 'month');
diff --git a/public/js/firefly.js b/public/js/firefly.js
index a8c075a761..c01a3269c7 100644
--- a/public/js/firefly.js
+++ b/public/js/firefly.js
@@ -1,8 +1,9 @@
+/* globals start, end, dateRangeURL, everything, firstDate, moment, currentMonthName, $, previousMonthName, nextMonthName, applyLabel, cancelLabel, toLabel, customRangeLabel, fromLabel, */
$(function () {
-
+ "use strict";
$('.currencySelect').click(currencySelect);
- ranges = {};
+ var ranges = {};
ranges[currentMonthName] = [moment().startOf('month'), moment().endOf('month')];
ranges[previousMonthName] = [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')];
ranges[nextMonthName] = [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')];
@@ -10,11 +11,6 @@ $(function () {
$('#daterange').daterangepicker(
{
- //View::share('currentMonthName', $current);
- //View::share('previousMonthName', $prev);
- //View::share('nextMonthName', $next);
-
-
ranges: ranges,
opens: 'left',
locale: {
@@ -54,6 +50,7 @@ $(function () {
});
function currencySelect(e) {
+ "use strict";
var target = $(e.target);
var symbol = target.data('symbol');
var code = target.data('code');
diff --git a/public/js/gcharts.js b/public/js/gcharts.js
index 065c4975ad..c51700d9b9 100644
--- a/public/js/gcharts.js
+++ b/public/js/gcharts.js
@@ -1,13 +1,16 @@
+/* globals currencyCode, language, defaultPieChartOptions, defaultLineChartOptions, defaultColumnChartOptions, defaultBarChartOptions, defaultStackedColumnChartOptions, defaultComboChartOptions */
+/* exported googleLineChart, googleBarChart, googleColumnChart, googleStackedColumnChart, googleComboChart, googlePieChart */
var google = google || {};
google.load('visualization', '1.1', {'packages': ['corechart', 'bar', 'line'],'language': language });
function googleChart(chartType, URL, container, options) {
+ "use strict";
if ($('#' + container).length === 1) {
$.getJSON(URL).success(function (data) {
/*
Get the data from the JSON
*/
- gdata = new google.visualization.DataTable(data);
+ var gdata = new google.visualization.DataTable(data);
/*
Format as money
@@ -67,25 +70,32 @@ function googleChart(chartType, URL, container, options) {
function googleLineChart(URL, container, options) {
+ "use strict";
return googleChart('line', URL, container, options);
}
+
function googleBarChart(URL, container, options) {
+ "use strict";
return googleChart('bar', URL, container, options);
}
function googleColumnChart(URL, container, options) {
+ "use strict";
return googleChart('column', URL, container, options);
}
function googleStackedColumnChart(URL, container, options) {
+ "use strict";
return googleChart('stackedColumn', URL, container, options);
}
function googleComboChart(URL, container, options) {
+ "use strict";
return googleChart('combo', URL, container, options);
}
function googlePieChart(URL, container, options) {
+ "use strict";
return googleChart('pie', URL, container, options);
}
diff --git a/public/js/gcharts.options.js b/public/js/gcharts.options.js
index b6cd11b95b..996c2849b8 100644
--- a/public/js/gcharts.options.js
+++ b/public/js/gcharts.options.js
@@ -1,3 +1,5 @@
+/* exported defaultLineChartOptions, defaultBarChartOptions, defaultComboChartOptions, defaultColumnChartOptions, defaultStackedColumnChartOptions, defaultPieChartOptions */
+
var defaultLineChartOptions = {
curveType: 'function',
legend: {
@@ -69,7 +71,7 @@ var defaultBarChartOptions = {
legend: {
position: 'none'
- },
+ }
};
var defaultComboChartOptions = {
@@ -127,7 +129,7 @@ var defaultColumnChartOptions = {
},
legend: {
position: 'none'
- },
+ }
};
var defaultStackedColumnChartOptions = {
diff --git a/public/js/help.js b/public/js/help.js
index cfe25448b4..d4762b43e8 100644
--- a/public/js/help.js
+++ b/public/js/help.js
@@ -1,13 +1,16 @@
$(function () {
+ "use strict";
$('#help').click(showHelp);
$(function () {
- $('[data-toggle="tooltip"]').tooltip()
- })
+
+ $('[data-toggle="tooltip"]').tooltip();
+ });
});
function showHelp(e) {
- target = $(e.target);
- route = target.data('route');
+ "use strict";
+ var target = $(e.target);
+ var route = target.data('route');
//
$('#helpBody').html('
');
$('#helpTitle').html('Please hold...');
diff --git a/public/js/index.js b/public/js/index.js
index ec5579ee23..6ca893aa6b 100644
--- a/public/js/index.js
+++ b/public/js/index.js
@@ -1,7 +1,9 @@
+/* globals google */
google.setOnLoadCallback(drawChart);
function drawChart() {
+ "use strict";
googleLineChart('chart/account/frontpage', 'accounts-chart');
googlePieChart('chart/bill/frontpage', 'bills-chart');
googleStackedColumnChart('chart/budget/frontpage', 'budgets-chart');
@@ -12,13 +14,20 @@ function drawChart() {
}
function getBoxAmounts() {
+ "use strict";
var boxes = ['in', 'out', 'bills-unpaid', 'bills-paid'];
- for (x in boxes) {
+ for (var x in boxes) {
var box = boxes[x];
- $.getJSON('/json/box/' + box).success(function (data) {
- $('#box-' + data.box).html(data.amount);
- }).fail(function () {
- console.log('Failed to get box!')
- });
+ $.getJSON('/json/box/' + box).success(putData).fail(failData);
}
}
+
+function putData(data) {
+ "use strict";
+ $('#box-' + data.box).html(data.amount);
+}
+
+function failData() {
+ "use strict";
+ console.log('Failed to get box!');
+}
\ No newline at end of file
diff --git a/public/js/piggy-banks.js b/public/js/piggy-banks.js
index cefb43d0f6..4e32a77eee 100644
--- a/public/js/piggy-banks.js
+++ b/public/js/piggy-banks.js
@@ -1,4 +1,19 @@
+/* globals $, googleLineChart, token */
+
+// Return a helper with preserved width of cells
+var fixHelper = function (e, tr) {
+ "use strict";
+ var $originals = tr.children();
+ var $helper = tr.clone();
+ $helper.children().each(function (index) {
+ // Set helper cell sizes to match the original sizes
+ $(this).width($originals.eq(index).width());
+ });
+ return $helper;
+};
+
$(function () {
+ "use strict";
$('.addMoney').on('click', addMoney);
$('.removeMoney').on('click', removeMoney);
@@ -31,18 +46,9 @@ $(function () {
);
});
-// Return a helper with preserved width of cells
-var fixHelper = function(e, tr) {
- var $originals = tr.children();
- var $helper = tr.clone();
- $helper.children().each(function (index) {
- // Set helper cell sizes to match the original sizes
- $(this).width($originals.eq(index).width());
- });
- return $helper;
-}
function addMoney(e) {
+ "use strict";
var pigID = parseInt($(e.target).data('id'));
$('#moneyManagementModal').empty().load('piggy-banks/add/' + pigID, function () {
$('#moneyManagementModal').modal('show');
@@ -52,6 +58,7 @@ function addMoney(e) {
}
function removeMoney(e) {
+ "use strict";
var pigID = parseInt($(e.target).data('id'));
$('#moneyManagementModal').empty().load('piggy-banks/remove/' + pigID, function () {
$('#moneyManagementModal').modal('show');
@@ -60,15 +67,15 @@ function removeMoney(e) {
return false;
}
function stopSorting() {
+ "use strict";
$('.loadSpin').addClass('fa fa-refresh fa-spin');
var order = [];
- $.each($('#sortable>tbody>tr'), function(i,v) {
+ $.each($('#sortable>tbody>tr'), function (i, v) {
var holder = $(v);
var id = holder.data('id');
order.push(id);
});
- $.post('/piggy-banks/sort',{_token: token, order: order}).success(function(data) {
- "use strict";
+ $.post('/piggy-banks/sort', {_token: token, order: order}).success(function () {
$('.loadSpin').removeClass('fa fa-refresh fa-spin');
});
}
\ No newline at end of file
diff --git a/public/js/reports.js b/public/js/reports.js
index 0517d4951d..36845910f6 100644
--- a/public/js/reports.js
+++ b/public/js/reports.js
@@ -1,9 +1,11 @@
-if (typeof(google) != 'undefined') {
+/* globals expenseRestShow:true, incomeRestShow:true, year, shared, month, hideTheRest, showTheRest, showTheRestExpense, hideTheRestExpense, googleColumnChart, googleLineChart, googleStackedColumnChartg */
+if (typeof(google) !== 'undefined') {
google.setOnLoadCallback(drawChart);
}
function drawChart() {
+ "use strict";
googleColumnChart('chart/report/in-out/' + year + shared, 'income-expenses-chart');
googleColumnChart('chart/report/in-out-sum/' + year + shared, 'income-expenses-sum-chart');
@@ -13,16 +15,8 @@ function drawChart() {
googleLineChart('/chart/account/month/' + year + '/' + month + shared, 'account-balances-chart');
}
-$(function () {
- $('.openModal').on('click', openModal);
- // click open the top X income list:
- $('#showIncomes').click(showIncomes);
- // click open the top X expense list:
- $('#showExpenses').click(showExpenses);
-});
-
function openModal(e) {
"use strict";
var target = $(e.target).parent();
@@ -61,6 +55,7 @@ function showIncomes() {
}
function showExpenses() {
+ "use strict";
if (expenseRestShow) {
// hide everything, make button say "show"
$('#showExpenses').text(showTheRestExpense);
@@ -78,4 +73,15 @@ function showExpenses() {
}
return false;
-}
\ No newline at end of file
+}
+
+$(function () {
+ "use strict";
+ $('.openModal').on('click', openModal);
+
+
+ // click open the top X income list:
+ $('#showIncomes').click(showIncomes);
+ // click open the top X expense list:
+ $('#showExpenses').click(showExpenses);
+});
\ No newline at end of file
diff --git a/public/js/tags.js b/public/js/tags.js
index f099ec1ee2..c87f6b8cb7 100644
--- a/public/js/tags.js
+++ b/public/js/tags.js
@@ -1,5 +1,6 @@
+/* globals zoomLevel, token, google, latitude, longitude */
$(function () {
-
+ "use strict";
/*
Hide and show the tag index help.
*/
@@ -47,7 +48,7 @@ function clearLocation() {
}
function initialize() {
-
+ "use strict";
/*
Create new map:
*/
@@ -91,6 +92,7 @@ function saveZoomLevel() {
* @param event
*/
function placeMarker(event) {
+ "use strict";
deleteMarkers();
var marker = new google.maps.Marker({position: event.latLng, map: map});
$('input[name="latitude"]').val(event.latLng.lat());
@@ -105,6 +107,7 @@ function placeMarker(event) {
* Deletes all markers in the array by removing references to them.
*/
function deleteMarkers() {
+ "use strict";
for (var i = 0; i < markers.length; i++) {
markers[i].setMap(null);
}
diff --git a/public/js/transactions.js b/public/js/transactions.js
index 20e7b6eaee..b9cee1ded4 100644
--- a/public/js/transactions.js
+++ b/public/js/transactions.js
@@ -1,8 +1,6 @@
+/* globals what, $ */
$(document).ready(function () {
- if (typeof googleTablePaged != 'undefined') {
- googleTablePaged('table/transactions/' + what, 'transaction-table');
- }
-
+ "use strict";
if ($('input[name="expense_account"]').length > 0) {
$.getJSON('json/expense-accounts').success(function (data) {
$('input[name="expense_account"]').typeahead({source: data});
@@ -28,7 +26,7 @@ $(document).ready(function () {
});
}
- if ($('input[name="description"]').length > 0 && what != undefined) {
+ if ($('input[name="description"]').length > 0 && what !== undefined) {
$.getJSON('json/transaction-journals/' + what).success(function (data) {
$('input[name="description"]').typeahead({source: data});
});
diff --git a/resources/assets/less/bootstrap/dropdowns.less b/resources/assets/less/bootstrap/dropdowns.less
index 84a48c1413..6dfc096e4a 100644
--- a/resources/assets/less/bootstrap/dropdowns.less
+++ b/resources/assets/less/bootstrap/dropdowns.less
@@ -176,7 +176,6 @@
// Allow for dropdowns to go bottom up (aka, dropup-menu)
//
// Just add .dropup after the standard .dropdown class and you're set, bro.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown {
diff --git a/resources/assets/less/bootstrap/variables.less b/resources/assets/less/bootstrap/variables.less
index b13be9d449..ab182cab22 100644
--- a/resources/assets/less/bootstrap/variables.less
+++ b/resources/assets/less/bootstrap/variables.less
@@ -185,7 +185,6 @@
//** `
` border color
@input-border: #ccc;
-// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
//** Default `.form-control` border radius
@input-border-radius: @border-radius-base;
//** Large `.form-control` border radius
diff --git a/resources/lang/en/firefly.php b/resources/lang/en/firefly.php
index 585b498ff9..adc4d7176c 100644
--- a/resources/lang/en/firefly.php
+++ b/resources/lang/en/firefly.php
@@ -1,37 +1,44 @@
'You have selected English.',
'close' => 'Close',
'pleaseHold' => 'Please hold...',
- 'mandatoryFields' => 'Mandatory fields',
- 'optionalFields' => 'Optional fields',
- 'options' => 'Options',
- 'something' => 'Something!',
'actions' => 'Actions',
'edit' => 'Edit',
'delete' => 'Delete',
'welcomeBack' => 'What\'s playing?',
-
'everything' => 'Everything',
'customRange' => 'Custom range',
'apply' => 'Apply',
'cancel' => 'Cancel',
'from' => 'From',
'to' => 'To',
-
'showEverything' => 'Show everything',
+
+ // forms:
+ 'mandatoryFields' => 'Mandatory fields',
+ 'optionalFields' => 'Optional fields',
+ 'options' => 'Options',
+ 'something' => 'Something!',
+
+ // budgets:
'create_new_budget' => 'Create a new budget',
'store_new_budget' => ' Store new budget',
-
'availableIn' => 'Available in :date',
'transactionsWithoutBudget' => 'Expenses without budget',
'transactionsWithoutBudgetDate' => 'Expenses without budget in :date',
'createBudget' => 'New budget',
'inactiveBudgets' => 'Inactive budgets',
+ 'without_budget_between' => 'Transactions without a budget between :start and :end',
+ 'budget_in_month' => ':name in :month',
+ 'delete_budget' => 'Delete budget ":name"',
+
+ // bills:
+ 'delete_bill' => 'Delete bill ":name"',
// accounts:
-
'details_for_asset' => 'Details for asset account ":name"',
'details_for_expense' => 'Details for expense account ":name"',
'details_for_revenue' => 'Details for revenue account ":name"',
@@ -57,9 +64,17 @@ return [
'update_expense_account' => 'Update expense account',
'update_revenue_account' => 'Update revenue account',
- 'make_new_asset_account' => 'New asset account',
- 'make_new_expense_account' => 'New expense account',
- 'make_new_revenue_account' => 'New revenue account',
+ 'make_new_asset_account' => 'Create a new asset account',
+ 'make_new_expense_account' => 'Create a new expense account',
+ 'make_new_revenue_account' => 'Create a new revenue account',
+
+ 'asset_accounts' => 'Asset accounts',
+ 'expense_accounts' => 'Expense accounts',
+ 'revenue_accounts' => 'Revenue accounts',
+
+ 'accountExtraHelp_asset' => '',
+ 'accountExtraHelp_expense' => '',
+ 'accountExtraHelp_revenue' => '',
// categories:
'new_category' => 'New category',
@@ -68,10 +83,20 @@ return [
'categories' => 'Categories',
'no_category' => '(no category)',
'category' => 'Category',
+ 'delete_category' => 'Delete category ":name"',
+
+ // transactions:
+ 'update_withdrawal' => 'Update withdrawal',
+ 'update_deposit' => 'Update deposit',
+ 'update_transfer' => 'Update transfer',
+ 'delete_withdrawal' => 'Delete withdrawal ":description"',
+ 'delete_deposit' => 'Delete deposit ":description"',
+ 'delete_transfer' => 'Delete transfer ":description"',
// new user:
'welcome' => 'Welcome to Firefly!',
- 'createNewAsset' => 'Create a new asset account to get started. This will allow you to create transactions and start your financial management',
+ 'createNewAsset' => 'Create a new asset account to get started. ' .
+ 'This will allow you to create transactions and start your financial management',
'createNewAssetButton' => 'Create new asset account',
// home page:
@@ -122,11 +147,12 @@ return [
'createNew' => 'Create new',
'withdrawal' => 'Withdrawal',
'deposit' => 'Deposit',
+ 'account' => 'Account',
'transfer' => 'Transfer',
'Withdrawal' => 'Withdrawal',
'Deposit' => 'Deposit',
'Transfer' => 'Transfer',
- 'bill' => 'Rekening',
+ 'bill' => 'Bill',
'yes' => 'Yes',
'no' => 'No',
'amount' => 'Amount',
@@ -141,6 +167,7 @@ return [
'half-year' => 'Every six months',
'yearly' => 'Yearly',
+ // reports:
'reportForYear' => 'Yearly report for :year',
'reportForYearShared' => 'Yearly report for :year (including shared accounts)',
'reportForMonth' => 'Montly report for :year',
@@ -151,15 +178,10 @@ return [
'balanceEndOfYear' => 'Balance at end of year',
'balanceStartOfMonth' => 'Balance at end of month',
'balanceEndOfMonth' => 'Balance at end of month',
-
'balanceStart' => 'Balance at end of period',
'balanceEnd' => 'Balance at end of period',
-
'reportsOwnAccounts' => 'Reports for your own accounts',
'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts',
-
- 'account' => 'Account',
-
'splitByAccount' => 'Split by account',
'balancedByTransfersAndTags' => 'Balanced by transfers and tags',
'coveredWithTags' => 'Covered with tags',
@@ -167,11 +189,9 @@ return [
'expectedBalance' => 'Expected balance',
'outsideOfBudgets' => 'Outside of budgets',
'leftInBudget' => 'Left in budget',
-
'sumOfSums' => 'Sum of sums',
'notCharged' => 'Not charged (yet)',
'inactive' => 'Inactive',
-
'difference' => 'Difference',
'in' => 'In',
'out' => 'Out',
@@ -203,12 +223,40 @@ return [
'average' => 'Average',
'balanceFor' => 'Balance for :name',
- 'asset_accounts' => 'Asset accounts',
- 'expense_accounts' => 'Expense accounts',
- 'revenue_accounts' => 'Revenue accounts',
+ // piggy banks:
+ 'new_piggy_bank' => 'Create new piggy bank',
+ 'account_status' => 'Account status',
+ 'left_for_piggy_banks' => 'Left for piggy banks',
+ 'sum_of_piggy_banks' => 'Sum of piggy banks',
+ 'saved_so_far' => 'Saved so far',
+ 'left_to_save' => 'Left to save',
+ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"',
+ 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
+ 'add' => 'Add',
+ 'remove' => 'Remove',
+ 'max_amount_add' => 'The maximum amount you can add is',
+ 'max_amount_remove' => 'The maximum amount you can remove is',
+ 'update_piggy_button' => 'Update piggy bank',
+ 'update_piggy_title' => 'Update piggy bank ":name"',
+ 'details' => 'Details',
+ 'events' => 'Events',
+ 'target_amount' => 'Target amount',
+ 'start_date' => 'Start date',
+ 'target_date' => 'Target date',
+ 'no_target_date' => 'No target date',
+ 'reminder' => 'Reminder',
+ 'no_reminder' => 'No reminder',
+ 'reminders_left' => 'Reminders left',
+ 'expected_amount_per_reminder' => 'Expected amount per reminder',
+ 'todo' => 'to do',
+ 'table' => 'Table',
+ 'piggy_bank_not_exists' => 'Piggy bank no longer exists.',
+ 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.',
+ 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date',
+ 'delete_piggy_bank' => 'Delete piggy bank ":name"',
+
+ // tags
+ 'delete_tag' => 'Delete tag ":name"',
+
- // some extra help:
- 'accountExtraHelp_asset' => '',
- 'accountExtraHelp_expense' => '',
- 'accountExtraHelp_revenue' => '',
];
diff --git a/resources/lang/nl/firefly.php b/resources/lang/nl/firefly.php
index ebdec72321..5035174ae5 100644
--- a/resources/lang/nl/firefly.php
+++ b/resources/lang/nl/firefly.php
@@ -1,37 +1,44 @@
'Nederlands geselecteerd!',
'close' => 'Sluiten',
'pleaseHold' => 'Momentje...',
- 'mandatoryFields' => 'Verplichte velden',
- 'optionalFields' => 'Optionele velden',
- 'options' => 'Opties',
- 'something' => 'Iets!',
'actions' => 'Acties',
'edit' => 'Wijzig',
'delete' => 'Verwijder',
'welcomeBack' => 'Hoe staat het er voor?',
-
'everything' => 'Alles',
'customRange' => 'Zelf bereik kiezen',
'apply' => 'Go',
'cancel' => 'Annuleren',
'from' => 'Van',
'to' => 'Tot',
-
'showEverything' => 'Laat alles zien',
+
+ // forms:
+ 'mandatoryFields' => 'Verplichte velden',
+ 'optionalFields' => 'Optionele velden',
+ 'options' => 'Opties',
+ 'something' => 'Iets!',
+
+ // budgets:
'create_new_budget' => 'Maak een nieuw budget',
'store_new_budget' => 'Sla nieuw budget op',
-
'availableIn' => 'Beschikbaar in :date',
'transactionsWithoutBudget' => 'Uitgaven zonder budget',
'transactionsWithoutBudgetDate' => 'Uitgaven zonder budget in :date',
'createBudget' => 'Maak nieuw budget',
'inactiveBudgets' => 'Inactieve budgetten',
+ 'without_budget_between' => 'Transacties zonder budget tussen :start en :end',
+ 'budget_in_month' => ':name in :month',
+ 'delete_budget' => 'Verwijder budget ":name"',
+
+ // bills:
+ 'delete_bill' => 'Verwijder rekening ":name"',
// accounts:
-
'details_for_asset' => 'Overzicht voor betaalrekening ":name"',
'details_for_expense' => 'Overzicht voor crediteur ":name"',
'details_for_revenue' => 'Overzicht voor debiteur ":name"',
@@ -61,6 +68,23 @@ return [
'make_new_expense_account' => 'Nieuwe crediteur',
'make_new_revenue_account' => 'Nieuwe debiteur',
+ 'asset_accounts' => 'Betaalrekeningen',
+ 'expense_accounts' => 'Crediteuren',
+ 'revenue_accounts' => 'Debiteuren',
+
+ // some extra help:
+ 'accountExtraHelp_asset' => '',
+ 'accountExtraHelp_expense' =>
+ 'Een crediteur is een persoon of een bedrijf waar je geld aan moet betalen. Je staat bij ze in het krijt. Een verwarrende' .
+ ' term misschien, maar zo werkt het nou eenmaal. De supermarkt, je huurbaas of de bank zijn crediteuren. Jouw ' .
+ 'geld (krediet) gaat naar hen toe. De term komt uit de wereld van de boekhouding. De uitgaves die je hier ziet zijn ' .
+ 'positief, want je kijkt uit hun perspectief. Zodra jij afrekent in een winkel, komt het geld er bij hen bij (positief).',
+ 'accountExtraHelp_revenue' => 'Als je geld krijgt van een bedrijf of een persoon is dat een debiteur. ' .
+ 'Dat kan salaris zijn, of een andere betaling. ' .
+ ' Ze hebben een schuld (debet) aan jou. De term komt uit de wereld van de boekhouding.' .
+ ' De inkomsten die je hier ziet zijn negatief, want je kijkt uit hun perspectief. Zodra een debiteur geld naar jou ' .
+ 'overmaakt gaat het er bij hen af (negatief).',
+
// categories:
'new_category' => 'Nieuwe categorie',
'without_category' => 'Zonder categorie',
@@ -68,12 +92,22 @@ return [
'categories' => 'Categorieƫn',
'no_category' => '(geen categorie)',
'category' => 'Categorie',
+ 'delete_category' => 'Verwijder categorie ":name"',
+
+ // transactions:
+ 'update_withdrawal' => 'Wijzig uitgave',
+ 'update_deposit' => 'Wijzig inkomsten',
+ 'update_transfer' => 'Wijzig overschrijving',
+ 'delete_withdrawal' => 'Verwijder uitgave ":description"',
+ 'delete_deposit' => 'Verwijder inkomsten ":description"',
+ 'delete_transfer' => 'Verwijder overschrijving ":description"',
// new user:
'welcome' => 'Welkom bij Firefly!',
'createNewAsset' => 'Maak om te beginnen een nieuwe betaalrekening. Dit is je start van je financiƫle beheer.',
'createNewAssetButton' => 'Maak een nieuwe betaalrekening',
+
// home page:
'yourAccounts' => 'Je betaalrekeningen',
'budgetsAndSpending' => 'Budgetten en uitgaven',
@@ -122,6 +156,7 @@ return [
'createNew' => 'Nieuw',
'withdrawal' => 'Uitgave',
'deposit' => 'Inkomsten',
+ 'account' => 'Rekening',
'transfer' => 'Overschrijving',
'Withdrawal' => 'Uitgave',
'Deposit' => 'Inkomsten',
@@ -141,6 +176,7 @@ return [
'half-year' => 'Elk half jaar',
'yearly' => 'Jaarlijks',
+ // reports:
'reportForYear' => 'Jaaroverzicht :year',
'reportForYearShared' => 'Jaaroverzicht :year (inclusief gedeelde rekeningen)',
'reportForMonth' => 'Maandoverzicht van :date',
@@ -151,15 +187,10 @@ return [
'balanceEndOfYear' => 'Saldo aan het einde van het jaar',
'balanceStartOfMonth' => 'Saldo aan het begin van de maand',
'balanceEndOfMonth' => 'Saldo aan het einde van de maand',
-
'balanceStart' => 'Saldo aan het begin van de periode',
'balanceEnd' => 'Saldo aan het einde van de periode',
-
'reportsOwnAccounts' => 'Overzichten voor je eigen betaalrekeningen',
'reportsOwnAccountsAndShared' => 'Overzichten voor je eigen betaalrekeningen en gedeelde rekeningen',
-
- 'account' => 'Rekening',
-
'splitByAccount' => 'Per betaalrekening',
'balancedByTransfersAndTags' => 'Gecorrigeerd met overschrijvingen en tags',
'coveredWithTags' => 'Gecorrigeerd met tags',
@@ -167,11 +198,9 @@ return [
'expectedBalance' => 'Verwacht saldo',
'outsideOfBudgets' => 'Buiten budgetten',
'leftInBudget' => 'Over van budget',
-
'sumOfSums' => 'Alles bij elkaar',
'notCharged' => '(Nog) niet betaald',
'inactive' => 'Niet actief',
-
'difference' => 'Verschil',
'in' => 'In',
'out' => 'Uit',
@@ -203,20 +232,38 @@ return [
'average' => 'Gemiddeld',
'balanceFor' => 'Saldo op :name',
- 'asset_accounts' => 'Betaalrekeningen',
- 'expense_accounts' => 'Crediteuren',
- 'revenue_accounts' => 'Debiteuren',
+ // piggy banks:
+ 'new_piggy_bank' => 'Nieuw spaarpotje',
+ 'account_status' => 'Rekeningoverzicht',
+ 'left_for_piggy_banks' => 'Over voor spaarpotjes',
+ 'sum_of_piggy_banks' => 'Som van spaarpotjes',
+ 'saved_so_far' => 'Gespaard',
+ 'left_to_save' => 'Te sparen',
+ 'add_money_to_piggy_title' => 'Stop geld in spaarpotje ":name"',
+ 'remove_money_from_piggy_title' => 'Haal geld uit spaarpotje ":name"',
+ 'add' => 'Toevoegen',
+ 'remove' => 'Verwijderen',
+ 'max_amount_add' => 'Hooguit toe te voegen',
+ 'max_amount_remove' => 'Hooguit te verwijderen',
+ 'update_piggy_button' => 'Wijzig spaarpotje',
+ 'update_piggy_title' => 'Wijzig spaarpotje ":name"',
+ 'details' => 'Details',
+ 'events' => 'Gebeurtenissen',
+ 'target_amount' => 'Doelbedrag',
+ 'start_date' => 'Startdatum',
+ 'target_date' => 'Doeldatum',
+ 'no_target_date' => 'Geen doeldatum',
+ 'reminder' => 'Herinnering',
+ 'no_reminder' => 'Geen herinnering',
+ 'reminders_left' => 'Herinneringen te gaan',
+ 'expected_amount_per_reminder' => 'Verwacht bedrag per herinnering',
+ 'todo' => 'te doen',
+ 'table' => 'Tabel',
+ 'add_any_amount_to_piggy' => 'Stop geld in dit spaarpotje om het doel van :amount te halen.',
+ 'add_set_amount_to_piggy' => 'Stop voor :date :amount in dit spaarpotje om hem op tijd te vullen.',
+ 'delete_piggy_bank' => 'Verwijder spaarpotje ":name"',
+
+ // tags
+ 'delete_tag' => 'Verwijder tag ":name"',
- // some extra help:
- 'accountExtraHelp_asset' => '',
- 'accountExtraHelp_expense' =>
- 'Een crediteur is een persoon of een bedrijf waar je geld aan moet betalen. Je staat bij ze in het krijt. Een verwarrende' .
- ' term misschien, maar zo werkt het nou eenmaal. De supermarkt, je huurbaas of de bank zijn crediteuren. Jouw ' .
- 'geld (krediet) gaat naar hen toe. De term komt uit de wereld van de boekhouding. De uitgaves die je hier ziet zijn ' .
- 'positief, want je kijkt uit hun perspectief. Zodra jij afrekent in een winkel, komt het geld er bij hen bij (positief).',
- 'accountExtraHelp_revenue' => 'Als je geld krijgt van een bedrijf of een persoon is dat een debiteur. ' .
- 'Dat kan salaris zijn, of een andere betaling. ' .
- ' Ze hebben een schuld (debet) aan jou. De term komt uit de wereld van de boekhouding.' .
- ' De inkomsten die je hier ziet zijn negatief, want je kijkt uit hun perspectief. Zodra een debiteur geld naar jou ' .
- 'overmaakt gaat het er bij hen af (negatief).',
];
diff --git a/resources/twig/budgets/index.twig b/resources/twig/budgets/index.twig
index 6de86a80d3..5601d04dc3 100644
--- a/resources/twig/budgets/index.twig
+++ b/resources/twig/budgets/index.twig
@@ -11,23 +11,20 @@
- {{ 'budgeted'|_ }}:
+ {{ 'budgeted'|_ }}: {{ budgeted|formatAmountPlain }}
-
- {% if overspent %}
-
-
- {% else %}
-
- {% endif %}
+
@@ -80,76 +71,48 @@
-
+
{% endfor %}
@@ -191,5 +154,15 @@
{% endblock %}
{% block scripts %}
+
+
{% endblock %}
diff --git a/resources/twig/errors/503.twig b/resources/twig/errors/503.twig
index 0847a1c967..5077f3679d 100644
--- a/resources/twig/errors/503.twig
+++ b/resources/twig/errors/503.twig
@@ -37,5 +37,18 @@
Be right back.
+
+
+
+