diff --git a/README.md b/README.md index a481de8..af24b46 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ User App is a Dhis2 Web Application that provides an easy and integrated way to ## Features -- Landing page: it displays a list of users with some attributes information. The list allows sorting by some fields (click the column header) and single/multiple selections. You can also filter by name, role, groups and see only users you can manage. -- Show details: it behaves as the regular show details in any Dhis2 instance. It shows a right side panel with some information about the user. This is also the action by default when clicking a row. -- Assign to organisation units: Implemented for single and multiple selections* allows setting Data capture and maintenance organisation units. -- Assign to organisation units output: Implemented for single and multiple selections* allows setting Data output and analysis organisation units. -- Assign roles: Implemented for single and multiple selections* allows assigning the roles to a user/s. -- Assign to groups: Implemented for single and multiple selections* allows assigning the user groups for a user/s. -- Shortcut to regular dhis2 user management app -- Replicate user: Implemented for single mode allows creating multiple users using a single users as starting point. Currently, two modes are available: 'From Template' and 'From table'. +- Landing page: it displays a list of users with some attributes information. The list allows sorting by some fields (click the column header) and single/multiple selections. You can also filter by name, role, groups and see only users you can manage. +- Show details: it behaves as the regular show details in any Dhis2 instance. It shows a right side panel with some information about the user. This is also the action by default when clicking a row. +- Assign to organisation units capture: Implemented for single and multiple selections\* allows setting Data capture and maintenance organisation units. +- Assign to organisation units output: Implemented for single and multiple selections\* allows setting Data output and analysis organisation units. +- Assign roles: Implemented for single and multiple selections\* allows assigning the roles to a user/s. +- Assign to groups: Implemented for single and multiple selections\* allows assigning the user groups for a user/s. +- Shortcut to regular dhis2 user management app +- Replicate user: Implemented for single mode allows creating multiple users using a single users as starting point. Currently, two modes are available: 'From Template' and 'From table'. \*In single mode, it works as the regular Dhis2 vanilla feature. For multiple selections, the changes can be saved using one of two strategies: merge or replace. The merge strategy will add the selected entities (organisation units, roles, etc) to the current values each user had, no values will be removed. Replace on the other hand overwrites any previous values and keep only those selected in this dialog. diff --git a/css/font-awesome/css/font-awesome.min.css b/css/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/css/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/css/font-awesome/fonts/FontAwesome.otf b/css/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/css/font-awesome/fonts/FontAwesome.otf differ diff --git a/css/font-awesome/fonts/fontawesome-webfont.eot b/css/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/css/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/css/font-awesome/fonts/fontawesome-webfont.svg b/css/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d907b25 --- /dev/null +++ b/css/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/font-awesome/fonts/fontawesome-webfont.ttf b/css/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/css/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/css/font-awesome/fonts/fontawesome-webfont.woff b/css/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/css/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/css/fonts/LiberationSans-Bold-webfont.eot b/css/fonts/LiberationSans-Bold-webfont.eot new file mode 100644 index 0000000..35fbccd Binary files /dev/null and b/css/fonts/LiberationSans-Bold-webfont.eot differ diff --git a/css/fonts/LiberationSans-Bold-webfont.svg b/css/fonts/LiberationSans-Bold-webfont.svg new file mode 100644 index 0000000..47a2314 --- /dev/null +++ b/css/fonts/LiberationSans-Bold-webfont.svg @@ -0,0 +1,154 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/fonts/LiberationSans-Bold-webfont.ttf b/css/fonts/LiberationSans-Bold-webfont.ttf new file mode 100644 index 0000000..24a4eff Binary files /dev/null and b/css/fonts/LiberationSans-Bold-webfont.ttf differ diff --git a/css/fonts/LiberationSans-Bold-webfont.woff b/css/fonts/LiberationSans-Bold-webfont.woff new file mode 100644 index 0000000..6e9d870 Binary files /dev/null and b/css/fonts/LiberationSans-Bold-webfont.woff differ diff --git a/css/fonts/LiberationSans-Regular-webfont.eot b/css/fonts/LiberationSans-Regular-webfont.eot new file mode 100644 index 0000000..ca5f4a4 Binary files /dev/null and b/css/fonts/LiberationSans-Regular-webfont.eot differ diff --git a/css/fonts/LiberationSans-Regular-webfont.svg b/css/fonts/LiberationSans-Regular-webfont.svg new file mode 100644 index 0000000..193d756 --- /dev/null +++ b/css/fonts/LiberationSans-Regular-webfont.svg @@ -0,0 +1,262 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/fonts/LiberationSans-Regular-webfont.ttf b/css/fonts/LiberationSans-Regular-webfont.ttf new file mode 100644 index 0000000..0d28f4a Binary files /dev/null and b/css/fonts/LiberationSans-Regular-webfont.ttf differ diff --git a/css/fonts/LiberationSans-Regular-webfont.woff b/css/fonts/LiberationSans-Regular-webfont.woff new file mode 100644 index 0000000..9fff1a7 Binary files /dev/null and b/css/fonts/LiberationSans-Regular-webfont.woff differ diff --git a/css/fonts/padauk-bold-webfont.eot b/css/fonts/padauk-bold-webfont.eot new file mode 100644 index 0000000..26093f6 Binary files /dev/null and b/css/fonts/padauk-bold-webfont.eot differ diff --git a/css/fonts/padauk-bold-webfont.svg b/css/fonts/padauk-bold-webfont.svg new file mode 100644 index 0000000..92538d6 --- /dev/null +++ b/css/fonts/padauk-bold-webfont.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/fonts/padauk-bold-webfont.ttf b/css/fonts/padauk-bold-webfont.ttf new file mode 100644 index 0000000..6a5d403 Binary files /dev/null and b/css/fonts/padauk-bold-webfont.ttf differ diff --git a/css/fonts/padauk-bold-webfont.woff b/css/fonts/padauk-bold-webfont.woff new file mode 100644 index 0000000..5c1fcdd Binary files /dev/null and b/css/fonts/padauk-bold-webfont.woff differ diff --git a/css/fonts/padauk-webfont.eot b/css/fonts/padauk-webfont.eot new file mode 100644 index 0000000..5b1a269 Binary files /dev/null and b/css/fonts/padauk-webfont.eot differ diff --git a/css/fonts/padauk-webfont.svg b/css/fonts/padauk-webfont.svg new file mode 100644 index 0000000..9e1c1e9 --- /dev/null +++ b/css/fonts/padauk-webfont.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/fonts/padauk-webfont.ttf b/css/fonts/padauk-webfont.ttf new file mode 100644 index 0000000..aff6a06 Binary files /dev/null and b/css/fonts/padauk-webfont.ttf differ diff --git a/css/fonts/padauk-webfont.woff b/css/fonts/padauk-webfont.woff new file mode 100644 index 0000000..deddae4 Binary files /dev/null and b/css/fonts/padauk-webfont.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot new file mode 100644 index 0000000..949f90c Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg new file mode 100644 index 0000000..d1e02c3 --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf new file mode 100644 index 0000000..231fe5b Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff new file mode 100644 index 0000000..48f3bfd Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 new file mode 100644 index 0000000..b359a9c Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2 differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot new file mode 100644 index 0000000..488d2a9 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.svg new file mode 100644 index 0000000..52b2832 --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.svg @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf new file mode 100644 index 0000000..183072b Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff new file mode 100644 index 0000000..c94ed97 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff2 new file mode 100644 index 0000000..091b412 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff2 differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot new file mode 100644 index 0000000..73a0dd1 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg new file mode 100644 index 0000000..2b98916 --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf new file mode 100644 index 0000000..28a6a07 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff new file mode 100644 index 0000000..a4891eb Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff2 new file mode 100644 index 0000000..7be7c33 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff2 differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot new file mode 100644 index 0000000..b38d2c1 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.svg new file mode 100644 index 0000000..fc8d42f --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf new file mode 100644 index 0000000..8a2825f Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff new file mode 100644 index 0000000..e4dd762 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 new file mode 100644 index 0000000..4d7272a Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2 differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot new file mode 100644 index 0000000..734b92e Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg new file mode 100644 index 0000000..65a4c0e --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf new file mode 100644 index 0000000..1077c72 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff new file mode 100644 index 0000000..f0107f9 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 new file mode 100644 index 0000000..3fd24c3 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2 differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot new file mode 100644 index 0000000..474eca1 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.svg b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.svg new file mode 100644 index 0000000..ed55c10 --- /dev/null +++ b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf new file mode 100644 index 0000000..7cb17c9 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff new file mode 100644 index 0000000..37da772 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff differ diff --git a/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 new file mode 100644 index 0000000..70994a2 Binary files /dev/null and b/css/fonts/roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2 differ diff --git a/css/fonts/roboto.css b/css/fonts/roboto.css new file mode 100644 index 0000000..beb81dc --- /dev/null +++ b/css/fonts/roboto.css @@ -0,0 +1,72 @@ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot'); + src: local('Roboto Thin'), local('Roboto-Thin'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-100.svg#Roboto') format('svg'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot'); + src: local('Roboto Light'), local('Roboto-Light'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-300.svg#Roboto') format('svg'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot'); + src: local('Roboto'), local('Roboto-Regular'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-regular.svg#Roboto') format('svg'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot'); + src: local('Roboto Medium'), local('Roboto-Medium'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-500.svg#Roboto') format('svg'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot'); + src: local('Roboto Bold'), local('Roboto-Bold'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-700.svg#Roboto') format('svg'); +} +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 900; + src: url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot'); + src: local('Roboto Black'), local('Roboto-Black'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.eot?#iefix') format('embedded-opentype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff2') format('woff2'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.woff') format('woff'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.ttf') format('truetype'), + url('roboto-v15-latin-ext_latin/roboto-v15-latin-ext_latin-900.svg#Roboto') format('svg'); +} \ No newline at end of file diff --git a/css/material-design-icons/MaterialIcons-Regular.eot b/css/material-design-icons/MaterialIcons-Regular.eot new file mode 100644 index 0000000..70508eb Binary files /dev/null and b/css/material-design-icons/MaterialIcons-Regular.eot differ diff --git a/css/material-design-icons/MaterialIcons-Regular.ttf b/css/material-design-icons/MaterialIcons-Regular.ttf new file mode 100644 index 0000000..7015564 Binary files /dev/null and b/css/material-design-icons/MaterialIcons-Regular.ttf differ diff --git a/css/material-design-icons/MaterialIcons-Regular.woff b/css/material-design-icons/MaterialIcons-Regular.woff new file mode 100644 index 0000000..a0bfd17 Binary files /dev/null and b/css/material-design-icons/MaterialIcons-Regular.woff differ diff --git a/css/material-design-icons/MaterialIcons-Regular.woff2 b/css/material-design-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000..20f1f67 Binary files /dev/null and b/css/material-design-icons/MaterialIcons-Regular.woff2 differ diff --git a/css/material-design-icons/material-icons.css b/css/material-design-icons/material-icons.css new file mode 100644 index 0000000..43c889d --- /dev/null +++ b/css/material-design-icons/material-icons.css @@ -0,0 +1,38 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + width: 1em; + height: 1em; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/package.json b/package.json index a15b5a6..b4c822c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "d2-user-extended-app", - "version": "0.5.0", + "version": "0.6.0", "description": "DHIS2 Extended User app", "main": "src/index.html", "license": "GPL-3.0", @@ -17,7 +17,7 @@ "lint": "eslint src && eslint --env node,mocha --global expect,sinon --rule 'no-unused-expressions: 0' test && scss-lint", "__prebuild": "npm test && npm run lint", "build": "rm -rf build && webpack && npm run manifest", - "postbuild": "cp -rv app-config.json src/i18n includes icon.png app-favicon.ico node_modules/babel-polyfill/dist/polyfill.min.js node_modules/jquery/dist/jquery.min.js ./build/", + "postbuild": "cp -rv app-config.json src/i18n css includes icon.png app-favicon.ico node_modules/babel-polyfill/dist/polyfill.min.js node_modules/jquery/dist/jquery.min.js ./build/", "build-webapp": "yarn build && rm -f User-Extended-App.zip && cd build && zip -r ../User-Extended-App.zip *", "prettify": "prettier \"{src,scss}/**/*.{js,jsx,ts,tsx,json,css,scss}\" --write", "validate": "npm ls", diff --git a/src/List/Filters.component.js b/src/List/Filters.component.js index e57e2e3..a668184 100644 --- a/src/List/Filters.component.js +++ b/src/List/Filters.component.js @@ -120,8 +120,8 @@ export default class Filters extends React.Component { const inFilter = field => (_(field).isEmpty() ? null : ["in", field]); return { - query: searchString, ...(showOnlyManagedUsers ? { canManage: "true" } : {}), + ...(searchString ? { query: searchString } : {}), filters: { "userCredentials.disabled": showOnlyActiveUsers ? ["eq", false] : undefined, "userCredentials.userRoles.id": inFilter(userRoles), @@ -265,7 +265,9 @@ export default class Filters extends React.Component {
assignToOrgUnits(users, "organisationUnits", "assignToOrgUnits"), + onClick: users => assignToOrgUnits(users, "organisationUnits", "assignToOrgUnitsCapture"), allowed: checkAccess(["update"]), }, { diff --git a/src/components/MultipleSelector.component.js b/src/components/MultipleSelector.component.js index ff0b191..be48081 100644 --- a/src/components/MultipleSelector.component.js +++ b/src/components/MultipleSelector.component.js @@ -78,7 +78,7 @@ class MultipleSelector extends React.Component { titleByField = { userGroups: "assignGroups", userRoles: "assignRoles", - organisationUnits: "assignToOrgUnits", + organisationUnitsCapture: "assignToOrgUnitsCapture", dataViewOrganisationUnits: "assignToOrgUnitsOutput", }; @@ -102,7 +102,7 @@ class MultipleSelector extends React.Component { onChange={this.onMultiSelectChange} /> ); - case "organisationUnits": + case "organisationUnitsCapture": case "dataViewOrganisationUnits": return ( this._searchOrganisationUnits(event.target.value)} floatingLabelText={this.context.d2.i18n.getTranslation( - "filter_organisation_units_by_name" + "filter_organisation_units_capture_by_name" )} fullWidth /> @@ -201,7 +201,7 @@ class OrgUnitForm extends React.Component {
{`${this.props.selected.length} ${this.getTranslation( - "organisation_units_selected" + "organisation_units_capture_selected" )}`}
{this.renderRoots()} diff --git a/src/components/ReplicateUserFromTable.component.js b/src/components/ReplicateUserFromTable.component.js index af04de3..ccdf6a9 100644 --- a/src/components/ReplicateUserFromTable.component.js +++ b/src/components/ReplicateUserFromTable.component.js @@ -13,7 +13,7 @@ class ReplicateUserFromTable extends React.Component { "firstName", "surname", "email", - "organisationUnits", + "organisationUnitsCapture", "dataViewOrganisationUnits", ]; diff --git a/src/components/UserRolesDialog.component.js b/src/components/UserRolesDialog.component.js index 9620315..5cf7f87 100644 --- a/src/components/UserRolesDialog.component.js +++ b/src/components/UserRolesDialog.component.js @@ -28,7 +28,7 @@ function UserRolesDialog(props, context) { const modelOptions = { parentModel: d2.models.users, - parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin]", + parentFields: ":owner,userCredentials[id,username,userRoles[id,name],lastLogin, disabled]", childrenModel: d2.models.userRoles, getChildren: user => user.userCredentials.userRoles, getPayload: getPayload, diff --git a/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js b/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js index 74ac32c..97c9f4f 100644 --- a/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js +++ b/src/components/batch-models-multi-select/BatchModelsMultiSelect.model.js @@ -39,18 +39,17 @@ export default class BatchModelsMultiSelectModel { }; return this.parentModel.list(options).then(collection => collection.toArray()); } - - save(parents, allChildren, selectedIds, updateStrategy) { + async save(parents, allChildren, selectedIds, updateStrategy) { const api = this.d2.Api.getApi(); const selectedChildren = _(allChildren) .keyBy("id") .at(...selectedIds) .compact() .value(); + const childrenForParents = this.getNewChildren(parents, selectedChildren, updateStrategy); const payload = this.getPayload(allChildren, _.zip(parents, childrenForParents)); const metadataUrl = "metadata?importStrategy=UPDATE&mergeMode=REPLACE"; - return api.post(metadataUrl, payload).then(response => { if (response.status !== "OK") { console.error("Response error", response); diff --git a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js b/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js index 60c126f..69aca4e 100644 --- a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js +++ b/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.component.js @@ -19,11 +19,11 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com allChildren: null, selectedIds: null, filterText: "", - updateStrategy: this.props.parents.length > 1 ? "merge" : "replace", + updateStrategy: this.props.parents.length === 1 ? "merge" : "replace", copyUserGroups: false, copyUserRoles: false, copyOrgUnitOutput: false, - copyOrgUnits: false, + copyOrgUnitsCapture: false, }; } @@ -60,27 +60,24 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com cancelButton: { marginRight: 16, }, - userGroupsToggle: { + column1Toggle: { width: 145, - marginTop: 10, - marginRight: 5, - float: "right", }, - userRolesToggle: { + column2Toggle: { width: 135, + }, + strategyToggle: { + width: 85, marginTop: 10, - marginRight: 60, + marginRight: 10, float: "right", }, - orgUnitToggle: { - width: 125, - marginRight: 65, - float: "right", + + flexContainer: { + display: "flex", }, - copyOrgUnitOutputToggle: { - width: 140, - float: "right", - marginRight: 5, + ColumnTwo: { + marginLeft: 20, }, }; componentDidMount() { @@ -105,25 +102,20 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com } renderStrategyToggle() { - if (this.state.parents && this.state.parents.length > 1) { - const label = - this.getTranslation("update_strategy") + - ": " + - this.getTranslation("update_strategy_" + this.state.updateStrategy); - - return ( - - this.setState({ updateStrategy: newValue ? "replace" : "merge" }) - } - /> - ); - } else { - return null; - } + const label = + this.getTranslation("update_strategy") + + ": " + + this.getTranslation("update_strategy_" + this.state.updateStrategy); + return ( + + this.setState({ updateStrategy: newValue ? "replace" : "merge" }) + } + /> + ); } async copyInUserSave() { @@ -133,17 +125,18 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com copyUserGroups, copyUserRoles, copyOrgUnitOutput, - copyOrgUnits, + copyOrgUnitsCapture, + updateStrategy, } = this.state; this.setState({ state: "loading" }); const copyAccessElements = { userGroups: copyUserGroups, userRoles: copyUserRoles, orgUnitOutput: copyOrgUnitOutput, - orgUnits: copyOrgUnits, + orgUnitCapture: copyOrgUnitsCapture, }; await this.props.model - .copyInUserSave(parents, selectedIds, copyAccessElements) + .copyInUserSave(parents, selectedIds, copyAccessElements, updateStrategy) .then(() => this.close(this.props.onSuccess)) .catch(err => this.close(this.props.onError)) .finally(() => this.setState({ state: "ready" })); @@ -179,11 +172,11 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com copyUserGroups, copyUserRoles, copyOrgUnitOutput, - copyOrgUnits, + copyOrgUnitsCapture, selectedIds, } = this.state; - if (!copyUserGroups && !copyUserRoles && !copyOrgUnitOutput && !copyOrgUnits) { + if (!copyUserGroups && !copyUserRoles && !copyOrgUnitOutput && !copyOrgUnitsCapture) { snackActions.show({ message: this.getTranslation("select_one_toggle") }); } else if (_.isEmpty(selectedIds)) { snackActions.show({ message: this.getTranslation("select_at_least_one_user") }); @@ -240,32 +233,6 @@ export default class CopyInUserBatchModelsMultiSelectComponent extends React.Com {this.renderStrategyToggle()} - this.setState({ copyUserGroups: newValue })} - /> - this.setState({ copyUserRoles: newValue })} - /> -
- this.setState({ copyOrgUnitOutput: newValue })} - /> - this.setState({ copyOrgUnits: newValue })} - /> -
+
+
+ this.setState({ copyUserGroups: newValue })} + /> + + this.setState({ copyOrgUnitOutput: newValue }) + } + /> +
+
+ this.setState({ copyUserRoles: newValue })} + /> + this.setState({ copyOrgUnits: newValue })} + /> +
+
); } diff --git a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js b/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js index d9bab11..0e8eff2 100644 --- a/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js +++ b/src/components/batch-models-multi-select/CopyInUserBatchModelsMultiSelect.model.js @@ -41,7 +41,6 @@ export default class CopyInUserBatchModelsMultiSelectModel { }; return this.parentModel.list(options).then(collection => collection.toArray()); } - async getUserInfo(ids) { const users = await getExistingUsers(d2, { fields: ":owner,userGroups[id]", @@ -49,14 +48,15 @@ export default class CopyInUserBatchModelsMultiSelectModel { }); return users; } - async copyInUserSave(parents, selectedIds, copyAccessElements) { + async copyInUserSave(parents, selectedIds, copyAccessElements, updateStrategy) { const parentWithRoles = await this.getUserInfo([getOwnedPropertyJSON(parents[0]).id]); const childrenUsers = await this.getUserInfo(selectedIds); const payload = await this.getPayload( ...parentWithRoles, childrenUsers, - copyAccessElements + copyAccessElements, + updateStrategy ); return payload; } diff --git a/src/i18n/i18n_module_ar.properties b/src/i18n/i18n_module_ar.properties index 42b34ac..00e95b3 100644 --- a/src/i18n/i18n_module_ar.properties +++ b/src/i18n/i18n_module_ar.properties @@ -2,7 +2,7 @@ actions=Actions assign_all=Assign all assignGroups=Assign to groups assignRoles=Assign roles -assignToOrgUnits=Assign to organisation units +assignToOrgUnitsCapture=Assign to organisation units cature assignToOrgUnitsOutput=Assign to organisation units output replicateUser=Replicate user cancel=CANCEL @@ -30,9 +30,9 @@ enable_error=Error enabling users: $$error$$ disable_error=Error disabling users: $$error$$ edit=Edit filter_group=Filter by group -filter_organisation_units_by_name=Filtering organisation units by name +filter_organisation_units_capture_by_name=Filtering organisation units capture by name filter_role=Filter by role -filter_by_organisation_units=Filter by organisation units +filter_by_organisation_units_capture=Filter by organisation units capture filter_by_organisation_units_output=Filter by organisation units output href=Api URL hidden_by_filters=hidden by filters @@ -50,8 +50,8 @@ of_page=of org_unit_assignment=Organisation unit assignment organisation_unit_group=مجموعة وحدة المنظمة organisation_unit_level=Organisation unit level -organisation_units=organisation units -organisation_units_selected=Organisation units selected +organisation_units=OU Capture +organisation_units_capture_selected=Organisation units capture selected save=SAVE search=Search search_by_name=Search by name @@ -63,7 +63,7 @@ user_roles=Roles username=Username dismiss=Dismiss ok=OK -no_org_units_add_one_to_get_started=No organisation units, add one to get started +no_org_units_add_one_to_get_started=No organisation units capture, add one to get started organisation_unit_assignment_saved=Organisation unit assignment saved organisation_unit_assignment_save_error=Failed to save organisation unit assignment no_changes_to_be_saved=No changes to be saved @@ -127,6 +127,6 @@ confirm=Confirm confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export -setting_organisation_units_field=Organisation Units field used for users import/export +setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user diff --git a/src/i18n/i18n_module_en.properties b/src/i18n/i18n_module_en.properties index 1133a7c..9aa931a 100644 --- a/src/i18n/i18n_module_en.properties +++ b/src/i18n/i18n_module_en.properties @@ -2,7 +2,7 @@ actions=Actions assign_all=Assign all assignGroups=Assign to groups assignRoles=Assign roles -assignToOrgUnits=Assign to organisation units +assignToOrgUnitsCapture=Assign to organisation units capture assignToOrgUnitsOutput=Assign to organisation units output replicateUser=Replicate user cancel=CANCEL @@ -30,9 +30,9 @@ enable_error=Error enabling users: $$error$$ disable_error=Error disabling users: $$error$$ edit=Edit filter_group=Filter by group -filter_organisation_units_by_name=Filtering organisation units by name +filter_organisation_units_capture_by_name=Filtering organisation units capture by name filter_role=Filter by role -filter_by_organisation_units=Filter by organisation units +filter_by_organisation_units_capture=Filter by organisation units capture filter_by_organisation_units_output=Filter by organisation units output href=Api URL hidden_by_filters=hidden by filters @@ -50,8 +50,8 @@ of_page=of org_unit_assignment=Organisation unit assignment organisation_unit_group=Organisation Unit Group organisation_unit_level=Organisation unit level -organisation_units=Organisation units -organisation_units_selected=Organisation units selected +organisation_units=OU Capture +organisation_units_capture_selected=Organisation units capture selected save=SAVE search=Search search_by_name=Search by name @@ -63,9 +63,9 @@ user_roles=Roles username=Username dismiss=Dismiss ok=OK -no_org_units_add_one_to_get_started=No organisation units, add one to get started -organisation_unit_assignment_saved=Organisation unit assignment saved -organisation_unit_assignment_save_error=Failed to save organisation unit assignment +no_org_units_add_one_to_get_started=No organisation units capture, add one to get started +organisation_unit_capture_assignment_saved=Organisation unit capture assignment saved +organisation_unit_capture_assignment_save_error=Failed to save organisation unit capture assignment no_changes_to_be_saved=No changes to be saved error_loading_data=Error loading data user_configuration_copied=User configuration successfully copied @@ -127,6 +127,6 @@ confirm=Confirm confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export -setting_organisation_units_field=Organisation Units field used for users import/export +setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user diff --git a/src/i18n/i18n_module_es.properties b/src/i18n/i18n_module_es.properties index ed9b6fc..69e17b7 100644 --- a/src/i18n/i18n_module_es.properties +++ b/src/i18n/i18n_module_es.properties @@ -2,7 +2,7 @@ actions=Acciones assign_all=Assignar todos assignGroups=Asignar a grupos assignRoles=Asignar a roles -assignToOrgUnits=Asignar a unidades organizativas +assignToOrgUnitsCapture=Asignar a unidades organizativas assignToOrgUnitsOutput=Asignar a unidades organizativas de salida replicateUser=Replicar usuario cancel=CANCELAR @@ -30,9 +30,9 @@ enable_error=Error habilitando usuarios: $$error$$ disable_error=Error deshabilitando usuarios: $$error$$ edit=Editar filter_group=Filtrar por grupo -filter_organisation_units_by_name=Filtrar por unidad organizativa +filter_organisation_units_capture_by_name=Filtrar por unidad organizativa filter_role=Filtrar rol -filter_by_organisation_units=Filtrar por unidad organizativa +filter_by_organisation_units_capture=Filtrar por unidad organizativa filter_by_organisation_units_output=Filtrar por unidad organizativa de salida href=API Url hidden_by_filters=ocultos por filtros @@ -51,7 +51,7 @@ org_unit_assignment=Asignació de unidades organizativas organisation_unit_group=Grupo de unidades organizativas organisation_unit_level=Nivel de unidad organizativa organisation_units=Unidades organizativas -organisation_units_selected=Unidades organizativas seleccionadas +organisation_units_capture_selected=Unidades organizativas seleccionadas save=GUARDAR search=Search search_by_name=Buscar por nombre @@ -127,6 +127,6 @@ confirm=Confirmar confirm_delete_users=¿Está seguro de que quiere eliminar los usuarios seleccionados? ($$users$$) users_deleted=Usuarios eliminados con éxito: $$users$$ config_import_export=Importación/Exportación -setting_organisation_units_field=Campo para unidades organizativas usando en importación/exportación de usuarios +setting_organisation_units_capture_field=Campo para unidades organizativas usando en importación/exportación de usuarios select_one_toggle=Seleccione al menos un modelo a copiar select_at_least_one_user=Seleccione al menos un usuario destino diff --git a/src/i18n/i18n_module_fr.properties b/src/i18n/i18n_module_fr.properties index d348153..1db9632 100644 --- a/src/i18n/i18n_module_fr.properties +++ b/src/i18n/i18n_module_fr.properties @@ -2,7 +2,7 @@ actions=Actions assign_all=Assign all assignGroups=Assign to groups assignRoles=Assign roles -assignToOrgUnits=Assign to organisation units +assignToOrgUnitsCapture=Assign to organisation units capture assignToOrgUnitsOutput=Assign to organisation units output replicateUser=Replicate user cancel=CANCEL @@ -30,9 +30,9 @@ enable_error=Error enabling users: $$error$$ disable_error=Error disabling users: $$error$$ edit=Edit filter_group=Filter by group -filter_organisation_units_by_name=Filtering organisation units by name +filter_organisation_units_capture_by_name=Filtering organisation units capture by name filter_role=Filter by role -filter_by_organisation_units=Filter by organisation units +filter_by_organisation_units_capture=Filter by organisation units capture filter_by_organisation_units_output=Filter by organisation units output href=Api URL hidden_by_filters=hidden by filters @@ -51,7 +51,7 @@ org_unit_assignment=Organisation unit assignment organisation_unit_group=Groupe d'Unités d'Organisation organisation_unit_level=Niveau d'unité d'organisation organisation_units=unités d'organisation -organisation_units_selected=Organisation units selected +organisation_units_capture_selected=Organisation units selected save=SAVE search=Search search_by_name=Rechercher par nom @@ -63,7 +63,7 @@ user_roles=Roles username=Nom d'utilisateur dismiss=Dismiss ok=OK -no_org_units_add_one_to_get_started=No organisation units, add one to get started +no_org_units_add_one_to_get_started=No organisation units capture, add one to get started organisation_unit_assignment_saved=Organisation unit assignment saved organisation_unit_assignment_save_error=Failed to save organisation unit assignment no_changes_to_be_saved=No changes to be saved @@ -127,6 +127,6 @@ confirm=Confirm confirm_delete_users=Are you sure you want to remove the selected users? ($$users$$) users_deleted=Users removed successfully: $$users$$ config_import_export=Import/export -setting_organisation_units_field=Organisation Units field used for users import/export +setting_organisation_units_capture_field=Organisation Units Capture field used for users import/export select_one_toggle=You must select a toggle option select_at_least_one_user=Select at least one destination user diff --git a/src/models/settings.js b/src/models/settings.js index 045cbb9..d1efda5 100644 --- a/src/models/settings.js +++ b/src/models/settings.js @@ -49,7 +49,7 @@ class Settings { { name: "organisationUnitsField", type: "select", - label: t("setting_organisation_units_field"), + label: t("setting_organisation_units_capture_field"), defaultValue: "shortName", options: [ { text: t("short_name"), value: "shortName" }, diff --git a/src/models/userHelpers.js b/src/models/userHelpers.js index 7d5e9e8..e9de25d 100644 --- a/src/models/userHelpers.js +++ b/src/models/userHelpers.js @@ -507,8 +507,13 @@ async function updateUsers(d2, users, mapper) { return postMetadata(api, payload); } -/* Save array of users (plain attributes), updating existing one, creating new ones */ +async function getUserGroupsToSaveAndPostMetadata(api, users, existingUsersToUpdate) { + const userGroupsToSave = await getUserGroupsToSave(api, users, existingUsersToUpdate); + const payload = { users: users, userGroups: userGroupsToSave }; + return postMetadata(api, payload); +} +/* Save array of users (plain attributes), updating existing one, creating new ones */ async function saveUsers(d2, users) { const api = d2.Api.getApi(); const existingUsersToUpdate = await getExistingUsers(d2, { @@ -521,18 +526,22 @@ async function saveUsers(d2, users) { "]", }); const usersToSave = getUsersToSave(users, existingUsersToUpdate); - const userGroupsToSave = await getUserGroupsToSave(api, usersToSave, existingUsersToUpdate); - const payload = { users: usersToSave, userGroups: userGroupsToSave }; - - return postMetadata(api, payload); + return getUserGroupsToSaveAndPostMetadata(api, usersToSave, existingUsersToUpdate); } async function saveCopyInUsers(d2, users, copyUserGroups) { const api = d2.Api.getApi(); if (copyUserGroups) { - const userGroupsToSave = await getUserGroupsToSave(api, users, []); - const payload = { users: users, userGroups: userGroupsToSave }; - return postMetadata(api, payload); + const existingUsersToUpdate = await getExistingUsers(d2, { + fields: ":owner,userGroups[id]", + filter: + "userCredentials.username:in:[" + + _(users) + .map("userCredentials.username") + .join(",") + + "]", + }); + return getUserGroupsToSaveAndPostMetadata(api, users, existingUsersToUpdate); } else { return postMetadata(api, { users: users }); } @@ -638,43 +647,50 @@ async function getExistingUsers(d2, options = {}) { }); return users; } -function addItems(items1, items2, shouldAdd) { + +function addItems(items1, items2, shouldAdd, updateStrategy) { if (!shouldAdd) { return items1; } else { - return _(items1) - .unionBy(items2, element => element.id) - .value(); + return updateStrategy === "merge" + ? _(items1) + .unionBy(items2, element => element.id) + .value() + : items2; } } -function getPayload(parentUser, destUsers, fields) { +function getPayload(parentUser, destUsers, fields, updateStrategy) { const users = destUsers.map(childUser => { const newChildUserCredentials = { ...childUser.userCredentials, userRoles: addItems( childUser.userCredentials.userRoles, parentUser.userCredentials.userRoles, - fields.userRoles + fields.userRoles, + updateStrategy ), }; const newChildUserGroups = addItems( childUser.userGroups, parentUser.userGroups, - fields.userGroups + fields.userGroups, + updateStrategy ); const newChildOrgUnitsOutput = addItems( childUser.dataViewOrganisationUnits, parentUser.dataViewOrganisationUnits, - fields.orgUnitOutput + fields.orgUnitOutput, + updateStrategy ); const newChildOrgUnits = addItems( childUser.organisationUnits, parentUser.organisationUnits, - fields.orgUnits + fields.orgUnits, + updateStrategy ); return { diff --git a/webpack.config.js b/webpack.config.js index c99c3f4..39a05f0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,77 +1,84 @@ -'use strict'; +"use strict"; -var webpack = require('webpack'); -var HtmlWebpackPlugin = require('html-webpack-plugin'); -var path = require('path'); -var colors = require('colors'); +var webpack = require("webpack"); +var HtmlWebpackPlugin = require("html-webpack-plugin"); +var path = require("path"); +var colors = require("colors"); -const isDevBuild = process.argv[1].indexOf('webpack-dev-server') !== -1; -const dhisConfigPath = process.env.DHIS2_HOME ? - `${process.env.DHIS2_HOME}/config` : `${__dirname}/config`; +const isDevBuild = process.argv[1].indexOf("webpack-dev-server") !== -1; +const dhisConfigPath = process.env.DHIS2_HOME + ? `${process.env.DHIS2_HOME}/config` + : `${__dirname}/config`; var dhisConfig; try { dhisConfig = require(dhisConfigPath); - console.log('\nLoaded DHIS config:'); + console.log("\nLoaded DHIS config:"); } catch (e) { // Failed to load config file - use default config console.warn(`\nWARNING! Failed to load DHIS config:`, e.message); - console.info('Using default config'); + console.info("Using default config"); dhisConfig = { - baseUrl: 'http://localhost:8080', - authorization: 'Basic YWRtaW46ZGlzdHJpY3Q=', // admin:district + baseUrl: "http://localhost:8080", + authorization: "Basic YWRtaW46ZGlzdHJpY3Q=", // admin:district }; } -console.log(JSON.stringify(dhisConfig, null, 2), '\n'); +console.log(JSON.stringify(dhisConfig, null, 2), "\n"); function bypass(req, res, opt) { req.headers.Authorization = dhisConfig.authorization; - console.log('[PROXY]'.cyan.bold, req.method.green.bold, req.url.magenta, '=>'.dim, opt.target.dim); + console.log( + "[PROXY]".cyan.bold, + req.method.green.bold, + req.url.magenta, + "=>".dim, + opt.target.dim + ); } const webpackConfig = { context: __dirname, contentBase: __dirname, - entry: './src/app.js', - devtool: 'source-map', + entry: "./src/app.js", + devtool: "source-map", output: { - path: __dirname + '/build', - filename: 'app.js', - publicPath: isDevBuild ? '/' : '', + path: __dirname + "/build", + filename: "app.js", + publicPath: isDevBuild ? "/" : "", }, module: { loaders: [ { test: /\.jsx?$/, exclude: /node_modules/, - loader: 'babel', + loader: "babel", query: { - presets: ['es2015', 'stage-0', 'react'] + presets: ["es2015", "stage-0", "react"], }, }, { test: /\.css$/, - loader: 'style!css', + loader: "style!css", }, { test: /\.scss$/, - loader: 'style!css!sass', + loader: "style!css!sass", }, { test: /\.(png|jp(e*)g|svg)$/, - loader: 'url-loader', + loader: "url-loader", options: { limit: 8000, // Convert images < 8kb to base64 strings - name: 'images/[hash]-[name].[ext]' - } + name: "images/[hash]-[name].[ext]", + }, }, ], }, resolve: { alias: { - react: path.resolve('./node_modules/react'), - 'material-ui': path.resolve('./node_modules/material-ui'), - d2: path.resolve('./node_modules/d2'), + react: path.resolve("./node_modules/react"), + "material-ui": path.resolve("./node_modules/material-ui"), + d2: path.resolve("./node_modules/d2"), }, }, devServer: { @@ -81,14 +88,21 @@ const webpackConfig = { inline: true, compress: true, proxy: [ - { path: '/api/**', target: dhisConfig.baseUrl, bypass }, - { path: '/dhis-web-commons/**', target: dhisConfig.baseUrl, bypass }, - { path: '/dhis-web-core-resource/**', target: dhisConfig.baseUrl, bypass }, - { path: '/icons/**', target: dhisConfig.baseUrl, bypass }, - { path: '/css/**', target: 'http://localhost:8081/src', bypass }, - { path: '/i18n/**', target: 'http://localhost:8081/src', bypass }, - { path: '/jquery.min.js', target: 'http://localhost:8081/node_modules/jquery/dist', bypass }, - { path: '/polyfill.min.js', target: 'http://localhost:8081/node_modules/babel-polyfill/dist', bypass } + { path: "/api/**", target: dhisConfig.baseUrl, bypass }, + { path: "/dhis-web-commons/**", target: dhisConfig.baseUrl, bypass }, + { path: "/dhis-web-core-resource/**", target: dhisConfig.baseUrl, bypass }, + { path: "/icons/**", target: dhisConfig.baseUrl, bypass }, + { path: "/i18n/**", target: "http://localhost:8081/src", bypass }, + { + path: "/jquery.min.js", + target: "http://localhost:8081/node_modules/jquery/dist", + bypass, + }, + { + path: "/polyfill.min.js", + target: "http://localhost:8081/node_modules/babel-polyfill/dist", + bypass, + }, ], }, }; @@ -97,7 +111,7 @@ if (!isDevBuild) { webpackConfig.plugins = [ // Replace any occurance of process.env.NODE_ENV with the string 'production' new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"', + "process.env.NODE_ENV": '"production"', DHIS_CONFIG: JSON.stringify({}), }), new webpack.optimize.DedupePlugin(), @@ -113,27 +127,28 @@ if (!isDevBuild) { } else { webpackConfig.plugins = [ new webpack.DefinePlugin({ - DHIS_CONFIG: JSON.stringify(dhisConfig) + DHIS_CONFIG: JSON.stringify(dhisConfig), }), ]; } // Generates an `index.html` file with the ` - : ``; - }) - .join('\n'), -})); +webpackConfig.plugins.push( + new HtmlWebpackPlugin({ + inject: true, + template: "./index.html", + vendorScripts: [ + `css/material-design-icons/material-icons.css`, + `css/fonts/roboto.css`, + `css/font-awesome/css/font-awesome.min.css`, + ] + .map(asset => { + return /\.js$/.test(asset) + ? `` + : ``; + }) + .join("\n"), + }) +); module.exports = webpackConfig;