wip: create/update/...
This commit is contained in:
parent
cc06019738
commit
3e92cc8551
|
@ -0,0 +1,209 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-tokenfield
|
||||||
|
* https://github.com/sliptree/bootstrap-tokenfield
|
||||||
|
* Copyright 2013-2014 Sliptree and other contributors; Licensed MIT
|
||||||
|
*/
|
||||||
|
@-webkit-keyframes 'blink' {
|
||||||
|
0% {
|
||||||
|
border-color: #ededed;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
border-color: #b94a48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@-moz-keyframes 'blink' {
|
||||||
|
0% {
|
||||||
|
border-color: #ededed;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
border-color: #b94a48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes 'blink' {
|
||||||
|
0% {
|
||||||
|
border-color: #ededed;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
border-color: #b94a48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.tokenfield {
|
||||||
|
height: auto;
|
||||||
|
min-height: 34px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
.tokenfield.focus {
|
||||||
|
border-color: #66afe9;
|
||||||
|
outline: 0;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);
|
||||||
|
}
|
||||||
|
.tokenfield .token {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
display: inline-block;
|
||||||
|
border: 1px solid #d9d9d9;
|
||||||
|
background-color: #ededed;
|
||||||
|
white-space: nowrap;
|
||||||
|
margin: -1px 5px 5px 0;
|
||||||
|
height: 22px;
|
||||||
|
vertical-align: top;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.tokenfield .token:hover {
|
||||||
|
border-color: #b9b9b9;
|
||||||
|
}
|
||||||
|
.tokenfield .token.active {
|
||||||
|
border-color: #52a8ec;
|
||||||
|
border-color: rgba(82, 168, 236, 0.8);
|
||||||
|
}
|
||||||
|
.tokenfield .token.duplicate {
|
||||||
|
border-color: #ebccd1;
|
||||||
|
-webkit-animation-name: blink;
|
||||||
|
animation-name: blink;
|
||||||
|
-webkit-animation-duration: 0.1s;
|
||||||
|
animation-duration: 0.1s;
|
||||||
|
-webkit-animation-direction: normal;
|
||||||
|
animation-direction: normal;
|
||||||
|
-webkit-animation-timing-function: ease;
|
||||||
|
animation-timing-function: ease;
|
||||||
|
-webkit-animation-iteration-count: infinite;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
}
|
||||||
|
.tokenfield .token.invalid {
|
||||||
|
background: none;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
-webkit-border-radius: 0;
|
||||||
|
-moz-border-radius: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
border-bottom: 1px dotted #d9534f;
|
||||||
|
}
|
||||||
|
.tokenfield .token.invalid.active {
|
||||||
|
background: #ededed;
|
||||||
|
border: 1px solid #ededed;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.tokenfield .token .token-label {
|
||||||
|
display: inline-block;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
padding-left: 4px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.tokenfield .token .close {
|
||||||
|
font-family: Arial;
|
||||||
|
display: inline-block;
|
||||||
|
line-height: 100%;
|
||||||
|
font-size: 1.1em;
|
||||||
|
line-height: 1.49em;
|
||||||
|
margin-left: 5px;
|
||||||
|
float: none;
|
||||||
|
height: 100%;
|
||||||
|
vertical-align: top;
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
||||||
|
.tokenfield .token-input {
|
||||||
|
background: none;
|
||||||
|
width: 60px;
|
||||||
|
min-width: 60px;
|
||||||
|
border: 0;
|
||||||
|
height: 20px;
|
||||||
|
padding: 0;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.tokenfield .token-input:focus {
|
||||||
|
border-color: transparent;
|
||||||
|
outline: 0;
|
||||||
|
/* IE6-9 */
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.tokenfield.disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
background-color: #eeeeee;
|
||||||
|
}
|
||||||
|
.tokenfield.disabled .token-input {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.tokenfield.disabled .token:hover {
|
||||||
|
cursor: not-allowed;
|
||||||
|
border-color: #d9d9d9;
|
||||||
|
}
|
||||||
|
.tokenfield.disabled .token:hover .close {
|
||||||
|
cursor: not-allowed;
|
||||||
|
opacity: 0.2;
|
||||||
|
filter: alpha(opacity=20);
|
||||||
|
}
|
||||||
|
.has-warning .tokenfield.focus {
|
||||||
|
border-color: #66512c;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
||||||
|
}
|
||||||
|
.has-error .tokenfield.focus {
|
||||||
|
border-color: #843534;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
||||||
|
}
|
||||||
|
.has-success .tokenfield.focus {
|
||||||
|
border-color: #2b542c;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
||||||
|
}
|
||||||
|
.tokenfield.input-sm,
|
||||||
|
.input-group-sm .tokenfield {
|
||||||
|
min-height: 30px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
.input-group-sm .token,
|
||||||
|
.tokenfield.input-sm .token {
|
||||||
|
height: 20px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
.input-group-sm .token-input,
|
||||||
|
.tokenfield.input-sm .token-input {
|
||||||
|
height: 18px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
.tokenfield.input-lg,
|
||||||
|
.input-group-lg .tokenfield {
|
||||||
|
min-height: 45px;
|
||||||
|
padding-bottom: 4px;
|
||||||
|
}
|
||||||
|
.input-group-lg .token,
|
||||||
|
.tokenfield.input-lg .token {
|
||||||
|
height: 25px;
|
||||||
|
}
|
||||||
|
.input-group-lg .token-label,
|
||||||
|
.tokenfield.input-lg .token-label {
|
||||||
|
line-height: 23px;
|
||||||
|
}
|
||||||
|
.input-group-lg .token .close,
|
||||||
|
.tokenfield.input-lg .token .close {
|
||||||
|
line-height: 1.3em;
|
||||||
|
}
|
||||||
|
.input-group-lg .token-input,
|
||||||
|
.tokenfield.input-lg .token-input {
|
||||||
|
height: 23px;
|
||||||
|
line-height: 23px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.tokenfield.rtl {
|
||||||
|
direction: rtl;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.tokenfield.rtl .token {
|
||||||
|
margin: -1px 0 5px 5px;
|
||||||
|
}
|
||||||
|
.tokenfield.rtl .token .token-label {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 4px;
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-tokenfield
|
||||||
|
* https://github.com/sliptree/bootstrap-tokenfield
|
||||||
|
* Copyright 2013-2014 Sliptree and other contributors; Licensed MIT
|
||||||
|
*/@-webkit-keyframes 'blink'{0%{border-color:#ededed}100%{border-color:#b94a48}}@-moz-keyframes 'blink'{0%{border-color:#ededed}100%{border-color:#b94a48}}@keyframes 'blink'{0%{border-color:#ededed}100%{border-color:#b94a48}}.tokenfield{height:auto;min-height:34px;padding-bottom:0}.tokenfield.focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.tokenfield .token{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:inline-block;border:1px solid #d9d9d9;background-color:#ededed;white-space:nowrap;margin:-1px 5px 5px 0;height:22px;vertical-align:top;cursor:default}.tokenfield .token:hover{border-color:#b9b9b9}.tokenfield .token.active{border-color:#52a8ec;border-color:rgba(82,168,236,.8)}.tokenfield .token.duplicate{border-color:#ebccd1;-webkit-animation-name:blink;animation-name:blink;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-direction:normal;animation-direction:normal;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.tokenfield .token.invalid{background:0 0;border:1px solid transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-bottom:1px dotted #d9534f}.tokenfield .token.invalid.active{background:#ededed;border:1px solid #ededed;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.tokenfield .token .token-label{display:inline-block;overflow:hidden;text-overflow:ellipsis;padding-left:4px;vertical-align:top}.tokenfield .token .close{font-family:Arial;display:inline-block;line-height:100%;font-size:1.1em;line-height:1.49em;margin-left:5px;float:none;height:100%;vertical-align:top;padding-right:4px}.tokenfield .token-input{background:0 0;width:60px;min-width:60px;border:0;height:20px;padding:0;margin-bottom:6px;-webkit-box-shadow:none;box-shadow:none}.tokenfield .token-input:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;box-shadow:none}.tokenfield.disabled{cursor:not-allowed;background-color:#eee}.tokenfield.disabled .token-input{cursor:not-allowed}.tokenfield.disabled .token:hover{cursor:not-allowed;border-color:#d9d9d9}.tokenfield.disabled .token:hover .close{cursor:not-allowed;opacity:.2;filter:alpha(opacity=20)}.has-warning .tokenfield.focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-error .tokenfield.focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-success .tokenfield.focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.tokenfield.input-sm,.input-group-sm .tokenfield{min-height:30px;padding-bottom:0}.input-group-sm .token,.tokenfield.input-sm .token{height:20px;margin-bottom:4px}.input-group-sm .token-input,.tokenfield.input-sm .token-input{height:18px;margin-bottom:5px}.tokenfield.input-lg,.input-group-lg .tokenfield{min-height:45px;padding-bottom:4px}.input-group-lg .token,.tokenfield.input-lg .token{height:25px}.input-group-lg .token-label,.tokenfield.input-lg .token-label{line-height:23px}.input-group-lg .token .close,.tokenfield.input-lg .token .close{line-height:1.3em}.input-group-lg .token-input,.tokenfield.input-lg .token-input{height:23px;line-height:23px;margin-bottom:6px;vertical-align:top}.tokenfield.rtl{direction:rtl;text-align:right}.tokenfield.rtl .token{margin:-1px 0 5px 5px}.tokenfield.rtl .token .token-label{padding-left:0;padding-right:4px}
|
|
@ -51,4 +51,13 @@
|
||||||
|
|
||||||
.disabled-peer {
|
.disabled-peer {
|
||||||
color: #d03131;
|
color: #d03131;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tokenfield .token {
|
||||||
|
border-radius: 0px;
|
||||||
|
border: 1px solid #1a1a1a;
|
||||||
|
color: #1a1a1a;
|
||||||
|
background-color: #f7f7f9;
|
||||||
|
margin: -4px 5px 5px 0;
|
||||||
|
height: 22px;
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,141 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-tokenfield
|
||||||
|
* https://github.com/sliptree/bootstrap-tokenfield
|
||||||
|
* Copyright 2013-2014 Sliptree and other contributors; Licensed MIT
|
||||||
|
*/
|
||||||
|
/* General Typeahead styling, from http://jsfiddle.net/ragulka/Dy9au/1/ */
|
||||||
|
.twitter-typeahead {
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .tt-input,
|
||||||
|
.twitter-typeahead .tt-hint {
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .tt-hint {
|
||||||
|
color: #999999;
|
||||||
|
z-index: 1;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .tt-input {
|
||||||
|
color: #555555;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .tt-input,
|
||||||
|
.twitter-typeahead .tt-hint {
|
||||||
|
height: 34px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.428571429;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .input-sm.tt-input,
|
||||||
|
.twitter-typeahead .hint-sm.tt-hint {
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.twitter-typeahead .input-lg.tt-input,
|
||||||
|
.twitter-typeahead .hint-lg.tt-hint {
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
.input-group .twitter-typeahead:first-child .tt-input,
|
||||||
|
.input-group .twitter-typeahead:first-child .tt-hint {
|
||||||
|
border-radius: 4px 0 0 4px !important;
|
||||||
|
}
|
||||||
|
.input-group .twitter-typeahead:last-child .tt-input,
|
||||||
|
.input-group .twitter-typeahead:last-child .tt-hint {
|
||||||
|
border-radius: 0 4px 4px 0 !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-sm .twitter-typeahead:first-child .tt-input,
|
||||||
|
.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint {
|
||||||
|
border-radius: 3px 0 0 3px !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-sm .twitter-typeahead:last-child .tt-input,
|
||||||
|
.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint {
|
||||||
|
border-radius: 0 3px 3px 0 !important;
|
||||||
|
}
|
||||||
|
.input-sm.tt-input,
|
||||||
|
.hint-sm.tt-hint,
|
||||||
|
.input-group.input-group-sm .tt-input,
|
||||||
|
.input-group.input-group-sm .tt-hint {
|
||||||
|
height: 30px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.input-group.input-group-lg .twitter-typeahead:first-child .tt-input,
|
||||||
|
.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint {
|
||||||
|
border-radius: 6px 0 0 6px !important;
|
||||||
|
}
|
||||||
|
.input-group.input-group-lg .twitter-typeahead:last-child .tt-input,
|
||||||
|
.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint {
|
||||||
|
border-radius: 0 6px 6px 0 !important;
|
||||||
|
}
|
||||||
|
.input-lg.tt-input,
|
||||||
|
.hint-lg.tt-hint,
|
||||||
|
.input-group.input-group-lg .tt-input,
|
||||||
|
.input-group.input-group-lg .tt-hint {
|
||||||
|
height: 45px;
|
||||||
|
padding: 10px 16px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.33;
|
||||||
|
}
|
||||||
|
.tt-dropdown-menu {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 160px;
|
||||||
|
margin-top: 2px;
|
||||||
|
padding: 5px 0;
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||||
|
*border-right-width: 2px;
|
||||||
|
*border-bottom-width: 2px;
|
||||||
|
border-radius: 6px;
|
||||||
|
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
-moz-background-clip: padding;
|
||||||
|
background-clip: padding-box;
|
||||||
|
}
|
||||||
|
.tt-suggestion {
|
||||||
|
display: block;
|
||||||
|
padding: 3px 20px;
|
||||||
|
}
|
||||||
|
.tt-suggestion.tt-cursor {
|
||||||
|
color: #262626;
|
||||||
|
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
||||||
|
}
|
||||||
|
.tt-suggestion.tt-cursor a {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
.tt-suggestion p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
/* Tokenfield-specific Typeahead styling */
|
||||||
|
.tokenfield .twitter-typeahead {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
.tokenfield .twitter-typeahead .tt-hint {
|
||||||
|
padding: 0;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
.tokenfield.input-sm .twitter-typeahead .tt-input,
|
||||||
|
.tokenfield.input-sm .twitter-typeahead .tt-hint {
|
||||||
|
height: 18px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.tokenfield.input-lg .twitter-typeahead .tt-input,
|
||||||
|
.tokenfield.input-lg .twitter-typeahead .tt-hint {
|
||||||
|
height: 23px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.33;
|
||||||
|
}
|
||||||
|
.tokenfield .twitter-typeahead .tt-suggestions {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
/*!
|
||||||
|
* bootstrap-tokenfield
|
||||||
|
* https://github.com/sliptree/bootstrap-tokenfield
|
||||||
|
* Copyright 2013-2014 Sliptree and other contributors; Licensed MIT
|
||||||
|
*/.twitter-typeahead{width:100%;position:relative;vertical-align:top}.twitter-typeahead .tt-input,.twitter-typeahead .tt-hint{margin:0;width:100%;vertical-align:middle;background-color:#fff}.twitter-typeahead .tt-hint{color:#999;z-index:1;border:1px solid transparent}.twitter-typeahead .tt-input{color:#555;z-index:2}.twitter-typeahead .tt-input,.twitter-typeahead .tt-hint{height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429}.twitter-typeahead .input-sm.tt-input,.twitter-typeahead .hint-sm.tt-hint{border-radius:3px}.twitter-typeahead .input-lg.tt-input,.twitter-typeahead .hint-lg.tt-hint{border-radius:6px}.input-group .twitter-typeahead:first-child .tt-input,.input-group .twitter-typeahead:first-child .tt-hint{border-radius:4px 0 0 4px!important}.input-group .twitter-typeahead:last-child .tt-input,.input-group .twitter-typeahead:last-child .tt-hint{border-radius:0 4px 4px 0!important}.input-group.input-group-sm .twitter-typeahead:first-child .tt-input,.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint{border-radius:3px 0 0 3px!important}.input-group.input-group-sm .twitter-typeahead:last-child .tt-input,.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint{border-radius:0 3px 3px 0!important}.input-sm.tt-input,.hint-sm.tt-hint,.input-group.input-group-sm .tt-input,.input-group.input-group-sm .tt-hint{height:30px;padding:5px 10px;font-size:12px;line-height:1.5}.input-group.input-group-lg .twitter-typeahead:first-child .tt-input,.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint{border-radius:6px 0 0 6px!important}.input-group.input-group-lg .twitter-typeahead:last-child .tt-input,.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint{border-radius:0 6px 6px 0!important}.input-lg.tt-input,.hint-lg.tt-hint,.input-group.input-group-lg .tt-input,.input-group.input-group-lg .tt-hint{height:45px;padding:10px 16px;font-size:18px;line-height:1.33}.tt-dropdown-menu{width:100%;min-width:160px;margin-top:2px;padding:5px 0;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);*border-right-width:2px;*border-bottom-width:2px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.tt-suggestion{display:block;padding:3px 20px}.tt-suggestion.tt-cursor{color:#262626;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.tt-suggestion.tt-cursor a{color:#fff}.tt-suggestion p{margin:0}.tokenfield .twitter-typeahead{width:auto}.tokenfield .twitter-typeahead .tt-hint{padding:0;height:20px}.tokenfield.input-sm .twitter-typeahead .tt-input,.tokenfield.input-sm .twitter-typeahead .tt-hint{height:18px;font-size:12px;line-height:1.5}.tokenfield.input-lg .twitter-typeahead .tt-input,.tokenfield.input-lg .twitter-typeahead .tt-hint{height:23px;font-size:18px;line-height:1.33}.tokenfield .twitter-typeahead .tt-suggestions{font-size:14px}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,75 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||||
|
<title>{{ .Static.WebsiteTitle }} - Admin</title>
|
||||||
|
<meta name="description" content="{{ .Static.WebsiteTitle }}">
|
||||||
|
<link rel="stylesheet" href="/css/jquery-ui.min.css">
|
||||||
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
||||||
|
<!--link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"-->
|
||||||
|
<link rel="stylesheet" href="/fonts/fontawesome-all.min.css">
|
||||||
|
<link rel="stylesheet" href="/css/bootstrap-tokenfield.min.css">
|
||||||
|
<link rel="stylesheet" href="/css/tokenfield-typeahead.min.css">
|
||||||
|
<link rel="stylesheet" href="/css/custom.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body id="page-top">
|
||||||
|
{{template "prt_nav.html" .}}
|
||||||
|
<div class="container">
|
||||||
|
<h1>Create new clients</h1>
|
||||||
|
|
||||||
|
{{if $.Alerts.HasAlert}}
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="alert alert-{{$.Alerts.Type}}" role="alert">
|
||||||
|
{{$.Alerts.Message}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
<form method="post" enctype="multipart/form-data">
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group col-md-12">
|
||||||
|
<label for="inputEmail">Email Addresses</label>
|
||||||
|
<input type="text" name="email" class="form-control" id="inputEmail">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group col-md-12">
|
||||||
|
<label for="inputIdentifier">Client Friendly Name (will be added as suffix to the name of the user)</label>
|
||||||
|
<input type="text" name="identifier" class="form-control" id="inputIdentifier" value="Primary">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-primary">Create</button>
|
||||||
|
<a href="/admin" class="btn btn-secondary">Cancel</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{{template "prt_footer.html"}}
|
||||||
|
<script src="/js/jquery.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="/js/jquery.easing.js"></script>
|
||||||
|
<script src="/js/jquery-ui.min.js"></script>
|
||||||
|
<script src="/js/bootstrap-tokenfield.min.js"></script>
|
||||||
|
<script src="/js/custom.js"></script>
|
||||||
|
<script>$('#inputEmail').on('tokenfield:createdtoken', function (e) {
|
||||||
|
// Über-simplistic e-mail validation
|
||||||
|
var re = /\S+@\S+\.\S+/
|
||||||
|
var valid = re.test(e.attrs.value)
|
||||||
|
if (!valid) {
|
||||||
|
$(e.relatedTarget).addClass('invalid')
|
||||||
|
}
|
||||||
|
}).tokenfield({
|
||||||
|
autocomplete: {
|
||||||
|
source: [{{range $i, $u :=.Users}}{{$u.Mail}},{{end}}],
|
||||||
|
delay: 100
|
||||||
|
},
|
||||||
|
showAutocompleteOnFocus: false
|
||||||
|
})</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -82,7 +82,7 @@
|
||||||
<h2>Current VPN Users</h2>
|
<h2>Current VPN Users</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 col-12">
|
<div class="col-sm-2 col-12">
|
||||||
<a href="/admin/peer/create" title="Add a LDAP user" class="btn btn-primary pull-right"><i class="fa fa-fw fa-user-plus"></i></a>
|
<a href="/admin/peer/createldap" title="Add a LDAP user" class="btn btn-primary pull-right"><i class="fa fa-fw fa-user-plus"></i></a>
|
||||||
<a href="/admin/peer/create" title="Manual add a user" class="btn btn-primary pull-right"><i class="fa fa-fw fa-plus"></i>M</a>
|
<a href="/admin/peer/create" title="Manual add a user" class="btn btn-primary pull-right"><i class="fa fa-fw fa-plus"></i>M</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,6 +8,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/h44z/wg-portal/internal/ldap"
|
||||||
|
|
||||||
"github.com/h44z/wg-portal/internal/common"
|
"github.com/h44z/wg-portal/internal/common"
|
||||||
|
|
||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
|
@ -275,6 +277,26 @@ func (s *Server) PostAdminCreatePeer(c *gin.Context) {
|
||||||
c.Redirect(http.StatusSeeOther, "/admin")
|
c.Redirect(http.StatusSeeOther, "/admin")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) GetAdminCreateLdapPeers(c *gin.Context) {
|
||||||
|
device := s.users.GetDevice()
|
||||||
|
|
||||||
|
c.HTML(http.StatusOK, "admin_create_clients.html", struct {
|
||||||
|
Route string
|
||||||
|
Alerts AlertData
|
||||||
|
Session SessionData
|
||||||
|
Static StaticData
|
||||||
|
Users []*ldap.UserCacheHolderEntry
|
||||||
|
Device Device
|
||||||
|
}{
|
||||||
|
Route: c.Request.URL.Path,
|
||||||
|
Alerts: s.getAlertData(c),
|
||||||
|
Session: s.getSessionData(c),
|
||||||
|
Static: s.getStaticData(),
|
||||||
|
Users: s.ldapUsers.GetSortedUsers("sn", "asc"),
|
||||||
|
Device: device,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) GetUserQRCode(c *gin.Context) {
|
func (s *Server) GetUserQRCode(c *gin.Context) {
|
||||||
user := s.users.GetUserByKey(c.Query("pkey"))
|
user := s.users.GetUserByKey(c.Query("pkey"))
|
||||||
png, err := user.GetQRCode()
|
png, err := user.GetQRCode()
|
||||||
|
|
|
@ -26,6 +26,7 @@ func SetupRoutes(s *Server) {
|
||||||
admin.POST("/peer/edit", s.PostAdminEditPeer)
|
admin.POST("/peer/edit", s.PostAdminEditPeer)
|
||||||
admin.GET("/peer/create", s.GetAdminCreatePeer)
|
admin.GET("/peer/create", s.GetAdminCreatePeer)
|
||||||
admin.POST("/peer/create", s.PostAdminCreatePeer)
|
admin.POST("/peer/create", s.PostAdminCreatePeer)
|
||||||
|
admin.GET("/peer/createldap", s.GetAdminCreateLdapPeers)
|
||||||
|
|
||||||
// User routes
|
// User routes
|
||||||
user := s.server.Group("/user")
|
user := s.server.Group("/user")
|
||||||
|
|
Loading…
Reference in New Issue