diff --git a/assets/css/jquery-ui.css b/assets/css/jquery-ui.css new file mode 100644 index 00000000..ec02ac15 --- /dev/null +++ b/assets/css/jquery-ui.css @@ -0,0 +1,1311 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + + /* We use html here because we need a greater specificity to make sure disabled + works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + filter: Alpha(Opacity=30); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/assets/css/um-members.css b/assets/css/um-members.css index 63763b8a..0fc1fdd9 100644 --- a/assets/css/um-members.css +++ b/assets/css/um-members.css @@ -370,4 +370,552 @@ a.um-edit-profile-btn:before {content: "\f013"} a.um-edit-profile-btn { font-size: 13px; -} \ No newline at end of file +} + +.um-member a.um-follow-btn:before {content: "\f234"} +.um-member a.um-unfollow-btn:before {content: "\f235"} +.um-member a.um-friend-btn:before {content: "\f234"} +.um-member a.um-unfriend-btn:before {content: "\f235"} + + +/* NEW STYLES FOR VIEW TYPE LIST*/ + +.um-directory .um-member-directory-header { + box-sizing: border-box; + padding: 20px 0; + width: 100%; +} +#content .um-member-directory-header a { + border-bottom: none; + box-shadow: none; + text-decoration: none; +} +#content .um-members-wrapper .um-member-photo a { + text-decoration: none; + box-shadow: none !important; +} + +.um-directory .um-member-directory-search-line{ + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + line-height: 30px; + margin-bottom: 5px; + padding: 0px; + vertical-align: middle; + float: left; + width: 100%; +} +.um-directory .um-member-with-view:not(.um-member-with-sorting) .um-member-directory-search-line, +.um-directory .um-member-with-filters:not(.um-member-with-sorting) .um-member-directory-search-line { + float: left; + width: calc( 100% - 40px ); +} +.um-directory .um-member-with-filters.um-member-with-view:not(.um-member-with-sorting) .um-member-directory-search-line { + float: left; + width: calc( 100% - 75px ); +} +.um-directory:not(.uimob340):not(.uimob500):not(.uimob800) .um-member-with-sorting .um-member-directory-search-line{ + width: 48%; +} + +.um-directory .um-member-directory-search-line .um-search-line { + border-radius: 2px 0px 0px 2px; + display: block; + float: left; + line-height: 30px; + vertical-align: middle; + width: calc( 85% ); +} +.um-directory.uimob340 .um-member-directory-search-line .um-search-line, +.um-directory.uimob500 .um-member-directory-search-line .um-search-line { + width: calc( 100% - 40px ); +} + +.um-directory .um-member-directory-search-line .um-do-search { + border-radius: 0px 2px 2px 0px !important; + float: left; + height: 40px; + line-height: 30px; + margin: 0; + padding: 11px 2px !important; + vertical-align: middle; + width: 15%; +} +.um-directory.uimob340 .um-member-directory-search-line .um-do-search, +.um-directory.uimob500 .um-member-directory-search-line .um-do-search { + width: 40px; +} + +.um-directory .um-member-directory-search-line .um-do-search i { + margin: 0; + padding: 0; +} + + +.um-directory .um-member-directory-actions { + float: right; +} + + +.um-directory .um-member-directory-sorting{ + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + font-size: 30px; + height: 30px; + line-height: 30px; + position: relative; + vertical-align: middle; + width: 100%; +} +.um-directory .um-member-with-view .um-member-directory-sorting, +.um-directory .um-member-with-filters .um-member-directory-sorting { + float: left; + width: calc( 100% - 40px ); +} +.um-directory .um-member-with-filters.um-member-with-view .um-member-directory-sorting { + float: left; + width: calc( 100% - 75px ); +} + +.um-directory:not(.uimob340):not(.uimob500):not(.uimob800) .um-member-with-search .um-member-directory-sorting{ + float: left; + margin-left: 4%; + width: 48%; +} +.um-directory:not(.uimob340):not(.uimob500):not(.uimob800) .um-member-with-search.um-member-with-view .um-member-directory-sorting, +.um-directory:not(.uimob340):not(.uimob500):not(.uimob800) .um-member-with-search.um-member-with-filters .um-member-directory-sorting { + float: left; + width: calc( 48% - 40px ); +} +.um-directory:not(.uimob340):not(.uimob500):not(.uimob800) .um-member-with-search.um-member-with-filters.um-member-with-view .um-member-directory-sorting { + float: left; + width: calc( 48% - 75px ); +} + + +.um-member-directory-sorting .select2-container, +.um-search-filter .select2-container { + float:left; + width:100% !important; +} + +.um-member-directory-sorting .select2.select2-container .select2-selection .select2-selection__arrow:before { + content:"\f0dc" !important; + font-family: "FontAwesome" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 36px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.um-member-directory-sorting-a { + padding-top: 5px; + margin-left: 5px; + float: left; +} + +.um-member-directory-filters { + float: left; + padding: 5px 10px 5px 0; + vertical-align: middle; + line-height: 30px; + font-size: 30px; + height: 30px; +} + +.um-member-directory-view-type { + /*float: left;*/ + float: right; + padding: 5px 0; + position: relative; + vertical-align: middle; + font-size: 30px; + height: 30px; + line-height: 30px; + z-index: 1; +} + +.um-members-list .um-member { + width:100% !important; + padding: 15px 0; + margin-bottom: 20px; + box-sizing: border-box; +} + +.um-members-list .um-member .um-member-photo { + float: left; + padding: 0; + width: 100px; + margin: 27px 15px 0 0; +} + +.um-members-list .um-member .um-member-card { + float: left; + padding: 0; + width: calc( 100% - 300px ); + margin: 0; + text-align: left; + box-sizing: border-box; +} + +.um-members-list .um-member-card-actions { + width: 185px; + float:right; + text-align: right; + padding: 0; +} +.um-members-list .um-member-card-actions a { + min-width: 185px; + box-sizing: border-box; +} +.um-members-list .um-member-card-actions div[class$="stats"] { + text-align: center; +} + +div.uimob340 .um-members-list .um-member-card-actions, +div.uimob500 .um-members-list .um-member-card-actions { + min-width: auto; + width: 100%; + float:left; + text-align: center; +} + +.um-members-list .um-member-meta-main { + width: 100%; + float:left; + text-align: left; + padding: 0 10px; + box-sizing: border-box; +} + +.um-members-list .um-member-meta-main .um-member-connect a { + text-align: center; +} + + +.um-members-list .um-member-meta-main .um-member-more, +.um-members-list .um-member-meta-main .um-member-meta, +.um-members-list .um-member-meta-main .um-member-less { + float: left; + width: 100%; +} + +.um-members-list .um-member-metaline { + clear: both; + text-align: left; + width: 100%; +} + +.um-members-list .um-member-metaline span strong, +.um-members-list .um-member-metaline span span { + float: left; +} + +.um-members-list .um-members-friend-stats div { + margin-left: 0; +} + +.um-members-list .um-member-tagline { + padding-left: 0; +} + +.um-members-list .um-member-meta-main { + padding-left: 0; +} + +.um-members-list .um-member-meta.no-animate { + padding-top: 0; + margin-top: 0; +} + +.um-members-list .um-member-connect { + padding-top: 10px; +} + +.um-members-list .um-member-metaline span { + text-align: left; +} + +.um-members-wrapper { + width: 100%; + float:left; + margin: 0 0 10px 0; + padding: 0; + position: relative; + height: 300px; +} + +.um-directory.um-loaded .um-members-wrapper { + height: auto; +} + +.um-members-pagination-box { + width: 100%; + float:left; + margin: 0 0 10px 0; + padding: 0; +} + +.um-members-pagi, +.um-members-pagidrop { + width: 100%; + float:left; + margin: 0; + padding: 0; +} + +.um-members-overlay { + position: absolute; + width: 100%; + float: left; + top:0; + bottom:0; + background: rgba( 0, 0, 0, 0 ); + /*background: rgba( 0, 0, 0, 0.8 );*/ +} + +@-webkit-keyframes um-ajax-spinning { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0) + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@keyframes um-ajax-spinning { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0) + } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +.um-ajax-loading { + color: #c6c6c6 !important; + -webkit-transition: .1s opacity!important; + -moz-transition: .1s opacity!important; + -ms-transition: .1s opacity!important; + -o-transition: .1s opacity!important; + transition: .1s opacity!important; + -webkit-animation: um-ajax-spinning 1.1s infinite linear; + animation: um-ajax-spinning 1.1s infinite linear; + border-top: .2em solid rgba(198, 198, 198, 0.2); + border-right: .2em solid rgba(198, 198, 198, 0.2); + border-bottom: .2em solid rgba(198, 198, 198, 0.2); + border-left: .2em solid #c6c6c6; + font-size: 1.75em; + position: absolute; + left: calc(50% - 1.75em); + top: calc(50% - 1.75em); + /* opacity: 0; */ + filter: alpha(opacity=0); + -ms-transform: translateZ(0); + transform: translateZ(0); + border-radius: 50%; + display: block; + width: 2.5em; + height: 2.5em; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} + +.um-members-pagi .pagi { + cursor: pointer; +} + +.um-members-pagi .pagi.current, +.um-members-pagi .pagi.disabled { + cursor: default; +} + +.um-member-directory-sorting-a, +.um-member-directory-filters-a, +.um-member-directory-view-type-a { + color:#ddd; +} + +.um-directory .um-member-directory-view-type-a { + display: none; +} + +.um-directory[data-view_type="list"] .um-member-directory-view-type-a[data-type="list"] { + display: block; +} +.um-directory[data-view_type="grid"] .um-member-directory-view-type-a[data-type="grid"] { + display: block; +} +.um-directory[data-view_type="map"] .um-member-directory-view-type-a[data-type="map"] { + display: block; +} + +.um-member-directory-sorting-a:hover, +.um-member-directory-filters-a:hover, +.um-member-directory-view-type-a:hover { + color:#ccc !important; + text-decoration: none; +} + +.um-member-directory-sorting-a:focus, +.um-member-directory-filters-a:focus, +.um-member-directory-view-type-a:focus { + color:#ddd; + text-decoration: none; +} + +.um-members-list .um-member-meta { + display: block; + margin: 10px 0 0 0; + padding: 15px 0; + box-sizing: border-box; + border: none; +} + +.um-directory .um-filtered-line { + display: none; + margin: 0 0 10px 0; + padding: 0; + box-sizing: border-box; + border: none; +} + +.um-directory .um-search-submit { + text-align: center; +} + +.um-directory .um-search-submit .um-close-filter { + margin: 0 !important; +} + +.um-directory .um-filtered-line { + line-height: 30px; +} + +.um-directory .um-members-filter-tag { + float: left; + display: inline-block; + margin: 4px 10px; + padding: 3px 10px; + border-radius: 3px; + line-height: 25px; + cursor: default; + background: #f1f1f1; + font-size: 13px; +} + +.um-directory .um-clear-filters { + float:left; + display: inline-block; + margin-left: 20px; + line-height: 25px; +} + +.um-directory .um-clear-filters a { + float:left; + display: inline-block; + line-height: 25px; + padding: 3px 10px; + margin: 4px 10px; +} + +.um-directory .um-members-filter-tag:first-child { + margin-left: 0; +} + +.um-directory .um-members-filter-tag .um-members-filter-remove { + float:right; + display: inline-block; + margin-left: 10px; + cursor: pointer; + font-weight: bold; + font-size: 20px; +} + +.um-directory .um-members-filter-tag .um-members-filter-remove:hover { + color:#a00; +} + +.um-slider .ui-slider-range.ui-widget-header { + background: #44b0ec; + border: 2px solid #44b0ec !important; + margin-top: -2px; +} + +.um-slider.ui-slider.ui-slider-horizontal { + border: 2px solid #ddd !important; + box-sizing: border-box; +} + +.um-slider { + float: left; + margin-left: 2%; + margin-right: 2%; + width: 96%; +} + +.um-slider-range { + float:left; + width:100%; + text-align: left; + padding-top: 6px; + box-sizing: border-box; +} + +.um-member-directory-header .um-s1 { + width:100%; +} + +.um .um-form .um-half-filter { + width:calc( 50% - 10px ); + margin: 0 10px 0 0 !important; + float:left; +} + +.um .um-form .um-half-filter:nth-child(even) { + margin: 0 0 0 10px !important; +} + +/* new */ +.um .um-filter-resset { + width: 22px; + height: 22px; + position: absolute; + text-decoration: none; + box-shadow: none; + font-size: 40px; + color: #a2a2a2; + line-height: 23px; + cursor: pointer; + top: -18px; + right: -20px; +} +.um .um-filter-resset.um-reset-hidden { + display: none; +} + +.um-search .um-search-filter { + position: relative; +} +.um-search[style*="overflow: hidden;"] .um-search-filter { + pointer-events: none; +} + +.um-dropdown li a { + min-width: 185px; + box-sizing: border-box; +} diff --git a/assets/js/um-functions.js b/assets/js/um-functions.js index 76d7ea79..7b628bf7 100644 --- a/assets/js/um-functions.js +++ b/assets/js/um-functions.js @@ -204,22 +204,9 @@ function um_responsive(){ }); - jQuery('.um-members').each(function(){ - UM_Member_Grid( jQuery(this) ); - }); - UM_domenus(); - } -function UM_Member_Grid( container ) { - container.masonry({ - itemSelector: '.um-member', - columnWidth: '.um-member', - gutter: '.um-gutter-sizer' - }); - -} function initImageUpload_UM( trigger ) { diff --git a/assets/js/um-functions.min.js b/assets/js/um-functions.min.js index aa73b05d..49aa7b05 100644 --- a/assets/js/um-functions.min.js +++ b/assets/js/um-functions.min.js @@ -1 +1 @@ -function UM_check_password_matched(){jQuery(document).on("keyup","input[data-key=user_password],input[data-key=confirm_user_password]",function(e){var t=jQuery("input[data-key=user_password]").val(),a=jQuery("input[data-key=confirm_user_password]").val(),o=jQuery("input[data-key=user_password],input[data-key=confirm_user_password]");t||a?t!==a?o.removeClass("um-validate-matched").addClass("um-validate-not-matched"):o.removeClass("um-validate-not-matched").addClass("um-validate-matched"):o.removeClass("um-validate-matched").removeClass("um-validate-not-matched")})}function UM_hide_menus(){var e=jQuery(".um-dropdown");e.parents("div").find("a").removeClass("active"),e.hide()}function UM_domenus(){jQuery(".um-dropdown").each(function(){var e=jQuery(this),t=jQuery(this).attr("data-element"),a=jQuery(this).attr("data-position");jQuery(t).addClass("um-trigger-menu-on-"+e.attr("data-trigger")),"lc"===a&&"rtl"===jQuery("html").attr("dir")&&(a="rc"),jQuery(window).width()<=1200&&"div.um-profile-edit"===t&&(a="rtl"===jQuery("html").attr("dir")?"rc":"lc"),jQuery(t).find("img").width()<200?left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2+(jQuery(t).find("img").width()-200)/2:left_p=(jQuery(t).width()-jQuery(t).find("img").width())/2,top_=parseInt(jQuery(t).find("a").css("top")),top_?(top_p=jQuery(t).find("img").height()+4+top_,left_gap=4):(top_p=jQuery(t).find("img").height()+4,left_gap=0),4==top_p&&"div.um-cover"===t?top_p=jQuery(t).height()/2+e.height()/2:4==top_p&&(top_p=jQuery(t).height()+20),"lc"===a?(gap_right=jQuery(t).width()+17,e.css({top:0,width:200,left:"auto",right:gap_right+"px","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-right-b"),e.find(".um-dropdown-arr").css({top:"4px",left:"auto",right:"-17px"})):"rc"===a?(gap_right=jQuery(t).width()+25,e.css({top:0,width:200,left:gap_right+"px",right:"auto","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-left-b"),e.find(".um-dropdown-arr").css({top:"4px",left:"-17px",right:"auto"})):"bc"===a&&("rtl"===jQuery("html").attr("dir")?rtl_gap=10:rtl_gap=0,e.css({top:top_p,width:200,left:left_p+left_gap+rtl_gap,right:"auto","text-align":"center"}),e.find(".um-dropdown-arr").find("i").removeClass().addClass("um-icon-arrow-up-b"),e.find(".um-dropdown-arr").css({top:"-17px",left:e.width()/2-12,right:"auto"}))})}function um_responsive(){jQuery(".um").each(function(){element_width=jQuery(this).width(),element_width<=340?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob340")):element_width<=500?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob500")):element_width<=800?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob800")):element_width<=960?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob960")):960":upload_help_text="",r.data("icon")?icon='':icon="",r.data("upload_text")?upload_text=''+r.data("upload_text")+"":upload_text="";var e=0;jQuery("#um_upload_single:visible").data("user_id")&&(e=jQuery("#um_upload_single:visible").data("user_id")),r.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_imageupload",key:r.data("key"),set_id:r.data("set_id"),set_mode:r.data("set_mode"),_wpnonce:r.data("nonce"),timestamp:r.data("timestamp"),user_id:e},fileName:r.data("key"),allowedTypes:r.data("allowed_types"),maxFileSize:r.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:r.data("max_size_error"),extErrorStr:r.data("extension_error"),maxFileCountErrorStr:r.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,returnType:"json",onSubmit:function(e){r.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,t,a){r.selectedFiles=0,t.success&&0==t.success||void 0!==t.data.error?(r.parents(".um-modal-body").append('
'+t.data.error+"
"),r.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(t.data,function(e,t){var a=r.parents(".um-modal-body").find(".um-single-image-preview img"),o=r.parents(".um-modal-body").find(".um-single-image-preview"),i=new Date;a.attr("src",t.url+"?"+i.getTime()),a.data("file",t.file),a.load(function(){r.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),r.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),o.show(0),um_modal_responsive()})})},onError:function(e){console.log(e)}})}function initFileUpload_UM(o){o.data("upload_help_text")?upload_help_text=''+o.data("upload_help_text")+"":upload_help_text="",o.data("icon")?icon='':icon="",o.data("upload_text")?upload_text=''+o.data("upload_text")+"":upload_text="",jQuery("#um_upload_single:visible").data("user_id")&&(user_id=jQuery("#um_upload_single:visible").data("user_id")),o.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_fileupload",key:o.data("key"),set_id:o.data("set_id"),user_id:o.data("user_id"),set_mode:o.data("set_mode"),_wpnonce:o.data("nonce"),timestamp:o.data("timestamp")},fileName:o.data("key"),allowedTypes:o.data("allowed_types"),maxFileSize:o.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:o.data("max_size_error"),extErrorStr:o.data("extension_error"),maxFileCountErrorStr:o.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(e){o.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,t,a){o.selectedFiles=0,t.success&&0==t.success||void 0!==t.data.error?(o.parents(".um-modal-body").append('
'+t.data.error+"
"),o.parents(".um-modal-body").find(".upload-statusbar").hide(0)):jQuery.each(t.data,function(e,t){o.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),o.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),o.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==e?o.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(t):"icon_bg"==e?o.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":t}):"filename"==e?o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-file",t):"original_name"==e?(o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-orignal-name",t),o.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(t)):"url"==e&&o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",t)}),setTimeout(function(){um_modal_responsive()},1e3)},onError:function(e){console.log(e)}})}function initCrop_UM(){var t=jQuery(".um-modal .um-single-image-preview img").first(),e=jQuery(".um-modal .um-single-image-preview"),a=t.parent().attr("data-crop"),o=t.parent().attr("data-min_width"),i=t.parent().attr("data-min_height"),r=t.parent().attr("data-ratio");if(jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"))r=(r=jQuery(".um-modal").find("#um_upload_single").attr("data-ratio")).split(":")[0];if(t.length&&""!=t.attr("src")){var u=jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height();if(t.css({height:"auto"}),e.css({height:"auto"}),jQuery(window).height()<=400?(e.css({height:u+"px","max-height":u+"px"}),t.css({height:"auto"})):(t.css({height:"auto","max-height":u+"px"}),e.css({height:t.height(),"max-height":u+"px"})),"square"==a)var d={minWidth:o,minHeight:i,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1,done:function(e){t.parent().attr("data-coord",Math.round(e.x)+","+Math.round(e.y)+","+Math.round(e.width)+","+Math.round(e.height))}};else if("cover"==a){0'))}}function um_new_modal(e,t,a,o){if(0==jQuery("body").find(".um-modal-overlay").length)if(jQuery(".tipsy").hide(),UM_hide_menus(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),a?jQuery("body").append('
'):jQuery("body").append('
'),jQuery("#"+e).prependTo(".um-modal"),a){jQuery(".um-modal").find(".um-modal-photo").html("");var i=jQuery(".um-modal-photo img"),r=jQuery(window).width()-60,u=jQuery(window).height()-.25*jQuery(window).height();i.attr("src",o),i.load(function(){jQuery("#"+e).show(),jQuery(".um-modal").show(),i.css({opacity:0}),i.css({"max-width":r}),i.css({"max-height":u}),jQuery(".um-modal").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}),i.animate({opacity:1},1e3),um_modal_responsive()})}else jQuery("#"+e).show(),jQuery(".um-modal").show(),um_modal_size(t),initImageUpload_UM(jQuery(".um-modal:visible").find(".um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible").find(".um-single-file-upload")),um_modal_responsive()}function um_modal_responsive(){var e=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,t=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,a=jQuery(".um-modal:visible");if(jQuery(".um-modal-body.photo:visible").length){a.removeClass("uimob340"),a.removeClass("uimob500");var o=jQuery(".um-modal-photo img"),i=e-60,r=t-.25*t;o.css({opacity:0}),o.css({"max-width":i}),o.css({"max-height":r}),jQuery(".um-modal").css({width:o.width(),"margin-left":"-"+o.width()/2+"px"}),o.animate({opacity:1},1e3);var u=(t-a.innerHeight())/2+"px";a.animate({bottom:u},300)}else if(a.length)if(a.removeClass("uimob340"),a.removeClass("uimob500"),e<=340)a.addClass("uimob340"),initCrop_UM(),a.animate({bottom:0},300);else if(e<=500)a.addClass("uimob500"),initCrop_UM(),a.animate({bottom:0},300);else if(e<=800){initCrop_UM();u=(t-a.innerHeight())/2+"px";a.animate({bottom:u},300)}else if(e<=960){initCrop_UM();u=(t-a.innerHeight())/2+"px";a.animate({bottom:u},300)}else if(960'),jQuery("body").append('
'),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(jQuery(document).trigger("um_before_modal_removed"),jQuery(".tipsy").remove(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,offset:3}))}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(ag_height=jQuery(window).height()-jQuery(".um-popup .um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80,350":upload_help_text="",r.data("icon")?icon='':icon="",r.data("upload_text")?upload_text=''+r.data("upload_text")+"":upload_text="";var e=0;jQuery("#um_upload_single:visible").data("user_id")&&(e=jQuery("#um_upload_single:visible").data("user_id")),r.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_imageupload",key:r.data("key"),set_id:r.data("set_id"),set_mode:r.data("set_mode"),_wpnonce:r.data("nonce"),timestamp:r.data("timestamp"),user_id:e},fileName:r.data("key"),allowedTypes:r.data("allowed_types"),maxFileSize:r.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:r.data("max_size_error"),extErrorStr:r.data("extension_error"),maxFileCountErrorStr:r.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,returnType:"json",onSubmit:function(e){r.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,t,a){r.selectedFiles=0,t.success&&0==t.success||void 0!==t.data.error?(r.parents(".um-modal-body").append('
'+t.data.error+"
"),r.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(t.data,function(e,t){var a=r.parents(".um-modal-body").find(".um-single-image-preview img"),o=r.parents(".um-modal-body").find(".um-single-image-preview"),i=new Date;a.attr("src",t.url+"?"+i.getTime()),a.data("file",t.file),a.load(function(){r.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),r.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),o.show(0),um_modal_responsive()})})},onError:function(e){console.log(e)}})}function initFileUpload_UM(o){o.data("upload_help_text")?upload_help_text=''+o.data("upload_help_text")+"":upload_help_text="",o.data("icon")?icon='':icon="",o.data("upload_text")?upload_text=''+o.data("upload_text")+"":upload_text="",jQuery("#um_upload_single:visible").data("user_id")&&(user_id=jQuery("#um_upload_single:visible").data("user_id")),o.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_fileupload",key:o.data("key"),set_id:o.data("set_id"),user_id:o.data("user_id"),set_mode:o.data("set_mode"),_wpnonce:o.data("nonce"),timestamp:o.data("timestamp")},fileName:o.data("key"),allowedTypes:o.data("allowed_types"),maxFileSize:o.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:o.data("max_size_error"),extErrorStr:o.data("extension_error"),maxFileCountErrorStr:o.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(e){o.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,t,a){o.selectedFiles=0,t.success&&0==t.success||void 0!==t.data.error?(o.parents(".um-modal-body").append('
'+t.data.error+"
"),o.parents(".um-modal-body").find(".upload-statusbar").hide(0)):jQuery.each(t.data,function(e,t){o.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),o.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),o.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==e?o.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(t):"icon_bg"==e?o.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":t}):"filename"==e?o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-file",t):"original_name"==e?(o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-orignal-name",t),o.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(t)):"url"==e&&o.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",t)}),setTimeout(function(){um_modal_responsive()},1e3)},onError:function(e){console.log(e)}})}function initCrop_UM(){var t=jQuery(".um-modal .um-single-image-preview img").first(),e=jQuery(".um-modal .um-single-image-preview"),a=t.parent().attr("data-crop"),o=t.parent().attr("data-min_width"),i=t.parent().attr("data-min_height"),r=t.parent().attr("data-ratio");if(jQuery(".um-modal").find("#um_upload_single").attr("data-ratio"))r=(r=jQuery(".um-modal").find("#um_upload_single").attr("data-ratio")).split(":")[0];if(t.length&&""!=t.attr("src")){var d=jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height();if(t.css({height:"auto"}),e.css({height:"auto"}),jQuery(window).height()<=400?(e.css({height:d+"px","max-height":d+"px"}),t.css({height:"auto"})):(t.css({height:"auto","max-height":d+"px"}),e.css({height:t.height(),"max-height":d+"px"})),"square"==a)var u={minWidth:o,minHeight:i,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1,done:function(e){t.parent().attr("data-coord",Math.round(e.x)+","+Math.round(e.y)+","+Math.round(e.width)+","+Math.round(e.height))}};else if("cover"==a){0'))}}function um_new_modal(e,t,a,o){if(0==jQuery("body").find(".um-modal-overlay").length)if(jQuery(".tipsy").hide(),UM_hide_menus(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),a?jQuery("body").append('
'):jQuery("body").append('
'),jQuery("#"+e).prependTo(".um-modal"),a){jQuery(".um-modal").find(".um-modal-photo").html("");var i=jQuery(".um-modal-photo img"),r=jQuery(window).width()-60,d=jQuery(window).height()-.25*jQuery(window).height();i.attr("src",o),i.load(function(){jQuery("#"+e).show(),jQuery(".um-modal").show(),i.css({opacity:0}),i.css({"max-width":r}),i.css({"max-height":d}),jQuery(".um-modal").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}),i.animate({opacity:1},1e3),um_modal_responsive()})}else jQuery("#"+e).show(),jQuery(".um-modal").show(),um_modal_size(t),initImageUpload_UM(jQuery(".um-modal:visible").find(".um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible").find(".um-single-file-upload")),um_modal_responsive()}function um_modal_responsive(){var e=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,t=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,a=jQuery(".um-modal:visible");if(jQuery(".um-modal-body.photo:visible").length){a.removeClass("uimob340"),a.removeClass("uimob500");var o=jQuery(".um-modal-photo img"),i=e-60,r=t-.25*t;o.css({opacity:0}),o.css({"max-width":i}),o.css({"max-height":r}),jQuery(".um-modal").css({width:o.width(),"margin-left":"-"+o.width()/2+"px"}),o.animate({opacity:1},1e3);var d=(t-a.innerHeight())/2+"px";a.animate({bottom:d},300)}else if(a.length)if(a.removeClass("uimob340"),a.removeClass("uimob500"),e<=340)a.addClass("uimob340"),initCrop_UM(),a.animate({bottom:0},300);else if(e<=500)a.addClass("uimob500"),initCrop_UM(),a.animate({bottom:0},300);else if(e<=800){initCrop_UM();d=(t-a.innerHeight())/2+"px";a.animate({bottom:d},300)}else if(e<=960){initCrop_UM();d=(t-a.innerHeight())/2+"px";a.animate({bottom:d},300)}else if(960'),jQuery("body").append('
'),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(jQuery(document).trigger("um_before_modal_removed"),jQuery(".tipsy").remove(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,offset:3}))}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(ag_height=jQuery(window).height()-jQuery(".um-popup .um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80,350 0 ) { + // directory.find('.um-filtered-line').show(); + // show_after_search = false; + // } else { + // directory.find('.um-filtered-line').hide(); + // show_after_search = true; + // } + // } + + if ( jQuery('#tmpl-um-members-filtered-line').length ) { + um_change_tag( directory ); + } + + if ( directory.data( 'only_search' ) > 0 && show_after_search ) { + um_members_hide_preloader( directory ); + return; + } + + um_ajax_get_members( directory ); +}); + + +function um_parse_current_url() { + var data = {}; + + var query = window.location.search.substring(1); + var attrs = query.split( '&' ); + jQuery.each( attrs, function( i ) { + var attr = attrs[ i ].split( '=' ); + data[ attr[0] ] = attr[1]; + }); + return data; +} + + +function get_data_for_directory( hash, search_key ) { + var data = {}; + + var url_data = um_parse_current_url(); + jQuery.each( url_data, function( key ) { + if ( key.indexOf( '_' + hash ) !== -1 ) { + data[ key.replace( '_' + hash, '' ) ] = url_data[ key ]; + } + }); + + if ( ! search_key ) { + return data; + } else { + return data[ search_key ]; + } +} + + +function um_members_get_hash( directory ) { + return directory.data( 'hash' ); +} + +function um_is_directory_busy( directory ) { + var hash = um_members_get_hash( directory ); + return typeof um_members_directory_busy[ hash ] != 'undefined' && um_members_directory_busy[ hash ]; +} + + +function um_members_show_preloader( directory ) { + um_members_directory_busy[ um_members_get_hash( directory ) ] = true; + directory.find('.um-members-overlay').show(); +} + + +function um_members_hide_preloader( directory ) { + um_members_directory_busy[ um_members_get_hash( directory ) ] = false; + directory.find('.um-members-overlay').hide(); +} + + +function um_set_range_label( slider, ui ) { + var placeholder = slider.siblings( '.um-slider-range' ).data( 'placeholder' ); + + if( ui ) { + placeholder = placeholder.replace( '\{min_range\}', ui.values[ 0 ] ) + .replace( '\{max_range\}', ui.values[ 1 ] ) + .replace( '\{field_label\}', slider.siblings( '.um-slider-range' ) + .data('label') ); + } else { + placeholder = placeholder.replace( '\{min_range\}', slider.slider( "values", 0 ) ) + .replace( '\{max_range\}', slider.slider( "values", 1 ) ) + .replace( '\{field_label\}', slider.siblings( '.um-slider-range' ) + .data('label') ); + } + slider.siblings( '.um-slider-range' ).html( placeholder ); + + slider.siblings( ".um_range_min" ).val( slider.slider( "values", 0 ) ); + slider.siblings( ".um_range_max" ).val( slider.slider( "values", 1 ) ); +} + + +function um_ajax_get_members( directory ) { + var directory_id = directory.data('unique_id'); + directory_id = directory_id.replace("um-", ""); + + var local_date = new Date(); + var gmt_hours = -local_date.getTimezoneOffset()/60; + + var request = { + page: um_get_directory_storage( directory, 'page' ), + args: window['um_members_args_' + directory_id], + gmt_offset: gmt_hours, + nonce: um_scripts.nonce, + referrer_url: window.location.href + }; + + if ( directory.find('.um-member-directory-sorting-options').length ) { + request.sorting = um_get_directory_storage( directory, 'sorting' ); + } + + if ( directory.find('.um-search-line').length ) { + request.general_search = um_get_directory_storage( directory, 'general_search' ); + } + + if ( directory.find('.um-search-filter').length ) { + directory.find('.um-search-filter').each( function() { + var filter = jQuery(this); + + if ( filter.find( '.um-slider' ).length ) { + var filter_name = filter.find( '.um-slider' ).data('field_name'); + var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( value !== null ) { + request[ filter_name ] = value; + request['is_filters'] = true; + } + } else if ( filter.find( '.um-datepicker-filter' ).length ) { + var filter_name = filter.find( '.um-datepicker-filter' ).data('filter_name'); + var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( value !== null ) { + request[ filter_name ] = value; + request['is_filters'] = true; + } + } else { + var filter_name = filter.find('select').attr('name'); + var value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( value !== null ) { + request[ filter_name ] = value; + request['is_filters'] = true; + } + } + }); + } + + return wp.ajax.send( 'um_get_members', { + data: request, + success: function( answer ) { + + //set last data hard for using on layouts reloading + um_set_directory_storage( directory, 'last_data', answer, true ); + + um_build_template( directory, answer ); + + um_members_hide_preloader( directory ); + + var pagination_template = wp.template( 'um-members-pagination' ); + directory.find('.um-members-pagination-box').html( pagination_template( answer ) ); + + directory.data( 'total_pages', answer.pagination.total_pages ); + + jQuery( document ).trigger('um_members_rendered'); + }, + error: function( data ) { + console.log( data ); + } + }); +} + + +function um_build_template( directory, data ) { + var layout = um_get_directory_storage( directory, 'layout' ); + var template = wp.template( 'um-member-' + layout ); + + directory.find('.um-members-grid, .um-members-list').remove(); + directory.find('.um-members-wrapper').prepend( template( data ) ); + directory.addClass('um-loaded'); + + if ( directory.find('.um-members').length ) { + UM_Member_Grid( directory.find('.um-members') ); + jQuery( window ).trigger( 'resize' ); + } + + jQuery( document ).trigger( "um_build_template", [ directory, data ] ); + jQuery( window ).trigger( "resize" ); +} + + + +function UM_Member_Grid( container ) { + if ( container.find( '.um-member' ).length ) { + container.imagesLoaded( function() { + var $grid = container.masonry({ + itemSelector: '.um-member', + columnWidth: '.um-member', + gutter: '.um-gutter-sizer' + }); + + $grid.on( 'layoutComplete', function( event, laidOutItems ) { + jQuery( document ).trigger( "um_grid_initialized", [ event, laidOutItems ] ); + }); + }); + } +} + jQuery(document).ready(function() { + //slider filter + jQuery( '.um-slider' ).each( function() { + var slider = jQuery( this ); + var directory = jQuery(this).parents('.um-directory'); + + var default_value = get_data_for_directory( um_members_get_hash( directory ), slider.data('field_name') ); + + + //var default_value = um_get_directory_storage( directory, 'filter_' + slider.data('field_name') ); + if ( default_value == null ) { + default_value = [ parseInt( slider.data('min') ), parseInt( slider.data('max') ) ]; + } + + slider.slider({ + range: true, + min: parseInt( slider.data('min') ), + max: parseInt( slider.data('max') ), + values: default_value, + create: function( event, ui ) { + //console.log( ui ); + }, + step: 1, + slide: function( event, ui ) { + um_set_range_label( jQuery( this ), ui ); + }, + stop: function( event, ui ) { + if ( ! um_is_directory_busy( directory ) ) { + um_set_directory_storage( directory, 'filter_' + jQuery(this).data('field_name'), ui.values, true ); + um_set_directory_storage( directory, 'page', 1, true ); + um_change_tag( directory ); + um_ajax_get_members( directory ); + } + } + }); + + um_set_range_label( slider ); + }); + + + //datepicker filter + jQuery('.um-datepicker-filter').each( function() { + var elem = jQuery(this); + + var min = new Date( elem.data('date_min')*1000 ); + var max = new Date( elem.data('date_max')*1000 ); + + var $input = elem.pickadate({ + selectYears: true, + min: min, + max: max, + formatSubmit: 'yyyy/mm/dd', + hiddenName: true, + onOpen: function() { + elem.blur(); + }, + onClose: function() { + elem.blur(); + }, + onSet: function( context ) { + var directory = elem.parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var filter_name = elem.data( 'filter_name' ); + var range = elem.data( 'range' ); + + var current_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( current_value === null ) { + current_value = {}; + } + + var select_val = context.select / 1000; + var change_val = elem.val(); + + if ( range === 'from' ) { + if( select_val !== null && !isNaN( select_val ) ) { + current_value.from = select_val; + } else { + if( change_val == '' ) { + delete current_value.from; + //console.warn('Elem val from: ' + change_val); + } + } + } else if ( range === 'to' ) { + if( select_val !== null && !isNaN( select_val ) ) { + current_value.to = select_val; + } else { + if( change_val == '' ) { + delete current_value.to; + //console.warn('Elem val to: ' + change_val); + } + } + } + + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + + //set 1st page after filtration + um_set_directory_storage( directory, 'page', 1, true ); + + um_ajax_get_members( directory ); + + um_change_tag( directory ); + } + }); + + var $picker = $input.pickadate('picker'); + var $fname = elem.data('filter_name'); + var $frange = elem.data('range'); + var $directory = elem.parents('.um-directory'); + var query_value = um_get_directory_storage( $directory, 'filter_' + $fname ); + + if ( query_value !== null ) { + if( typeof( query_value[$frange] ) !== 'undefined' ) { + $picker.set( 'select', query_value[$frange]*1000 ); + } + } + + }); + + jQuery('.um-members').each(function(){ UM_Member_Grid( jQuery(this) ); }); @@ -63,4 +519,266 @@ jQuery(document).ready(function() { return false; }); + + + //change layout + jQuery( document.body ).on( 'click', '.um-member-directory-view-type-a', function() { + var directory = jQuery(this).parents('.um-directory'); + var $this = jQuery(this); + + if ( um_is_directory_busy( directory ) ) { + return false; + } + + var layout = um_get_directory_storage( directory, 'layout' ); + + var view_type = directory.find('.um-member-directory-view-type-a').parent(); + var summ_elem = jQuery(this).parent().find('.um-member-directory-view-type-a').length; + + var elem_next, + tooltip_title; + + view_type.find('.um-member-directory-view-type-a').each( function ( index, elem ) { + if( jQuery(elem).data('type') == layout ) { + if( index === summ_elem - 1) { + elem_next = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq(0); + tooltip_title = jQuery(elem_next).next().attr('default-title'); + } else { + elem_next = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq( index + 1 ); + if( index === summ_elem - 2) { + tooltip_title = jQuery(elem).parent().find('.um-member-directory-view-type-a').eq(0).attr('default-title'); + } else { + tooltip_title = jQuery(elem_next).next().attr('default-title'); + } + } + } + }); + + jQuery(this).parent().find('.um-member-directory-view-type-a').hide(); + elem_next.show(); + elem_next.attr( 'original-title', tooltip_title ); + layout = jQuery(elem_next).data('type'); + + um_set_directory_storage( directory, 'layout', layout, true ); + directory.data( 'view_type', layout ); + + var data = um_get_directory_storage( directory, 'last_data' ); + if ( data !== null ) { + um_build_template( directory, data ); + } else { + + var show_after_search = false; + //set search line from session storage + if ( directory.find('.um-search-line').length ) { + var general_search = um_get_directory_storage( directory, 'general_search' ); + if ( general_search === null ) { + //show results after search + show_after_search = true; + } + } + + if ( jQuery('#tmpl-um-members-filtered-line').length ) { + var filters_data = []; + directory.find('.um-search-filter').each( function() { + var filter = jQuery(this); + var filter_name = filter.find('select').attr('name'); + var query_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + + if ( typeof( query_value ) != 'undefined' ) { + if ( typeof( query_value ) == 'string' ) { + filters_data.push( {'name':filter_name} ); + } else { + jQuery.each( query_value, function() { + filters_data.push( {'name': filter_name} ); + }); + } + } + }); + + show_after_search = ( filters_data.length <= 0 ); + } + + if ( parseInt( directory.data( 'only_search' ) ) === 1 && show_after_search ) { + return; + } + + um_members_show_preloader( directory ); + um_ajax_get_members( directory ); + } + }); + + + + + //filters controls + jQuery('.um-member-directory-filters').click( function() { + var search_bar = jQuery(this).parents('.um-directory').find('.um-search'); + + if ( search_bar.is(':visible') ) { + search_bar.slideUp(650); + } else { + search_bar.slideDown(650); + } + }); + + + jQuery('.um-close-filter').click( function() { + var search_bar = jQuery(this).parents('.um-directory').find('.um-search'); + search_bar.slideUp(650); + }); + + //filtration process + jQuery( document.body ).on( 'change', '.um-search-filter select', function() { + if ( jQuery(this).val() === '' ) { + return; + } + + var directory = jQuery(this).parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var filter_name = jQuery(this).prop('name'); + + var current_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( current_value === null ) { + current_value = []; + } + if ( -1 === jQuery.inArray( jQuery(this).val(), current_value ) ) { + current_value.push( jQuery(this).val() ); + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + + //set 1st page after filtration + um_set_directory_storage( directory, 'page', 1, true ); + } + + jQuery(this).val('').trigger('change'); + + um_ajax_get_members( directory ); + + um_change_tag( directory ); + + }); + + + jQuery( document.body ).on( 'click', '.um-members-filter-remove', function() { + var directory = jQuery(this).parents('.um-directory'); + + if ( um_is_directory_busy( directory ) ) { + return; + } + + var range = jQuery(this).data('range'); + + var removeItem = jQuery(this).data('value'); + var filter_name = jQuery(this).data('name'); + + var current_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + + if ( current_value !== null && -1 != jQuery.inArray( removeItem.toString(), current_value ) ) { + current_value = jQuery.grep( current_value, function( value ) { + return value != removeItem; + }); + + if ( current_value.length > 0 ) { + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + } + + //set 1st page after filtration + um_set_directory_storage( directory, 'page', 1, true ); + + jQuery(this).parents('.um-members-filter-tag').remove(); + } else if( current_value !== null && current_value[range] !== undefined ) { + directory.find('input.um-datepicker-filter[data-filter_name="' + filter_name + '"][data-range="' + range + '"]').val('').change(); + + delete current_value[range]; + if ( jQuery.isEmptyObject( current_value ) === false ) { + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + } + jQuery(this).parents('.um-members-filter-tag').remove(); + } else { + if( current_value.length > 1 && current_value.includes(removeItem)) { + current_value.splice( current_value.indexOf(removeItem), 1 ); + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + } + jQuery(this).parents('.um-members-filter-tag').remove(); + var slider = jQuery(directory).find('div.um-slider'); + slider.slider( "values", [ parseInt( slider.data('min') ), parseInt( slider.data('max') ) ] ); + //um_set_range_label( slider ); + } + + um_ajax_get_members( directory ); + + if ( directory.find( '.um-members-filter-remove' ).length === 0 ) { + directory.find('.um-clear-filters-a').hide(); + } else { + directory.find('.um-clear-filters-a').show(); + } + }); + + + jQuery( document.body ).on( 'click', '.um-clear-filters-a', function() { + var directory = jQuery(this).parents('.um-directory'); + if ( um_is_directory_busy( directory ) ) { + return; + } + + directory.find( '.um-members-filter-remove' ).each( function() { + var removeItem = jQuery(this).data('value'); + var filter_name = jQuery(this).data('name'); + var range = jQuery(this).data('range'); + + //um_delete_directory_storage( directory, 'filter_' + filter_name ); + + var current_value = um_get_directory_storage( directory, 'filter_' + filter_name ); + if ( current_value !== null && -1 != jQuery.inArray( removeItem.toString(), current_value ) ) { + current_value = jQuery.grep( current_value, function( value ) { + return value != removeItem; + }); + + if ( current_value.length > 0 ) { + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + } + + //set 1st page after filtration + um_set_directory_storage( directory, 'page', 1, true ); + + jQuery(this).parents('.um-members-filter-tag').remove(); + } else if( current_value !== null && current_value[range] !== undefined ) { + directory.find('input.um-datepicker-filter[data-filter_name="' + filter_name + '"][data-range="' + range + '"]').val('').change(); + + delete current_value[range]; + if ( jQuery.isEmptyObject( current_value ) === false ) { + um_set_directory_storage( directory, 'filter_' + filter_name, current_value, true ); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + } + jQuery(this).parents('.um-members-filter-tag').remove(); + } else { + um_delete_directory_storage( directory, 'filter_' + filter_name ); + jQuery(this).parents('.um-members-filter-tag').remove(); + var slider = jQuery(directory).find('div.um-slider'); + slider.slider( "values", [ parseInt( slider.data('min') ), parseInt( slider.data('max') ) ] ); + um_set_range_label( slider ); + } + }); + + //set 1st page after filtration + um_set_directory_storage( directory, 'page', 1, true ); + directory.find('.um-members-filter-tag').remove(); + + um_ajax_get_members( directory ); + + jQuery(this).hide(); + }); + }); \ No newline at end of file diff --git a/assets/js/um-members.min.js b/assets/js/um-members.min.js index d06bcdf2..7bca1378 100644 --- a/assets/js/um-members.min.js +++ b/assets/js/um-members.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){jQuery(".um-members").each(function(){UM_Member_Grid(jQuery(this))}),jQuery(".um-directory .um-member-connect").each(function(){0==jQuery(this).find("a").length&&jQuery(this).remove()}),jQuery(".um-member-meta-main").each(function(){0==jQuery(this).find(".um-member-metaline").length&&0==jQuery(this).find(".um-member-connect").find("a").length&&jQuery(this).remove()}),jQuery(document.body).on("click",".um-member-more a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),m=jQuery(this).parents(".um-members");return r.find(".um-member-more").hide(),r.find(".um-member-meta").slideDown(function(){UM_Member_Grid(m)}),r.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(m)},100),!1}),jQuery(document.body).on("click",".um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),m=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(m)}),!1}),jQuery(document.body).on("click",".um-do-search",function(e){return e.preventDefault(),jQuery(this).parents("form").find("input").filter(function(e){if(0===this.value.length)return!0}).prop("disabled",!0),jQuery(this).parents("form").find("select").filter(function(e){if(0===this.value.length)return!0}).prop("disabled",!0),jQuery(this).parents("form").submit(),!1})}); \ No newline at end of file +var um_members_directory_busy=[],um_member_directories=[];function um_parse_current_url(){var t={},i=window.location.search.substring(1).split("&");return jQuery.each(i,function(e){var r=i[e].split("=");t[r[0]]=r[1]}),t}function get_data_for_directory(r,e){var t={},i=um_parse_current_url();return jQuery.each(i,function(e){-1!==e.indexOf("_"+r)&&(t[e.replace("_"+r,"")]=i[e])}),e?t[e]:t}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){var r=um_members_get_hash(e);return void 0!==um_members_directory_busy[r]&&um_members_directory_busy[r]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t=e.siblings(".um-slider-range").data("placeholder");t=r?t.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1]).replace("{field_label}",e.siblings(".um-slider-range").data("label")):t.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1)).replace("{field_label}",e.siblings(".um-slider-range").data("label")),e.siblings(".um-slider-range").html(t),e.siblings(".um_range_min").val(e.slider("values",0)),e.siblings(".um_range_max").val(e.slider("values",1))}function um_ajax_get_members(i){var e=i.data("unique_id");e=e.replace("um-","");var r=-(new Date).getTimezoneOffset()/60,a={page:um_get_directory_storage(i,"page"),args:window["um_members_args_"+e],gmt_offset:r,nonce:um_scripts.nonce,referrer_url:window.location.href};return i.find(".um-member-directory-sorting-options").length&&(a.sorting=um_get_directory_storage(i,"sorting")),i.find(".um-search-line").length&&(a.general_search=um_get_directory_storage(i,"general_search")),i.find(".um-search-filter").length&&i.find(".um-search-filter").each(function(){var e=jQuery(this);if(e.find(".um-slider").length){var r=e.find(".um-slider").data("field_name");null!==(t=um_get_directory_storage(i,"filter_"+r))&&(a[r]=t,a.is_filters=!0)}else if(e.find(".um-datepicker-filter").length){r=e.find(".um-datepicker-filter").data("filter_name");null!==(t=um_get_directory_storage(i,"filter_"+r))&&(a[r]=t,a.is_filters=!0)}else{var t;r=e.find("select").attr("name");null!==(t=um_get_directory_storage(i,"filter_"+r))&&(a[r]=t,a.is_filters=!0)}}),wp.ajax.send("um_get_members",{data:a,success:function(e){um_set_directory_storage(i,"last_data",e,!0),um_build_template(i,e),um_members_hide_preloader(i);var r=wp.template("um-members-pagination");i.find(".um-members-pagination-box").html(r(e)),i.data("total_pages",e.pagination.total_pages),jQuery(document).trigger("um_members_rendered")},error:function(e){console.log(e)}})}function um_build_template(e,r){var t=um_get_directory_storage(e,"layout"),i=wp.template("um-member-"+t);e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(i(r)),e.addClass("um-loaded"),e.find(".um-members").length&&(UM_Member_Grid(e.find(".um-members")),jQuery(window).trigger("resize")),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize")}function UM_Member_Grid(e){e.find(".um-member").length&&e.imagesLoaded(function(){e.masonry({itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"}).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}jQuery(".um-directory").each(function(){var e=jQuery(this);if(um_member_directories.push(e.data("hash")),um_members_show_preloader(e),e.find(".um-member-directory-view-type-a").length){var r=e.find(".um-member-directory-view-type-a").parent(),i=um_get_directory_storage(e,"layout"),a=r.find(".um-member-directory-view-type-a").length;r.find(".um-member-directory-view-type-a").each(function(e,r){if(jQuery(r).data("type")==i){if(jQuery(r).show(),e===a-1)var t=jQuery(r).prevAll().last().attr("default-title");else t=jQuery(r).next().attr("default-title");jQuery(r).attr("original-title",t)}else jQuery(r).hide()})}if(e.find(".um-member-directory-sorting-options").length){var t=um_set_directory_storage(e,"sorting",e.find(".um-member-directory-sorting-options").val());e.find(".um-member-directory-sorting-options").val(t),null!==(t=um_get_directory_storage(e,"sorting"))&&e.find(".um-member-directory-sorting-options").val(t).trigger("change")}var m=!1;if(e.find(".um-search-line").length){var u=um_get_directory_storage(e,"general_search");null!==u?e.find(".um-search-line").val(u):m=!0}jQuery("#tmpl-um-members-filtered-line").length&&um_change_tag(e),0form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id_attr = ' id="' . esc_attr( $id ) . '" '; + + $class = ! empty( $field_data['class'] ) ? $field_data['class'] : ''; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class_attr = ' class="um-forms-field ' . esc_attr( $class ) . '" '; + + $data = array( + 'field_id' => $field_data['id'] + ); + + if ( ! empty( $field_data['attr'] ) && is_array( $field_data['attr'] ) ){ + $data = array_merge( $data, $field_data['attr'] ); + } + + $data_attr = ''; + foreach ( $data as $key => $value ) { + $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" '; + } + + $placeholder_attr = ! empty( $field_data['placeholder'] ) ? ' placeholder="' . esc_attr( $field_data['placeholder'] ) . '"' : ''; + + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name_attr = ' name="' . $name . '" '; + + $value = $this->get_field_value( $field_data ); + $value_attr = ' value="' . esc_attr( $value ) . '" '; + + $html = ""; + + return $html; + } + + /** * @param $field_data * @@ -908,8 +956,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $for_attr = ' for="' . esc_attr( $id . '_' . $k ) . '" '; $name_attr = ' name="' . $name . '[' . $k . ']" '; + $data = array( + 'field_id' => $field_data['id'] . '_' . $k, + ); + + if ( ! empty( $field_data['data'] ) ) { + $data = array_merge( $data, $field_data['data'] ); + } + + $data_attr = ''; + foreach ( $data as $key => $value ) { + if ( $value == 'checkbox_key' ) { + $value = $k; + } + $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" '; + } + $html .= ""; } diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 38b138d8..e03d2274 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -776,6 +776,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { */ function add_metabox_directory() { add_meta_box( 'um-admin-form-general', __( 'General Options', 'ultimate-member' ), array( &$this, 'load_metabox_directory' ), 'um_directory', 'normal', 'default' ); + add_meta_box( 'um-admin-form-sorting', __( 'Sorting', 'ultimate-member' ), array( &$this, 'load_metabox_directory' ), 'um_directory', 'normal', 'default' ); add_meta_box( 'um-admin-form-profile', __( 'Profile Card', 'ultimate-member' ), array( &$this, 'load_metabox_directory' ), 'um_directory', 'normal', 'default' ); add_meta_box( 'um-admin-form-search', __( 'Search Options', 'ultimate-member' ), array( &$this, 'load_metabox_directory' ), 'um_directory', 'normal', 'default' ); add_meta_box( 'um-admin-form-pagination', __( 'Results & Pagination', 'ultimate-member' ), array( &$this, 'load_metabox_directory' ), 'um_directory', 'normal', 'default' ); @@ -1014,26 +1015,31 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { * * @param $post_id * @param $post - * - * @return mixed */ function save_metabox_directory( $post_id, $post ) { global $wpdb; // validate nonce - if ( !isset( $_POST['um_admin_save_metabox_directory_nonce'] ) || !wp_verify_nonce( $_POST['um_admin_save_metabox_directory_nonce'], basename( __FILE__ ) ) ) return $post_id; + if ( ! isset( $_POST['um_admin_save_metabox_directory_nonce'] ) || ! wp_verify_nonce( $_POST['um_admin_save_metabox_directory_nonce'], basename( __FILE__ ) ) ) { + return; + } // validate post type - if ( $post->post_type != 'um_directory' ) return $post_id; + if ( $post->post_type != 'um_directory' ) { + return; + } // validate user $post_type = get_post_type_object( $post->post_type ); - if ( !current_user_can( $post_type->cap->edit_post, $post_id ) ) return $post_id; + if ( ! current_user_can( $post_type->cap->edit_post, $post_id ) ) { + return; + } $where = array( 'ID' => $post_id ); - if ( empty( $_POST['post_title'] ) ) + if ( empty( $_POST['post_title'] ) ) { $_POST['post_title'] = 'Directory #'.$post_id; + } $wpdb->update( $wpdb->posts, array( 'post_title' => $_POST['post_title'] ), $where ); @@ -1043,30 +1049,43 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { delete_post_meta( $post_id, '_um_reveal_fields' ); delete_post_meta( $post_id, '_um_search_fields' ); delete_post_meta( $post_id, '_um_roles_can_search' ); + delete_post_meta( $post_id, '_um_roles_can_filter' ); delete_post_meta( $post_id, '_um_show_these_users' ); //save metadata foreach ( $_POST['um_metadata'] as $k => $v ) { + if ( $k == '_um_show_these_users' && trim( $_POST['um_metadata'][ $k ] ) ) { $v = preg_split( '/[\r\n]+/', $v, -1, PREG_SPLIT_NO_EMPTY ); } + if ( strstr( $k, '_um_' ) ) { + if ( $k === '_um_is_default' ) { + $mode = UM()->query()->get_attr( 'mode', $post_id ); + if ( ! empty( $mode ) ) { + $posts = $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_um_mode' AND meta_value = 'directory'" ); + foreach ( $posts as $p_id ) { delete_post_meta( $p_id, '_um_is_default' ); } + } + } + $v = apply_filters( 'um_member_directory_meta_value_before_save', $v, $k, $post_id ); + update_post_meta( $post_id, $k, $v ); + } } } diff --git a/includes/admin/templates/directory/general.php b/includes/admin/templates/directory/general.php index d6a35c1a..b516cb8d 100644 --- a/includes/admin/templates/directory/general.php +++ b/includes/admin/templates/directory/general.php @@ -1,5 +1,6 @@ $v ) { @@ -8,67 +9,63 @@ foreach( $meta as $k => $v ) { } } -$roles_array = array(); -foreach ( UM()->roles()->get_roles() as $key => $value ) { - $_um_roles = UM()->query()->get_meta_value( '_um_roles', $key ); - if ( ! empty( $_um_roles ) ) - $roles_array[] = $_um_roles; -} +$_um_roles_value = get_post_meta( $post_id, '_um_roles', true ); +$_um_roles_value = empty( $_um_roles_value ) ? array() : $_um_roles_value; $show_these_users = get_post_meta( get_the_ID(), '_um_show_these_users', true ); if ( $show_these_users ) { $show_these_users = implode( "\n", str_replace( "\r", "", $show_these_users ) ); -} ?> +} + +$_um_view_types_value = get_post_meta( $post_id, '_um_view_types', true ); +$_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid' ) : $_um_view_types_value; + +$view_types_options = array_map( function( $item ) { + return $item['title']; +}, UM()->member_directory()->view_types ); + +$conditional = array(); +foreach ( $view_types_options as $key => $value ) { + $conditional[] = '_um_view_types_' . $key; +} +?>
- - */ - $sort_options = apply_filters( 'um_admin_directory_sort_users_select', array( - 'user_registered_desc' => __( 'New users first', 'ultimate-member' ), - 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ), - 'last_login' => __( 'Last login', 'ultimate-member' ), - 'display_name' => __( 'Display Name', 'ultimate-member' ), - 'first_name' => __( 'First Name', 'ultimate-member' ), - 'last_name' => __( 'Last Name', 'ultimate-member' ), - 'random' => __( 'Random', 'ultimate-member' ), - 'other' => __( 'Other (custom field)', 'ultimate-member' ), - ) ); - - $fields = array( + '_um_mode', - 'type' => 'hidden', - 'value' => 'directory', + 'id' => '_um_mode', + 'type' => 'hidden', + 'value' => 'directory', + ), + array( + 'id' => '_um_view_types', + 'type' => 'multi_checkbox', + 'label' => __( 'View type(s)', 'ultimate-member' ), + 'tooltip' => __( 'View type a specific parameter in the directory', 'ultimate-member' ), + 'options' => $view_types_options, + 'columns' => 3, + 'value' => $_um_view_types_value, + 'data' => array( 'fill__um_default_view' => 'checkbox_key' ), + ), + array( + 'id' => '_um_default_view', + 'type' => 'select', + 'label' => __( 'Default view type', 'ultimate-member' ), + 'tooltip' => __( 'Default directory view type', 'ultimate-member' ), + 'options' => $view_types_options, + 'value' => UM()->query()->get_meta_value( '_um_default_view', null, '' ), + 'conditional' => array( implode( '|', $conditional ), '~', 1 ) ), array( 'id' => '_um_roles', - 'type' => 'select', + 'type' => 'multi_checkbox', 'label' => __( 'User Roles to Display', 'ultimate-member' ), 'tooltip' => __( 'If you do not want to show all members, select only user roles to appear in this directory', 'ultimate-member' ), 'options' => UM()->roles()->get_roles(), - 'multi' => true, - 'value' => $roles_array, + 'columns' => 3, + 'value' => $_um_roles_value, ), array( 'id' => '_um_has_profile_photo', @@ -83,22 +80,6 @@ if ( $show_these_users ) { 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ), 'value' => UM()->query()->get_meta_value( '_um_has_cover_photo' ), ), - array( - 'id' => '_um_sortby', - 'type' => 'select', - 'label' => __( 'Sort users by', 'ultimate-member' ), - 'tooltip' => __( 'Sort users by a specific parameter in the directory', 'ultimate-member' ), - 'options' => $sort_options, - 'value' => UM()->query()->get_meta_value( '_um_sortby' ), - ), - array( - 'id' => '_um_sortby_custom', - 'type' => 'text', - 'label' => __( 'Meta key', 'ultimate-member' ), - 'tooltip' => __( 'To sort by a custom field, enter the meta key of field here', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_sortby_custom', null, 'na' ), - 'conditional' => array( '_um_sortby', '=', 'other' ) - ), array( 'id' => '_um_show_these_users', 'type' => 'textarea', diff --git a/includes/admin/templates/directory/pagination.php b/includes/admin/templates/directory/pagination.php index 4b7eaf36..35967074 100644 --- a/includes/admin/templates/directory/pagination.php +++ b/includes/admin/templates/directory/pagination.php @@ -3,33 +3,62 @@
admin_forms( array( - 'class' => 'um-member-directory-pagination um-half-column', - 'prefix_id' => 'um_metadata', - 'fields' => array( + 'class' => 'um-member-directory-pagination um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => array( array( - 'id' => '_um_profiles_per_page', - 'type' => 'text', - 'label' => __( 'Number of profiles per page', 'ultimate-member' ), - 'tooltip' => __( 'Number of profiles to appear on page for standard users', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page', null, 12 ), - 'size' => 'small' + 'id' => '_um_must_search', + 'type' => 'checkbox', + 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, member results will only appear after search/filter is performed', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_must_search' ), + 'conditional' => array( '_um_search||_um_filters', '=', 1 ), ), array( - 'id' => '_um_profiles_per_page_mobile', - 'type' => 'text', - 'label' => __( 'Number of profiles per page (for Mobiles & Tablets)', 'ultimate-member' ), - 'tooltip' => __( 'Number of profiles to appear on page for mobile users', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page_mobile', null, 8 ), - 'size' => 'small' + 'id' => '_um_max_users', + 'type' => 'number', + 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), + 'tooltip' => __( 'Use this setting to control the maximum number of profiles to appear in this directory. Leave blank to disable this limit', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_max_users', null, 'na' ), + 'size' => 'small' ), array( - 'id' => '_um_max_users', - 'type' => 'text', - 'label' => __( 'Maximum number of profiles', 'ultimate-member' ), - 'tooltip' => __( 'Use this setting to control the maximum number of profiles to appear in this directory. Leave blank to disable this limit', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_max_users', null, 'na' ), - 'size' => 'small' - ) + 'id' => '_um_profiles_per_page', + 'type' => 'number', + 'label' => __( 'Number of profiles per page', 'ultimate-member' ), + 'tooltip' => __( 'Number of profiles to appear on page for standard users', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page', null, 12 ), + 'size' => 'small' + ), + array( + 'id' => '_um_profiles_per_page_mobile', + 'type' => 'number', + 'label' => __( 'Number of profiles per page (for Mobiles & Tablets)', 'ultimate-member' ), + 'tooltip' => __( 'Number of profiles to appear on page for mobile users', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profiles_per_page_mobile', null, 8 ), + 'size' => 'small' + ), + array( + 'id' => '_um_directory_header', + 'type' => 'text', + 'label' => __( 'Results Text', 'ultimate-member' ), + 'tooltip' => __( 'Customize the search result text . e.g. Found 3,000 Members. Leave this blank to not show result text', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_header', null, __( '{total_users} Members', 'ultimate-member' ) ), + ), + array( + 'id' => '_um_directory_header_single', + 'type' => 'text', + 'label' => __( 'Single Result Text', 'ultimate-member' ), + 'tooltip' => __( 'Same as above but in case of 1 user found only', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_header_single', null, __( '{total_users} Member', 'ultimate-member' ) ), + ), + array( + 'id' => '_um_directory_no_users', + 'type' => 'text', + 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), + 'tooltip' => __( 'This is the text that is displayed if no users are found during a search', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_directory_no_users', null, __( 'We are sorry. We cannot find any users who match your search criteria.', 'ultimate-member' ) ), + ), ) ) )->render_form(); ?> diff --git a/includes/admin/templates/directory/profile.php b/includes/admin/templates/directory/profile.php index abec19d4..d988f9a1 100644 --- a/includes/admin/templates/directory/profile.php +++ b/includes/admin/templates/directory/profile.php @@ -12,77 +12,103 @@ $_um_tagline_fields = get_post_meta( $post_id, '_um_tagline_fields', true ); $_um_reveal_fields = get_post_meta( $post_id, '_um_reveal_fields', true ); + + $fields = array( + array( + 'id' => '_um_profile_photo', + 'type' => 'checkbox', + 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_profile_photo', null, 1 ), + ), + array( + 'id' => '_um_cover_photos', + 'type' => 'checkbox', + 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, the users cover photo will appear in the directory', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_cover_photos', null, 1 ), + ), + array( + 'id' => '_um_show_name', + 'type' => 'checkbox', + 'label' => __( 'Show display name', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_name', null, 1 ), + ), + array( + 'id' => '_um_show_tagline', + 'type' => 'checkbox', + 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_tagline' ), + ), + array( + 'id' => '_um_tagline_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose field(s) to display in tagline', 'ultimate-member' ), + 'value' => $_um_tagline_fields, + 'conditional' => array( '_um_show_tagline', '=', 1 ), + 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), + 'options' => $user_fields, + 'show_default_number' => 1, + ), + array( + 'id' => '_um_show_userinfo', + 'type' => 'checkbox', + 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_userinfo' ), + ), + array( + 'id' => '_um_reveal_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose field(s) to display in reveal section', 'ultimate-member' ), + 'value' => $_um_reveal_fields, + 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ), + 'options' => $user_fields, + 'show_default_number' => 1, + ), + array( + 'id' => '_um_show_social', + 'type' => 'checkbox', + 'label' => __( 'Show social connect icons', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_show_social' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ) + ), + array( + 'id' => '_um_userinfo_animate', + 'type' => 'checkbox', + 'label' => __( 'Enable reveal section transition by default', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_userinfo_animate' ), + 'conditional' => array( '_um_show_userinfo', '=', 1 ) + ), + ); + + + /** + * UM hook + * + * @type filter + * @title um_admin_extend_directory_options_general + * @description Extend Directory options fields + * @input_vars + * [{"var":"$fields","type":"array","desc":"Directory options fields"}] + * @change_log + * ["Since: 2.0"] + * @usage add_filter( 'um_admin_directory_sort_users_select', 'function_name', 10, 1 ); + * @example + * + */ + $fields = apply_filters( 'um_admin_extend_directory_options_profile', $fields ); + UM()->admin_forms( array( - 'class' => 'um-member-directory-profile um-half-column', - 'prefix_id' => 'um_metadata', - 'fields' => array( - array( - 'id' => '_um_profile_photo', - 'type' => 'checkbox', - 'label' => __( 'Enable Profile Photo', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_profile_photo', null, 1 ), - ), - array( - 'id' => '_um_cover_photos', - 'type' => 'checkbox', - 'label' => __( 'Enable Cover Photo', 'ultimate-member' ), - 'tooltip' => __( 'If turned on, the users cover photo will appear in the directory', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_cover_photos', null, 1 ), - ), - array( - 'id' => '_um_show_name', - 'type' => 'checkbox', - 'label' => __( 'Show display name', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_show_name', null, 1 ), - ), - array( - 'id' => '_um_show_tagline', - 'type' => 'checkbox', - 'label' => __( 'Show tagline below profile name', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_show_tagline' ), - ), - array( - 'id' => '_um_tagline_fields', - 'type' => 'multi_selects', - 'label' => __( 'Choose field(s) to display in tagline', 'ultimate-member' ), - 'value' => $_um_tagline_fields, - 'conditional' => array( '_um_show_tagline', '=', 1 ), - 'add_text' => __( 'Add New Custom Field','ultimate-member' ), - 'options' => $user_fields, - 'show_default_number' => 1, - ), - array( - 'id' => '_um_show_userinfo', - 'type' => 'checkbox', - 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_show_userinfo' ), - ), - array( - 'id' => '_um_userinfo_animate', - 'type' => 'checkbox', - 'label' => __( 'Enable reveal section transition by default', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_userinfo_animate' ), - 'conditional' => array( '_um_show_userinfo', '=', 1 ) - ), - array( - 'id' => '_um_reveal_fields', - 'type' => 'multi_selects', - 'label' => __( 'Choose field(s) to display in reveal section', 'ultimate-member' ), - 'value' => $_um_reveal_fields, - 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), - 'conditional' => array( '_um_show_userinfo', '=', 1 ), - 'options' => $user_fields, - 'show_default_number' => 1, - ), - array( - 'id' => '_um_show_social', - 'type' => 'checkbox', - 'label' => __( 'Show social connect icons', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_show_social' ), - 'conditional' => array( '_um_show_userinfo', '=', 1 ) - ) - ) + 'class' => 'um-member-directory-profile um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => $fields, ) )->render_form(); ?> - +
\ No newline at end of file diff --git a/includes/admin/templates/directory/search.php b/includes/admin/templates/directory/search.php index ec801148..7457fe32 100644 --- a/includes/admin/templates/directory/search.php +++ b/includes/admin/templates/directory/search.php @@ -1,14 +1,35 @@ - +
roles()->get_roles() as $key => $value ) { - $_um_roles_can_search = UM()->query()->get_meta_value( '_um_roles_can_search', $key ); - if ( ! empty( $_um_roles_can_search ) ) - $can_search_array[] = $_um_roles_can_search; - } + /*$_um_roles_search_value = array(); + $_um_roles_search = get_post_meta( $post_id, '_um_roles_can_search', true ); + if ( ! empty( $_um_roles_search ) ) { + foreach ( UM()->roles()->get_roles() as $key => $value ) { + if ( in_array( $key, array_keys( $_um_roles_search ) ) ) { + $_um_roles_search_value[] = $key; + } + } + }*/ + + $_um_roles_search_value = get_post_meta( $post_id, '_um_roles_can_search', true ); + $_um_roles_search_value = empty( $_um_roles_search_value ) ? array() : $_um_roles_search_value; + + /*$_um_roles_filter_value = array(); + $_um_roles_filter = get_post_meta( $post_id, '_um_roles_can_filter', true ); + if ( ! empty( $_um_roles_filter ) ) { + foreach ( UM()->roles()->get_roles() as $key => $value ) { + if ( in_array( $key, array_keys( $_um_roles_filter ) ) ) { + $_um_roles_filter_value[] = $key; + } + } + }*/ + + $_um_roles_filter_value = get_post_meta( $post_id, '_um_roles_can_filter', true ); + $_um_roles_filter_value = empty( $_um_roles_filter_value ) ? array() : $_um_roles_filter_value; /** * UM hook @@ -36,84 +57,68 @@ $searchable_fields = $searchable_fields + $custom_search; $user_fields = array(); foreach ( $searchable_fields as $key => $arr ) { - $user_fields[$key] = isset( $arr['title'] ) ? $arr['title'] : ''; + $user_fields[ $key ] = isset( $arr['title'] ) ? $arr['title'] : ''; } - $post_id = get_the_ID(); - $_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); + //$post_id = get_the_ID(); + $_um_search_fields = get_post_meta( $post_id, '_um_search_fields', true ); UM()->admin_forms( array( - 'class' => 'um-member-directory-search um-half-column', - 'prefix_id' => 'um_metadata', - 'fields' => array( + 'class' => 'um-member-directory-search um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => array( array( - 'id' => '_um_search', - 'type' => 'checkbox', - 'label' => __( 'Enable Search feature', 'ultimate-member' ), - 'tooltip' => __( 'If turned on, users will be able to search members in this directory', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_search' ), + 'id' => '_um_search', + 'type' => 'checkbox', + 'label' => __( 'Enable Search feature', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, users will be able to search members in this directory', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_search' ), ), array( - 'id' => '_um_must_search', - 'type' => 'checkbox', - 'label' => __( 'Show results only after search', 'ultimate-member' ), - 'tooltip' => __( 'If turned on, member results will only appear after search is performed', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value( '_um_must_search' ), + 'id' => '_um_roles_can_search', + 'type' => 'multi_checkbox', + 'label' => __( 'User Roles that can use search', 'ultimate-member' ), + 'tooltip' => __( 'If you want to allow specific user roles to be able to search only', 'ultimate-member' ), + 'value' => $_um_roles_search_value, + 'options' => UM()->roles()->get_roles(), + 'columns' => 3, 'conditional' => array( '_um_search', '=', 1 ) ), array( - 'id' => '_um_roles_can_search', - 'type' => 'select', - 'multi' => true, - 'label' => __( 'User Roles that can use search', 'ultimate-member' ), - 'tooltip' => __( 'If you want to allow specific user roles to be able to search only', 'ultimate-member' ), - 'value' => $can_search_array, - 'options' => UM()->roles()->get_roles(), - 'conditional' => array( '_um_search', '=', 1 ) + 'id' => '_um_filters', + 'type' => 'checkbox', + 'label' => __( 'Enable Filters feature', 'ultimate-member' ), + 'tooltip' => __( 'If turned on, users will be able to filter members in this directory', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_filters' ), ), array( - 'id' => '_um_search_fields', - 'type' => 'multi_selects', - 'label' => __( 'Choose field(s) to enable in search', 'ultimate-member' ), - 'value' => $_um_search_fields, - 'conditional' => array( '_um_search', '=', 1 ), - 'options' => $user_fields, - 'add_text' => __( 'Add New Custom Field','ultimate-member' ), - 'show_default_number' => 1, + 'id' => '_um_roles_can_filter', + 'type' => 'multi_checkbox', + 'label' => __( 'User Roles that can use filters', 'ultimate-member' ), + 'tooltip' => __( 'If you want to allow specific user roles to be able to filter only', 'ultimate-member' ), + 'value' => $_um_roles_filter_value, + 'options' => UM()->roles()->get_roles(), + 'columns' => 3, + 'conditional' => array( '_um_filters', '=', 1 ) ), array( - 'id' => '_um_search_filters', - 'type' => 'text', - 'label' => __( 'Additional search filters', 'ultimate-member' ), - 'tooltip' => __( 'Additional search filters like URL parameters' ), - 'value' => UM()->query()->get_meta_value('_um_search_filters', null, '' ), - 'conditional' => array( '_um_search', '=', 1 ), - 'placeholder' => 'field1=val1&field2=val2' + 'id' => '_um_search_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose filter(s) meta to enable', 'ultimate-member' ), + 'value' => $_um_search_fields, + 'conditional' => array( '_um_filters', '=', 1 ), + 'options' => UM()->member_directory()->filter_fields, + 'add_text' => __( 'Add New Custom Field', 'ultimate-member' ), + 'show_default_number' => 1, ), array( - 'id' => '_um_directory_header', - 'type' => 'text', - 'label' => __( 'Results Text', 'ultimate-member' ), - 'tooltip' => __( 'Customize the search result text . e.g. Found 3,000 Members. Leave this blank to not show result text', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value('_um_directory_header', null, __('{total_users} Members','ultimate-member') ), - 'conditional' => array( '_um_search', '=', 1 ) + 'id' => '_um_search_filters', + 'type' => 'text', + 'label' => __( 'Default filters', 'ultimate-member' ), + 'tooltip' => __( 'You can set default filters like URL parameters', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value('_um_search_filters', null, 'na' ), + 'placeholder' => 'field1=val1&field2=val2' ), - array( - 'id' => '_um_directory_header_single', - 'type' => 'text', - 'label' => __( 'Single Result Text', 'ultimate-member' ), - 'tooltip' => __( 'Same as above but in case of 1 user found only', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value('_um_directory_header_single', null, __('{total_users} Member','ultimate-member') ), - 'conditional' => array( '_um_search', '=', 1 ) - ), - array( - 'id' => '_um_directory_no_users', - 'type' => 'text', - 'label' => __( 'Custom text if no users were found', 'ultimate-member' ), - 'tooltip' => __( 'This is the text that is displayed if no users are found during a search', 'ultimate-member' ), - 'value' => UM()->query()->get_meta_value('_um_directory_no_users', null, __('We are sorry. We cannot find any users who match your search criteria.','ultimate-member') ), - 'conditional' => array( '_um_search', '=', 1 ) - ) ) ) )->render_form(); ?> diff --git a/includes/admin/templates/directory/sorting.php b/includes/admin/templates/directory/sorting.php new file mode 100644 index 00000000..52cd58ea --- /dev/null +++ b/includes/admin/templates/directory/sorting.php @@ -0,0 +1,54 @@ + + +
+ + '_um_sortby', + 'type' => 'select', + 'label' => __( 'Default sort users by', 'ultimate-member' ), + 'tooltip' => __( 'Default sorting users by a specific parameter in the directory', 'ultimate-member' ), + 'options' => UM()->member_directory()->default_sorting, + 'value' => UM()->query()->get_meta_value( '_um_sortby' ), + ), + array( + 'id' => '_um_sortby_custom', + 'type' => 'text', + 'label' => __( 'Meta key', 'ultimate-member' ), + 'tooltip' => __( 'To sort by a custom field, enter the meta key of field here', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_sortby_custom', null, 'na' ), + 'conditional' => array( '_um_sortby', '=', 'other' ) + ), + array( + 'id' => '_um_enable_sorting', + 'type' => 'checkbox', + 'label' => __( 'Enable custom sorting', 'ultimate-member' ), + 'tooltip' => __( 'Whether to provide an ability to change the sorting on the directory page', 'ultimate-member' ), + 'value' => UM()->query()->get_meta_value( '_um_enable_sorting' ), + ), + array( + 'id' => '_um_sorting_fields', + 'type' => 'multi_selects', + 'label' => __( 'Choose field(s) to enable in sorting', 'ultimate-member' ), + 'value' => $_um_sorting_fields, + 'options' => UM()->member_directory()->sort_fields, + 'add_text' => __( 'Add New Field', 'ultimate-member' ), + 'show_default_number' => 1, + 'conditional' => array( '_um_enable_sorting', '=', 1 ) + ) + ); + + UM()->admin_forms( array( + 'class' => 'um-member-directory-sorting um-half-column', + 'prefix_id' => 'um_metadata', + 'fields' => $fields + ) )->render_form(); ?> + +
+
\ No newline at end of file diff --git a/includes/class-init.php b/includes/class-init.php index 8481140c..04780161 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -563,6 +563,7 @@ if ( ! class_exists( 'UM' ) ) { $this->mobile(); $this->external_integrations(); $this->gdpr(); + $this->member_directory(); //if multisite networks active if ( is_multisite() ) { @@ -572,6 +573,19 @@ if ( ! class_exists( 'UM' ) ) { } + /** + * @since 2.1.0 + * + * @return um\core\Member_Directory() + */ + function member_directory() { + if ( empty( $this->classes['member_directory'] ) ) { + $this->classes['member_directory'] = new um\core\Member_Directory(); + } + return $this->classes['member_directory']; + } + + /** * Get extension API * diff --git a/includes/core/class-enqueue.php b/includes/core/class-enqueue.php index 2aa1e5f2..62cc8c2b 100644 --- a/includes/core/class-enqueue.php +++ b/includes/core/class-enqueue.php @@ -135,7 +135,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { ) ); wp_localize_script( 'um_scripts', 'um_scripts', $localize_data ); - wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); + wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider' ), ultimatemember_version, true ); wp_register_script('um_profile', $this->js_baseurl . 'um-profile' . $this->suffix . '.js', array( 'jquery', 'wp-util' ), ultimatemember_version, true ); wp_register_script('um_account', $this->js_baseurl . 'um-account' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); @@ -166,7 +166,10 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) { wp_register_style( 'um_responsive', $this->css_baseurl . 'um-responsive.css', array( 'um_profile', 'um_crop' ), ultimatemember_version ); wp_register_style( 'um_styles', $this->css_baseurl . 'um-styles.css', array(), ultimatemember_version ); - wp_register_style( 'um_members', $this->css_baseurl . 'um-members.css', array(), ultimatemember_version ); + + wp_register_style( 'um_ui', $this->css_baseurl . 'jquery-ui.css', array(), ultimatemember_version ); + + wp_register_style( 'um_members', $this->css_baseurl . 'um-members.css', array( 'um_ui' ), ultimatemember_version ); wp_register_style( 'um_profile', $this->css_baseurl . 'um-profile.css', array(), ultimatemember_version ); wp_register_style( 'um_account', $this->css_baseurl . 'um-account.css', array(), ultimatemember_version ); wp_register_style( 'um_misc', $this->css_baseurl . 'um-misc.css', array(), ultimatemember_version ); diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php new file mode 100644 index 00000000..fee2bd41 --- /dev/null +++ b/includes/core/class-member-directory.php @@ -0,0 +1,194 @@ +post_type == 'um_directory' ) { + + if ( ! empty( $value ) && in_array( $key, array( '_um_view_types', '_um_roles', '_um_roles_can_search', '_um_roles_can_filter' ) ) ) { + $value = array_keys( $value ); + } + } + + return $value; + } + + + /** + * + */ + function init_variables() { + + // Types + $this->view_types = apply_filters( 'um_member_directory_views', array( + 'grid' => array( 'title' => __( 'Grid', 'ultimate-member' ), 'icon' => 'um-faicon-th' ), + 'list' => array( 'title' => __( 'List', 'ultimate-member' ), 'icon' => 'um-faicon-list' ), + ) ); + + // Sort + $this->sort_fields = apply_filters( 'um_members_directory_sort_fields', array( + 'user_registered_desc' => __( 'New Users First', 'ultimate-member' ), + 'user_registered_asc' => __( 'Old Users First', 'ultimate-member' ), + 'username' => __( 'Username', 'ultimate-member' ), + 'first_name' => __( 'First Name', 'ultimate-member' ), + 'last_name' => __( 'Last Name', 'ultimate-member' ), + 'display_name' => __( 'Display Name', 'ultimate-member' ), + 'last_login' => __( 'Last Login', 'ultimate-member' ), + ) ); + + asort( $this->sort_fields ); + + $this->default_sorting = apply_filters( 'um_members_directory_default_sort', array_merge( $this->sort_fields, array( + 'random' => __( 'Random', 'ultimate-member' ), + 'other' => __( 'Other (Custom Field)', 'ultimate-member' ), + ) ) ); + + asort( $this->default_sorting ); + + + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + // Filters + $this->filter_fields = array( + 'country' => __( 'Country', 'ultimate-member' ), + 'gender' => __( 'Gender', 'ultimate-member' ), + 'languages' => __( 'Languages', 'ultimate-member' ), + 'role' => __( 'Roles', 'ultimate-member' ), + 'birth_date' => __( 'Age', 'ultimate-member' ), + 'last_login' => __( 'Last Login', 'ultimate-member' ), + 'user_registered' => __( 'User Registered', 'ultimate-member' ), + ); + + $this->filter_supported_fields = apply_filters( 'um_members_directory_custom_field_types_supported_filter', array( 'date', 'time', 'select', 'multiselect', 'radio', 'checkbox', 'rating' ) ); + + foreach ( UM()->builtin()->saved_fields as $key => $data ) { + if ( isset( $data['type'] ) && in_array( $data['type'], $this->filter_supported_fields ) ) { + if ( array_search( $data['title'], $this->filter_fields ) !== false ) { + $data['title'] = $data['title'] . ' (' . $key . ')'; + } + $this->filter_fields[ $key ] = $data['title']; + } + } + + $this->filter_fields = apply_filters( 'um_members_directory_filter_fields', $this->filter_fields ); + + ksort( $this->filter_fields ); + } + } +} \ No newline at end of file diff --git a/includes/core/class-members.php b/includes/core/class-members.php index dd9bdb04..ef3dd8b1 100644 --- a/includes/core/class-members.php +++ b/includes/core/class-members.php @@ -21,6 +21,12 @@ if ( ! class_exists( 'um\core\Members' ) ) { var $results; + /** + * @var + */ + var $query_args; + + /** * Members constructor. */ @@ -41,6 +47,359 @@ if ( ! class_exists( 'um\core\Members' ) ) { } + /** + * @param $borndate + * + * @return false|string + */ + function borndate( $borndate ) { + if ( date('m', $borndate) > date('m') || date('m', $borndate) == date('m') && date('d', $borndate ) > date('d')) { + return (date('Y') - date('Y', $borndate ) - 1); + } + return (date('Y') - date('Y', $borndate)); + } + + + /** + * Render member's directory + * filters selectboxes + * + * @param string $filter + * @return string $filter + */ + function show_filter( $filter ) { + + $filter_types = apply_filters( 'um_members_directory_filter_types', array( + 'country' => 'select', + 'gender' => 'select', + 'languages' => 'select', + 'role' => 'select', + 'birth_date' => 'slider', + 'last_login' => 'datepicker', + 'user_registered' => 'datepicker', + ) ); + + $field_key = $filter; + if ( $filter == 'last_login' ) { + $field_key = '_um_last_login'; + } + + $fields = UM()->builtin()->all_user_fields; + + $custom_fields_types = array_flip( array_keys( UM()->member_directory()->filter_fields ) ); + foreach ( $custom_fields_types as $key => &$value ) { + if ( ! isset( $fields[ $key ] ) ) { + unset( $custom_fields_types[ $key ] ); + } else { + switch ( $fields[ $key ]['type'] ) { + default: + $value = apply_filters( 'um_custom_field_filter_type', 'select', $fields[ $key ] ); + break; + case 'date': + $value = 'datepicker'; + break; + case 'time': + $value = 'timepicker'; + break; + case 'select': + case 'multiselect': + case 'radio': + case 'checkbox': + $value = 'select'; + break; + case 'rating': + $value = 'slider'; + break; + } + } + } + + $filter_types = array_merge( $custom_fields_types, $filter_types ); + + //var_dump( $filter_types ); + + + if ( empty( $filter_types[ $filter ] ) ) { + return ''; + } + + if ( isset( $fields[ $field_key ] ) ) { + $attrs = $fields[ $field_key ]; + } else { + /** + * UM hook + * + * @type filter + * @title um_custom_search_field_{$filter} + * @description Custom search settings by $filter + * @input_vars + * [{"var":"$settings","type":"array","desc":"Search Settings"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $attrs = apply_filters( "um_custom_search_field_{$filter}", array() ); + } + + /** + * UM hook + * + * @type filter + * @title um_search_fields + * @description Filter all search fields + * @input_vars + * [{"var":"$settings","type":"array","desc":"Search Fields"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $attrs = apply_filters( 'um_search_fields', $attrs ); + ob_start(); + + switch ( $filter_types[ $filter ] ) { + default: { + + do_action( "um_member_directory_filter_type_{$filter_types[ $filter ]}", $filter, $filter_types ); + + break; + } + case 'select': { + + if ( isset( $attrs['metakey'] ) && strstr( $attrs['metakey'], 'role_' ) ) { + $shortcode_roles = get_post_meta( UM()->shortcodes()->form_id, '_um_roles', true ); + $um_roles = UM()->roles()->get_roles( false ); + + if ( ! empty( $shortcode_roles ) && is_array( $shortcode_roles ) ) { + $attrs['options'] = array(); + + foreach ( $um_roles as $key => $value ) { + if ( in_array( $key, $shortcode_roles ) ) { + $attrs['options'][ $key ] = $value; + } + } + } + } + + if ( ! empty( $attrs['custom_dropdown_options_source'] ) ) { + $attrs['custom'] = true; + $attrs['options'] = UM()->fields()->get_options_from_callback( $attrs, $attrs['type'] ); + } + + if ( isset( $attrs['label'] ) ) { + $attrs['label'] = strip_tags( $attrs['label'] ); + } + + if ( isset( $attrs['options'] ) && is_array( $attrs['options'] ) ) { + asort( $attrs['options'] ); + } + + $custom_dropdown = ! empty( $attrs['custom_dropdown_options_source'] ) ? ' data-um-ajax-source="' . $attrs['custom_dropdown_options_source'] . '"' : ''; + + if ( ! empty( $attrs['options'] ) || ! empty( $custom_dropdown ) ) { ?> + + + + slider_filters_range( $filter ); + $placeholder = $this->slider_range_placeholder( $filter ); + + if ( $range ) { ?> + + +
+
+ datepicker_filters_range( $filter ); + + if ( $range ) { ?> + + + + + get_col( "SELECT DISTINCT meta_value FROM {$wpdb->usermeta} WHERE meta_key='birth_date' ORDER BY meta_value DESC" ); + + if ( empty( $meta ) || count( $meta ) === 1 ) { + $range = false; + } elseif ( ! empty( $meta ) ) { + $range = array( $this->borndate( strtotime( $meta[0] ) ), $this->borndate( strtotime( $meta[ count( $meta ) - 1 ] ) ) ); + } + + break; + } + + } + + return $range; + } + + + + /** + * @param $filter + * + * @return mixed + */ + function slider_range_placeholder( $filter ) { + switch ( $filter ) { + default: { + $label = ucwords( str_replace(array('um_', '_'), array('', ' '), $filter) ); + $placeholder = apply_filters( "um_member_directory_filter_{$filter}_slider_range_placeholder", "$label: {min_range} - {max_range}" ); + break; + } + case 'birth_date': { + $placeholder = __( 'Age: {min_range} - {max_range} years old', 'ultimate-member' ); + break; + } + case 'user_rating': { + $placeholder = __( 'User Rating: {min_range} - {max_range} points', 'ultimate-member' ); + break; + } + } + + return $placeholder; + } + + + /** + * @param $filter + * + * @return mixed + */ + function datepicker_filters_range( $filter ) { + global $wpdb; + + switch ( $filter ) { + + default: { + $range = apply_filters( "um_member_directory_filter_{$filter}_datepicker", false ); + + break; + } + case 'last_login': { + $meta = $wpdb->get_col( "SELECT DISTINCT meta_value + FROM {$wpdb->usermeta} + WHERE meta_key='_um_last_login' + ORDER BY meta_value DESC" ); + + if ( empty( $meta ) || count( $meta ) === 1 ) { + $range = false; + } elseif ( ! empty( $meta ) ) { + $range = array( min( $meta ), max( $meta ) ); + } + + break; + } + case 'user_registered': { + $meta = $wpdb->get_col( + "SELECT DISTINCT user_registered + FROM {$wpdb->users} + ORDER BY user_registered DESC" + ); + + if ( empty( $meta ) || count( $meta ) === 1 ) { + $range = false; + } elseif ( ! empty( $meta ) ) { + $range = array( strtotime( min( $meta ) ), strtotime( max( $meta ) ) ); + } + + break; + } + + } + + return $range; + } + + /** * User_search_columns * @@ -229,74 +588,6 @@ if ( ! class_exists( 'um\core\Members' ) ) { } - /** - * Show filter - * - * @param $filter - */ - function show_filter( $filter ) { - /** - * @var $type - * @var $attrs - */ - extract( $this->prepare_filter( $filter ) ); - - switch ( $type ) { - - case 'select': - /*if( isset($attrs) && is_array( $attrs['options'] ) ){ - asort( $attrs['options'] ); - }*/ - if ( isset( $attrs['label'] ) ) { - $label = $attrs['label']; - } else { - $label = isset( $attrs['title'] ) ? $attrs['title'] : ''; - } ?> - - - - - - - - 'OR', + array( + 'key' => 'synced_profile_photo', // addons + 'value' => '', + 'compare' => '!=' + ), + array( + 'key' => 'profile_photo', // from upload form + 'value' => '', + 'compare' => '!=' + ) + ); + + if ( UM()->options()->get( 'use_gravatars' ) ) { + $meta_query[] = array( + 'key' => 'synced_gravatar_hashed_id', // gravatar + 'value' => '', + 'compare' => '!=' + ); + } + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + } + } + + + /** + * Must have a cover photo + * + * @param $args + */ + function cover_photo_query( $args ) { + if ( $args['has_cover_photo'] == 1 ) { + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( + 'key' => 'cover_photo', + 'value' => '', + 'compare' => '!=' + ) ) ); + } + } + + + /** + * + */ + function hide_not_approved() { + if ( UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { + return; + } + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( array( + 'key' => 'account_status', + 'value' => 'approved', + 'compare' => '=' + ) ) ); + } + + + /** + * + */ + function hide_by_role() { + $roles = um_user( 'can_view_roles' ); + $roles = maybe_unserialize( $roles ); + + if ( empty( $roles ) || ! UM()->roles()->um_user_can( 'can_view_all' ) ) { + return; + } + + if ( ! empty( $this->query_args['role__in'] ) ) { + $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); + $this->query_args['role__in'] = array_intersect( $this->query_args['role__in'], $roles ); + } else { + $this->query_args['role__in'] = $roles; + } + } + + + /** + * + */ + function hide_by_account_settings() { + if ( ! UM()->options()->get( 'account_hide_in_directory' ) ) { + return; + } + + if ( UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { + return; + } + + $meta_query = array( + "relation" => "OR", + array( + 'key' => 'hide_in_members', + 'value' => '', + 'compare' => 'NOT EXISTS' + ), + array( + "relation" => "AND", + array( + 'key' => 'hide_in_members', + 'value' => __( 'Yes', 'ultimate-member' ), + 'compare' => 'NOT LIKE' + ), + array( + 'key' => 'hide_in_members', + 'value' => 'Yes', + 'compare' => 'NOT LIKE' + ), + ), + ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + } + + + /** + * @param $args + */ + function sorting_query( $args ) { + // sort members by + $this->query_args['order'] = 'ASC'; + $sortby = ! empty( $_POST['sorting'] ) ? $_POST['sorting'] : $args['sortby']; + + if ( $sortby == 'other' && $args['sortby_custom'] ) { + + $this->query_args['meta_key'] = $args['sortby_custom']; + $this->query_args['orderby'] = 'meta_value, display_name'; + + } elseif ( in_array( $sortby, array( 'last_name', 'first_name' ) ) ) { + + $this->query_args['meta_key'] = $sortby; + $this->query_args['orderby'] = 'meta_value'; + + } elseif ( $sortby == 'last_login' ) { + + $this->query_args['meta_key'] = '_um_last_login'; + $this->query_args['orderby'] = 'meta_value_num'; + $this->query_args['order'] = 'desc'; + + } else { + + if ( strstr( $sortby, '_desc' ) ) { + $sortby = str_replace( '_desc','', $sortby ); + $order = 'DESC'; + } + + if ( strstr( $sortby, '_asc' ) ) { + $sortby = str_replace('_asc','',$sortby); + $order = 'ASC'; + } + + $this->query_args['orderby'] = $sortby; + if ( isset( $order ) ) { + $this->query_args['order'] = $order; + } + } + + + /** + * UM hook + * + * @type filter + * @title um_modify_sortby_parameter + * @description Change query sort by attributes for search at Members Directory + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Query Arguments"}, + * {"var":"$sortby","type":"string","desc":"Sort by"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $this->query_args = apply_filters( 'um_modify_sortby_parameter', $this->query_args, $sortby ); + } + + + function general_search() { + //general search + if ( ! empty( $_POST['general_search'] ) ) { + $meta_query = array( + array( + 'value' => trim( $_POST['general_search'] ), + 'compare' => '=', + ), + array( + 'value' => trim( $_POST['general_search'] ), + 'compare' => 'LIKE', + ), + array( + 'value' => trim( serialize( strval( $_POST['general_search'] ) ) ), + 'compare' => 'LIKE', + ), + 'relation' => 'OR', + ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + } + } + + + /** + * + */ + function filters( $args ) { + //filters + $query = $_POST; + if ( ! empty( $args['search_filters'] ) ) { + parse_str( $args['search_filters'], $search_filters ); + if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + $query = array_merge( $search_filters, $query ); + } + } + + unset( $query['sorting'] ); + unset( $query['page'] ); + unset( $query['args'] ); + unset( $query['members_page'] ); + unset( $query['general_search'] ); + unset( $query['action'] ); + unset( $query['nonce'] ); + unset( $query['referrer_url'] ); + unset( $query['is_filters'] ); + + if ( ! empty( $query ) && is_array( $query ) ) { + foreach ( $query as $field => $value ) { + + //$filter_data = UM()->members()->prepare_filter( $field ); + + if ( $value && $field != 'um_search' && $field != 'page_id' ) { + + if ( strstr( $field, 'role_' ) ) { + $field = 'role'; + } + + if ( ! in_array( $field, UM()->members()->core_search_fields ) ) { + + if ( 'role' == $field ) { + + if ( ! empty( $this->query_args['role__in'] ) ) { + $value = array_map('strtolower', $value); + + $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); + $default_role = array_intersect( $this->query_args['role__in'], $value ); + $um_role = array_diff( $value, $default_role ); + + foreach ($um_role as $key => &$val) { + $val = 'um_' . str_replace(' ', '-', $val); + } + $this->query_args['role__in'] = array_merge( $default_role, $um_role ); + } else { + $this->query_args['role__in'] = $value; + }; + + } elseif ( 'birth_date' == $field ) { + $from_date = date( 'Y-m-d', mktime( 0,0,0, 1, 1, date('Y', time() - ($query['birth_date'][0] -1)*YEAR_IN_SECONDS ) ) ); + $to_date = date( 'Y-m-d', mktime( 0,0,0, 1, 1, date('Y', time() - ($query['birth_date'][1] +1)*YEAR_IN_SECONDS ) ) ); + + $meta_query = array( + array( + 'key' => 'birth_date', + 'value' => array( $to_date, $from_date ), + 'compare' => 'BETWEEN', + 'type' => 'DATE', + 'inclusive' => true, + ) + ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + + } elseif ( 'user_registered' == $field ) { + + $offset = 0; + + if( isset( $query['gmt_offset'] ) ) { + $offset = (int)$query['gmt_offset']; + } + + if( isset( $query['user_registered']['from'] ) ) { + $from_date = date( 'Y-m-d', strtotime( date( 'Y-m-d H:s:i', $query['user_registered']['from'] ) . "+$offset hours" ) ); + } + + if( isset( $query['user_registered']['to'] ) ) { + $to_date = date( 'Y-m-d', strtotime( date( 'Y-m-d H:s:i', $query['user_registered']['to'] ) . "+$offset hours" ) ); + } + + $date_query = array( + array( + 'column' => 'user_registered', + 'before' => $to_date, + 'after' => $from_date, + 'inclusive' => true, + ), + ); + + $this->query_args['date_query'] = array( $date_query ); + + } elseif ( 'last_login' == $field ) { + + $meta_query = array(); + $offset = 0; + + if( isset( $query['gmt_offset'] ) ) { + $offset = (int)$query['gmt_offset']; + } + + if( isset( $query['last_login']['from'] ) and isset( $query['last_login']['to'] ) ) { + $from_date = (int)$query['last_login']['from'] + ( $offset * 60 * 60 ); // client time zone offset + $to_date = (int)$query['last_login']['to'] + ( $offset * 60 * 60 ) + (24 * 60 * 60 - 1); // time 23:59 + + $meta_query[] = array( + 'key' => '_um_last_login', + 'value' => array( $from_date, $to_date ), + 'compare' => 'BETWEEN', + ); + + } else { + + if( isset( $query['last_login']['from'] ) ) { + $from_date = (int)$query['last_login']['from'] + ( $offset * 60 * 60 ); + + $meta_query[] = array( + 'key' => '_um_last_login', + 'value' => $from_date, + 'compare' => '>', + ); + } + + if( isset( $query['last_login']['to'] ) ) { + $to_date = (int)$query['last_login']['to'] + ( $offset * 60 * 60 ) + (24 * 60 * 60 - 1); + + $meta_query[] = array( + 'key' => '_um_last_login', + 'value' => $to_date, + 'compare' => '<', + ); + } + } + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); + + } elseif( 'gmt_offset' == $field ) { + continue; + } else { + + if ( is_array( $value ) ) { + $field_query = array( 'relation' => 'OR' ); + + foreach ( $value as $single_val ) { + $field_query = array_merge( $field_query, array( + array( + 'key' => $field, + 'value' => trim( $single_val ), + 'compare' => '=', + ) + ) ); + + $types = apply_filters( 'um_search_field_types', array( + 'multiselect', + 'radio', + 'checkbox' + ) ); + + //if ( in_array( $filter_data['attrs']['type'], $types ) ) { + + $arr_meta_query = array( + array( + 'key' => $field, + 'value' => serialize( strval( trim( $single_val ) ) ), + 'compare' => 'LIKE', + ), + array( + 'key' => $field, + 'value' => '"' . trim( $single_val ) . '"', + 'compare' => 'LIKE', + ) + ); + + if ( is_numeric( $single_val ) ) { + + $arr_meta_query[ ] = array( + 'key' => $field, + 'value' => serialize( intval( trim( $single_val ) ) ), + 'compare' => 'LIKE', + ); + + } + + $field_query = array_merge( $field_query, $arr_meta_query ); + //} + } + } else { + $field_query = array( + array( + 'key' => $field, + 'value' => trim( $value ), + 'compare' => '=', + ), + 'relation' => 'OR', + ); + + $types = apply_filters( 'um_search_field_types', array( + 'multiselect', + 'radio', + 'checkbox' + ) ); + + //if ( in_array( $filter_data['attrs']['type'], $types ) ) { + + $arr_meta_query = array( + array( + 'key' => $field, + 'value' => serialize( strval( trim( $value ) ) ), + 'compare' => 'LIKE', + ), + array( + 'key' => $field, + 'value' => '"' . trim( $value ) . '"', + 'compare' => 'LIKE', + ) + ); + + if ( is_numeric( $value ) ) { + + $arr_meta_query[ ] = array( + 'key' => $field, + 'value' => serialize( intval( trim( $value ) ) ), + 'compare' => 'LIKE', + ); + + } + + $field_query = array_merge( $field_query, $arr_meta_query ); + //} + } + + /** + * UM hook + * + * @type filter + * @title um_query_args_{$field}__filter + * @description Change field's query for search at Members Directory + * @input_vars + * [{"var":"$field_query","type":"array","desc":"Field query"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $field_query = apply_filters( "um_query_args_{$field}__filter", $field_query ); + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) ); + } + + } + + } + + } + } + + $query = UM()->permalinks()->get_query_array(); + $arr_columns = array(); + + foreach ( UM()->members()->core_search_fields as $key ) { + if ( ! empty( $query[ $key ] ) ) { + $arr_columns[] = $key; + $this->query_args['search'] = '*' . $query[ $key ] .'*'; + } + } + + if ( ! empty( $arr_columns ) ) { + $this->query_args['search_columns'] = $arr_columns; + } + } + + + /** + * get AJAX results members + */ + function ajax_get_members() { + UM()->check_ajax_nonce(); + + global $wpdb; + + $args = ! empty( $_POST['args'] ) ? $_POST['args'] : array(); + $args['page'] = ! empty( $_POST['page'] ) ? $_POST['page'] : ( isset( $args['page'] ) ? $args['page'] : 1 ); + + /** + * @var $profiles_per_page + * @var $profiles_per_page_mobile + * @var $header + * @var $header_single + * @var $has_profile_photo + * @var $has_cover_photo + */ + extract( $args ); + + $data_args = array( + 'show_count' => false + ); + if ( ! empty( $_POST['general_search'] ) || ! empty( $_POST['is_filters'] ) || ! empty( $args['search_filters'] ) ) { + $data_args['show_count'] = true; + } + + $this->query_args = array( + 'fields' => 'ids', + 'number' => 0, + 'meta_query' => array( + 'relation' => 'AND' + ), + ); + + // add roles to appear in directory + if ( ! empty( $args['roles'] ) ) { + //since WP4.4 use 'role__in' argument + $this->query_args['role__in'] = $args['roles']; + } + + $this->profile_photo_query( $args ); + + $this->cover_photo_query( $args ); + + // show specific usernames + if ( ! empty( $args['show_these_users'] ) && is_array( $args['show_these_users'] ) ) { + foreach ( $args['show_these_users'] as $username ) { + if ( false !== ( $exists_id = username_exists( $username ) ) ) { + $users_array[] = $exists_id; + } + } + + $this->query_args['include'] = $users_array; + } + + $this->hide_not_approved(); + + $this->hide_by_role(); + + $this->hide_by_account_settings(); + + $this->sorting_query( $args ); + + $this->general_search(); + + $this->filters( $args ); + + /** + * UM hook + * + * @type filter + * @title um_prepare_user_query_args + * @description Extend member directory query arguments + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Members Query Arguments"}, + * {"var":"$directory_settings","type":"array","desc":"Member Directory Settings"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $this->query_args = apply_filters( 'um_prepare_user_query_args', $this->query_args, $args ); + + //unset empty meta_query attribute + if ( isset( $this->query_args['meta_query']['relation'] ) && count( $this->query_args['meta_query'] ) == 1 ) { + unset( $this->query_args['meta_query'] ); + } + + // Prepare for BIG SELECT query + $wpdb->query( 'SET SQL_BIG_SELECTS=1' ); + + // number of profiles for mobile + $profiles_per_page = $args['profiles_per_page']; + if ( UM()->mobile()->isMobile() && isset( $args['profiles_per_page_mobile'] ) ) { + $profiles_per_page = $args['profiles_per_page_mobile']; + } + + $this->query_args['number'] = isset( $args['number'] ) ? $args['number'] : $profiles_per_page; + $this->query_args['number'] = ( ! empty( $args['max_users'] ) && $args['max_users'] <= $profiles_per_page ) ? $args['max_users'] : $this->query_args['number']; + + $current_page = isset( $args['page'] ) ? $args['page'] : 1; + $this->query_args['paged'] = $current_page; + + if ( ! UM()->roles()->um_user_can( 'can_view_all' ) && is_user_logged_in() ) { + $this->query_args = array(); + } + + /** + * UM hook + * + * @type action + * @title um_user_before_query + * @description Action before users query on member directory + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Query arguments"}] + * @change_log + * ["Since: 2.0"] + * @usage add_action( 'um_user_before_query', 'function_name', 10, 1 ); + * @example + * + */ + do_action( 'um_user_before_query', $this->query_args ); + + add_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 ); + + $users = new \WP_User_Query( $this->query_args ); + + remove_filter( 'get_meta_sql', array( &$this, 'change_meta_sql' ), 10 ); + + /** + * UM hook + * + * @type action + * @title um_user_after_query + * @description Action before users query on member directory + * @input_vars + * [{"var":"$query_args","type":"array","desc":"Query arguments"}, + * {"var":"$users","type":"array","desc":"Users"}] + * @change_log + * ["Since: 2.0"] + * @usage add_action( 'um_user_after_query', 'function_name', 10, 2 ); + * @example + * + */ + do_action( 'um_user_after_query', $this->query_args, $users ); + + $user_ids = ! empty( $users->results ) ? array_unique( $users->results ) : array(); + $total_users = ( ! empty( $max_users ) && $max_users <= $users->total_users ) ? $max_users : $users->total_users; + $total_pages = ceil( $total_users / $profiles_per_page ); + + if ( ! empty( $total_pages ) ) { + $index1 = 0 - ( $current_page - 2 ) + 1; + $to = $current_page + 2; + if ( $index1 > 0 ) { + $to += $index1; + } + + $index2 = $total_pages - ( $current_page + 2 ); + $from = $current_page - 2; + if ( $index2 < 0 ) { + $from += $index2; + } + + $pages_to_show = range( + ( $from > 0 ) ? $from : 1, + ( $to <= $total_pages ) ? $to : $total_pages + ); + } + + /** + * UM hook + * + * @type filter + * @title um_prepare_user_results_array + * @description Extend member directory query result + * @input_vars + * [{"var":"$result","type":"array","desc":"Members Query Result"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $users = apply_filters( 'um_prepare_user_results_array', $user_ids ); + + $sizes = UM()->options()->get( 'cover_thumb_sizes' ); + $cover_size = UM()->mobile()->isTablet() ? $sizes[1] : $sizes[0]; + + $users_data = array(); + foreach ( $users as $user_id ) { + um_fetch_user( $user_id ); + + $actions = array(); + if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) || UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { + $actions[] = array( + 'title' => __( 'Edit profile','ultimate-member' ), + 'url' => um_edit_profile_url(), + 'wrapper_class' => 'um-members-edit-btn', + 'class' => 'um-edit-profile-btn um-button um-alt', + ); + } + + // Replace hook 'um_members_just_after_name' + ob_start(); + do_action( 'um_members_just_after_name', $user_id, $args ); + $hook_just_after_name = ob_get_clean(); + + // Replace hook 'um_members_after_user_name' + ob_start(); + do_action( 'um_members_after_user_name', $user_id, $args ); + $hook_after_user_name = ob_get_clean(); + + $data_array = array( + 'id' => $user_id, + 'role' => um_user( 'role' ), + 'account_status' => um_user( 'account_status' ), + 'account_status_name' => um_user( 'account_status_name' ), + 'cover_photo' => um_user( 'cover_photo', $cover_size ), + 'display_name' => um_user( 'display_name' ), + 'profile_url' => um_user_profile_url(), + 'can_edit' => ( UM()->roles()->um_current_user_can( 'edit', $user_id ) || UM()->roles()->um_user_can( 'can_edit_everyone' ) ) ? true : false, + 'edit_profile_url' => um_edit_profile_url(), + 'avatar' => get_avatar( $user_id, str_replace( 'px', '', UM()->options()->get( 'profile_photosize' ) ) ), + 'display_name_html' => um_user( 'display_name', 'html' ), + 'social_urls' => UM()->fields()->show_social_urls( false ), + 'actions' => $actions, + 'hook_just_after_name' => preg_replace('/^\s+/im', '', $hook_just_after_name), + 'hook_after_user_name' => preg_replace('/^\s+/im', '', $hook_after_user_name), + ); + + if ( $args['show_tagline'] && is_array( $args['tagline_fields'] ) ) { + foreach ( $args['tagline_fields'] as $key ) { + if ( $key && um_filtered_value( $key ) ) { + $data_array[ $key ] = um_filtered_value( $key ); + } + } + } + + if ( $args['show_userinfo'] ) { + foreach ( $args['reveal_fields'] as $key ) { + if ( $key && um_filtered_value( $key ) ) { + $label = strtr( UM()->fields()->get_label( $key ), array( + ' (Dropdown)' => '', + ' (Radio)' => '' + ) ); + $data_array[ "label_{$key}" ] = $label; + $data_array[ $key ] = um_filtered_value( $key ); + } + } + } + + $users_data[] = apply_filters( 'um_ajax_get_members_data', $data_array, $user_id ); + um_reset_user_clean(); + } + + um_reset_user(); + + $pagination_data = array( + 'pages_to_show' => ( ! empty( $pages_to_show ) && count( $pages_to_show ) > 1 ) ? array_values( $pages_to_show ) : array(), + 'current_page' => $args['page'], + 'total_pages' => $total_pages, + 'total_users' => $total_users, + ); + + $pagination_data['header'] = $this->convert_tags( $args['header'], $pagination_data ); + $pagination_data['header_single'] = $this->convert_tags( $args['header_single'], $pagination_data ); + + wp_send_json_success( array( 'users' => $users_data, 'pagination' => $pagination_data, 'args' => $data_args ) ); + } + + } } \ No newline at end of file diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index 5043daf5..2876ce79 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -261,6 +261,99 @@ function um_submit_form_errors_hook( $args ) { add_action( 'um_submit_form_errors_hook', 'um_submit_form_errors_hook', 10 ); +function um_check_conditions_on_submit( $condition, $fields, $args ) { + $continue = false; + + list( $visibility, $parent_key, $op, $parent_value ) = $condition; + + if ( ! isset( $args[ $parent_key ] ) ) { + $continue = true; + return $continue; + } + + if ( ! empty( $fields[ $parent_key ]['conditions'] ) ) { + foreach ( $fields[ $parent_key ]['conditions'] as $parent_condition ) { + $continue = um_check_conditions_on_submit( $parent_condition, $fields, $args ); + if ( ! empty( $continue ) ) { + return $continue; + } + } + } + + $cond_value = ( $fields[ $parent_key ]['type'] == 'radio' ) ? $args[ $parent_key ][0] : $args[ $parent_key ]; + + if ( $visibility == 'hide' ) { + if ( $op == 'empty' ) { + if ( empty( $cond_value ) ) { + $continue = true; + } + } elseif ( $op == 'not empty' ) { + if ( ! empty( $cond_value ) ) { + $continue = true; + } + } elseif ( $op == 'equals to' ) { + if ( $cond_value == $parent_value ) { + $continue = true; + } + } elseif ( $op == 'not equals' ) { + if ( $cond_value != $parent_value ) { + $continue = true; + } + } elseif ( $op == 'greater than' ) { + if ( $cond_value > $parent_value ) { + $continue = true; + } + } elseif ( $op == 'less than' ) { + if ( $cond_value < $parent_value ) { + $continue = true; + } + } elseif ( $op == 'contains' ) { + if ( is_string( $cond_value ) && strstr( $cond_value, $parent_value ) ) { + $continue = true; + } + if( is_array( $cond_value ) && in_array( $parent_value, $cond_value ) ) { + $continue = true; + } + } + } elseif ( $visibility == 'show' ) { + if ( $op == 'empty' ) { + if ( ! empty( $cond_value ) ) { + $continue = true; + } + } elseif ( $op == 'not empty' ) { + if ( empty( $cond_value ) ) { + $continue = true; + } + } elseif ( $op == 'equals to' ) { + if ( $cond_value != $parent_value ) { + $continue = true; + } + } elseif ( $op == 'not equals' ) { + if ( $cond_value == $parent_value ) { + $continue = true; + } + } elseif ( $op == 'greater than' ) { + if ( $cond_value <= $parent_value ) { + $continue = true; + } + } elseif ( $op == 'less than' ) { + if ( $cond_value >= $parent_value ) { + $continue = true; + } + } elseif ( $op == 'contains' ) { + if ( is_string( $cond_value ) && ! strstr( $cond_value, $parent_value ) ) { + $continue = true; + } + if( is_array( $cond_value ) && !in_array( $parent_value, $cond_value ) ) { + $continue = true; + } + } + } + + return $continue; +} + + /** * Error processing hook : standard * @@ -312,80 +405,9 @@ function um_submit_form_errors_hook_( $args ) { if ( ! empty( $array['conditions'] ) ) { foreach ( $array['conditions'] as $condition ) { - list( $visibility, $parent_key, $op, $parent_value ) = $condition; - - if ( ! isset( $args[ $parent_key ] ) ) { - continue; - } - - $cond_value = ( $fields[ $parent_key ]['type'] == 'radio' ) ? $args[ $parent_key ][0] : $args[ $parent_key ]; - - if ( $visibility == 'hide' ) { - if ( $op == 'empty' ) { - if ( empty( $cond_value ) ) { - continue 2; - } - } elseif ( $op == 'not empty' ) { - if ( ! empty( $cond_value ) ) { - continue; - } - } elseif ( $op == 'equals to' ) { - if ( $cond_value == $parent_value ) { - continue; - } - } elseif ( $op == 'not equals' ) { - if ( $cond_value != $parent_value ) { - continue; - } - } elseif ( $op == 'greater than' ) { - if ( $cond_value > $parent_value ) { - continue; - } - } elseif ( $op == 'less than' ) { - if ( $cond_value < $parent_value ) { - continue; - } - } elseif ( $op == 'contains' ) { - if ( is_string( $cond_value ) && strstr( $cond_value, $parent_value ) ) { - continue; - } - if( is_array( $cond_value ) && in_array( $parent_value, $cond_value ) ) { - continue; - } - } - } elseif ( $visibility == 'show' ) { - if ( $op == 'empty' ) { - if ( ! empty( $cond_value ) ) { - continue; - } - } elseif ( $op == 'not empty' ) { - if ( empty( $cond_value ) ) { - continue; - } - } elseif ( $op == 'equals to' ) { - if ( $cond_value != $parent_value ) { - continue; - } - } elseif ( $op == 'not equals' ) { - if ( $cond_value == $parent_value ) { - continue; - } - } elseif ( $op == 'greater than' ) { - if ( $cond_value <= $parent_value ) { - continue; - } - } elseif ( $op == 'less than' ) { - if ( $cond_value >= $parent_value ) { - continue; - } - } elseif ( $op == 'contains' ) { - if ( is_string( $cond_value ) && ! strstr( $cond_value, $parent_value ) ) { - continue; - } - if( is_array( $cond_value ) && !in_array( $parent_value, $cond_value ) ) { - continue; - } - } + $continue = um_check_conditions_on_submit( $condition, $fields, $args ); + if ( $continue === true ) { + continue 2; } } } diff --git a/includes/core/um-actions-members.php b/includes/core/um-actions-members.php index 616dc5a1..b0d1ae79 100644 --- a/includes/core/um-actions-members.php +++ b/includes/core/um-actions-members.php @@ -94,7 +94,7 @@ function um_members_directory_search( $args ) { } } -add_action( 'um_members_directory_search', 'um_members_directory_search' ); +//add_action( 'um_members_directory_search', 'um_members_directory_search' ); /** diff --git a/templates/members-list.php b/templates/members-list.php new file mode 100644 index 00000000..5282f555 --- /dev/null +++ b/templates/members-list.php @@ -0,0 +1,130 @@ + + + + \ No newline at end of file diff --git a/templates/members-pagination.php b/templates/members-pagination.php new file mode 100644 index 00000000..5d79a5e4 --- /dev/null +++ b/templates/members-pagination.php @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/templates/members.php b/templates/members.php index 311a6b18..d0b1fb0e 100644 --- a/templates/members.php +++ b/templates/members.php @@ -1,73 +1,197 @@ - +get_class( $mode ) ); ?> um-"> +// Get default and real arguments +$def_args = array(); +foreach ( UM()->config()->core_directory_meta['members'] as $k => $v ) { + $key = str_replace( '_um_', '', $k ); + $def_args[ $key ] = $v; +} + +$args = array_merge( $def_args, $args ); + + +//current user priority role +$priority_user_role = false; +if ( is_user_logged_in() ) { + $priority_user_role = UM()->roles()->get_priority_user_role( um_user( 'ID' ) ); +} + + +// Views +$single_view = false; +$current_view = 'grid'; +if ( empty( $args['view_types'] ) || ! is_array( $args['view_types'] ) ) { + $args['view_types'] = array( + 'grid', + 'list' + ); +} + +if ( count( $args['view_types'] ) == 1 ) { + $single_view = true; + $current_view = $args['view_types'][0]; +} else { + $args['default_view'] = ! empty( $args['default_view'] ) ? $args['default_view'] : $args['view_types'][0]; + $current_view = ( ! empty( $_GET['view_type'] ) && in_array( $_GET['view_type'], $args['view_types'] ) ) ? $_GET['view_type'] : $args['default_view']; +} + +// Sorting +$default_sorting = ! empty( $args['sortby'] ) ? $args['sortby'] : 'user_registered_desc'; + +if ( $args['enable_sorting'] ) { + $sorting_options = empty( $args['sorting_fields'] ) ? array() : $args['sorting_fields']; + if ( ! in_array( $default_sorting, $sorting_options ) ) { + $sorting_options[] = $default_sorting; + } + + if ( ! empty( $sorting_options ) ) { + $all_sorting_options = UM()->member_directory()->sort_fields; + $sorting_options = array_intersect_key( $all_sorting_options, array_flip( $sorting_options ) ); + } +} + + +//Search +$search = isset( $args['search'] ) ? $args['search'] : false; +$show_search = empty( $args['roles_can_search'] ) || ( ! empty( $priority_user_role ) && in_array( $priority_user_role, $args['roles_can_search'] ) ); + + +//Filters +$filters = isset( $args['filters'] ) ? $args['filters'] : false; +$show_filters = empty( $args['roles_can_filter'] ) || ( ! empty( $priority_user_role ) && in_array( $priority_user_role, $args['roles_can_filter'] ) ); +$search_filters = array(); +if ( isset( $args['search_fields'] ) ) { + $search_filters = apply_filters( 'um_frontend_member_search_filters', array_unique( array_filter( $args['search_fields'] ) ) ); +} + +// Classes +$classes = ''; +if ( $search && $show_search ) { + $classes .= ' um-member-with-search'; +} + +if ( $filters && $show_filters && count( $search_filters ) ) { + $classes .= ' um-member-with-filters'; +} + +if ( ! $single_view ) { + $classes .= ' um-member-with-view'; +} + +if ( $args['enable_sorting'] && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) { + $classes .= ' um-member-with-sorting'; +} ?> + +
- - */ - do_action( 'um_members_directory_search', $args ); +
+ +
+ +
+ + + +
+
+ +
+
+ - */ + if ( $args['enable_sorting'] && ! empty( $sorting_options ) && count( $sorting_options ) > 1 ) { ?> +
+ +
+ + +
+ +
+ + + +
+ + + member_directory()->view_types as $key => $value ) { + if ( in_array( $key, $args['view_types'] ) ) { + if ( empty( $view_types ) ) { ?> +
+ + + + +
+ +
+
+
+ + + + + + +
+
+
+ - /** - * UM hook - * - * @type action - * @title um_members_directory_display - * @description Member directory display content - * @input_vars - * [{"var":"$args","type":"array","desc":"Member directory shortcode arguments"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_members_directory_display', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_members_directory_display', $args ); +
+
+
+
+
+ + */ do_action( 'um_members_directory_footer', $args ); ?> + +
\ No newline at end of file