##// END OF EJS Templates
autocomplete for repository managment of users
marcink -
r298:15e96b5a default
parent child Browse files
Show More
@@ -111,6 +111,7 b' class ReposController(BaseController):'
111
111
112 except formencode.Invalid as errors:
112 except formencode.Invalid as errors:
113 c.repo_info = repo_model.get(id)
113 c.repo_info = repo_model.get(id)
114 c.users_array = repo_model.get_users_js()
114 errors.value.update({'user':c.repo_info.user.username})
115 errors.value.update({'user':c.repo_info.user.username})
115 c.form_errors = errors.error_dict
116 c.form_errors = errors.error_dict
116 return htmlfill.render(
117 return htmlfill.render(
@@ -169,6 +170,8 b' class ReposController(BaseController):'
169 defaults = c.repo_info.__dict__
170 defaults = c.repo_info.__dict__
170 defaults.update({'user':c.repo_info.user.username})
171 defaults.update({'user':c.repo_info.user.username})
171
172
173 c.users_array = repo_model.get_users_js()
174
172 for p in c.repo_info.repo2perm:
175 for p in c.repo_info.repo2perm:
173 defaults.update({'perm_%s' % p.user.username:
176 defaults.update({'perm_%s' % p.user.username:
174 p.permission.permission_name})
177 p.permission.permission_name})
@@ -41,6 +41,15 b' class RepoModel(object):'
41 def get(self, id):
41 def get(self, id):
42 return self.sa.query(Repository).get(id)
42 return self.sa.query(Repository).get(id)
43
43
44 def get_users_js(self):
45
46 users = self.sa.query(User).all()
47 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
48 users_array = '[%s];' % '\n'.join([u_tmpl % (u.user_id, u.name,
49 u.lastname, u.username)
50 for u in users])
51 return users_array
52
44
53
45 def update(self, repo_id, form_data):
54 def update(self, repo_id, form_data):
46 try:
55 try:
@@ -4,13 +4,16 b''
4 background: #DBD4C6;
4 background: #DBD4C6;
5 font-family: sans-serif;
5 font-family: sans-serif;
6 }
6 }
7
7 #mainhtml .breadcrumbs a:HOVER{
8 #mainhtml .breadcrumbs a:HOVER {
8 text-decoration: underline;
9 text-decoration: underline;
9 }
10 }
11
10 a {
12 a {
11 color: #556CB5;
13 color: #556CB5;
12 text-decoration: none;
14 text-decoration: none;
13 }
15 }
16
14 a:HOVER{
17 a:HOVER {
15 text-decoration: underline;
18 text-decoration: underline;
16 }
19 }
@@ -44,6 +47,7 b' a:HOVER{'
44 border-top: 1px solid #AAAAAA;
47 border-top: 1px solid #AAAAAA;
45 border-bottom: 2px solid #666666;
48 border-bottom: 2px solid #666666;
46 }
49 }
50
47 .table_disp td {
51 .table_disp td {
48 border-left: 1px solid #AAAAAA;
52 border-left: 1px solid #AAAAAA;
49 padding-left: 4px;
53 padding-left: 4px;
@@ -62,18 +66,17 b' table tr.parity1 {'
62 background: #FFFFFF;
66 background: #FFFFFF;
63 }
67 }
64
68
65
66 /*** ***/
69 /*** ***/
67
70
68 /** common settings **/
71 /** COMMON SETTINGS **/
69 .add_icon{
72 .add_icon {
70 background: url("/images/icons/add.png") no-repeat scroll 3px;
73 background: url("/images/icons/add.png") no-repeat scroll 3px;
71 height: 16px;
74 height: 16px;
72 padding-left: 20px;
75 padding-left: 20px;
73 padding-top: 0px;
76 padding-top: 0px;
74 text-align: left;
77 text-align: left;
78 }
75
79
76 }
77 .edit_icon{
80 .edit_icon {
78 background: url("/images/icons/folder_edit.png") no-repeat scroll 3px;
81 background: url("/images/icons/folder_edit.png") no-repeat scroll 3px;
79 height: 16px;
82 height: 16px;
@@ -88,13 +91,13 b' table tr.parity1 {'
88 padding-left: 20px;
91 padding-left: 20px;
89 padding-top: 0px;
92 padding-top: 0px;
90 text-align: left;
93 text-align: left;
91
92 }
94 }
93
95
94 .action_button{
96 .action_button {
95 border:0px;
97 border: 0px;
96 display: block;
98 display: block;
97 }
99 }
100
98 .action_button:hover{
101 .action_button:hover {
99 border:0px;
102 border: 0px;
100 font-style:italic;
103 font-style: italic;
@@ -104,26 +107,29 b' table tr.parity1 {'
104 .flash_msg ul{
107 .flash_msg ul {
105 margin:0;
108 margin: 0;
106 padding:25px 0px 0px 0px;
109 padding: 25px 0px 0px 0px;
110 }
107
111
108 }
109 .error_msg {
112 .error_msg {
110 background-color:#FFCFCF;
113 background-color: #FFCFCF;
111 background-image: url("/images/icons/error_msg.png");
114 background-image: url("/images/icons/error_msg.png");
112 border:1px solid #FF9595;
115 border: 1px solid #FF9595;
113 color:#CC3300;
116 color: #CC3300;
114 }
117 }
118
115 .warning_msg {
119 .warning_msg {
116 background-color:#FFFBCC;
120 background-color: #FFFBCC;
117 background-image: url("/images/icons/warning_msg.png");
121 background-image: url("/images/icons/warning_msg.png");
118 border:1px solid #FFF35E;
122 border: 1px solid #FFF35E;
119 color:#C69E00;
123 color: #C69E00;
120 }
124 }
125
121 .success_msg {
126 .success_msg {
122 background-color:#D5FFCF;
127 background-color: #D5FFCF;
123 background-image: url("/images/icons/success_msg.png");
128 background-image: url("/images/icons/success_msg.png");
124 border:1px solid #97FF88;
129 border: 1px solid #97FF88;
125 color:#009900;
130 color: #009900;
126 }
131 }
132
127 .notice_msg {
133 .notice_msg {
128 background-color:#DCE3FF;
134 background-color: #DCE3FF;
129 background-image: url("/images/icons/notice_msg.png");
135 background-image: url("/images/icons/notice_msg.png");
@@ -146,7 +152,8 b' table tr.parity1 {'
146 }
152 }
147
153
148 #msg_close {
154 #msg_close {
149 background:transparent url("icons/cross_grey_small.png") no-repeat scroll 0 0;
155 background: transparent url("icons/cross_grey_small.png") no-repeat
156 scroll 0 0;
150 cursor:pointer;
157 cursor: pointer;
151 height:16px;
158 height: 16px;
152 position:absolute;
159 position: absolute;
@@ -158,9 +165,9 b' table tr.parity1 {'
158 .error-message{
165 .error-message {
159 color:#CC3300;
166 color: #CC3300;
160 }
167 }
161 /**** Tooltip ****/
168
162 .yui-overlay,
169 /**** TOOLTIP ****/
163 .yui-panel-container {
170 .yui-overlay,.yui-panel-container {
164 visibility:hidden;
171 visibility: hidden;
165 position:absolute;
172 position: absolute;
166 z-index: 2;
173 z-index: 2;
@@ -182,9 +189,90 b' table tr.parity1 {'
182 .yui-tt-shadow {
189 .yui-tt-shadow {
183 display: none;
190 display: none;
184 }
191 }
185 /** end of Tooltip **/
192
193 /** END TOOLTIP **/
194
195 /** AUTOCOMPLETE **/
196
197 .ac{
198 vertical-align: top;
199
200 }
201 .ac .match {
202 font-weight:bold;
203 }
204
205 .ac .yui-ac {
206 position: relative;
207 font-family: arial;
208 font-size: 100%;
209 }
210
211 .ac #perm_ac{
212 width:15em;
213 }
214 /* styles for input field */
215 .ac .yui-ac-input {
216 position: absolute;
217 width: 100%;
218 }
219
220 /* styles for results container */
221 .ac .yui-ac-container {
222 position: absolute;
223 top: 1.6em;
224 width: 100%;
225 }
186
226
227 /* styles for header/body/footer wrapper within container */
228 .ac .yui-ac-content {
229 position: absolute;
230 width: 100%;
231 border: 1px solid #808080;
232 background: #fff;
233 overflow: hidden;
234 z-index: 9050;
235 }
187
236
237 /* styles for container shadow */
238 .ac .yui-ac-shadow {
239 position: absolute;
240 margin: .3em;
241 width: 100%;
242 background: #000;
243 -moz-opacity: 0.10;
244 opacity: .10;
245 filter: alpha(opacity = 10);
246 z-index: 9049;
247 }
248
249 /* styles for results list */
250 .ac .yui-ac-content ul {
251 margin: 0;
252 padding: 0;
253 width: 100%;
254 }
255
256 /* styles for result item */
257 .ac .yui-ac-content li {
258 margin: 0;
259 padding: 2px 5px;
260 cursor: default;
261 white-space: nowrap;
262 }
263
264 /* styles for prehighlighted result item */
265 .ac .yui-ac-content li.yui-ac-prehighlight {
266 background: #B3D4FF;
267 }
268
269 /* styles for highlighted result item */
270 .ac .yui-ac-content li.yui-ac-highlight {
271 background: #556CB5;
272 color: #FFF;
273 }
274
275 /** END AUTOCOMPLETE **/
188 div#main {
276 div#main {
189 padding: 5px;
277 padding: 5px;
190 }
278 }
@@ -273,9 +361,11 b' ul.page-nav li.current {'
273 padding-right: 5px;
361 padding-right: 5px;
274 padding-left: 5px;
362 padding-left: 5px;
275 }
363 }
364
276 ul.page-nav li.current a {
365 ul.page-nav li.current a {
277 color: #556CB5;
366 color: #556CB5;
278 }
367 }
368
279 ul.page-nav li a {
369 ul.page-nav li a {
280 height: 24px;
370 height: 24px;
281 color: #FFF;
371 color: #FFF;
@@ -285,9 +375,11 b' ul.page-nav li a {'
285 text-decoration: none;
375 text-decoration: none;
286 font-weight: bold;
376 font-weight: bold;
287 }
377 }
378
288 ul.page-nav li.logout a {
379 ul.page-nav li.logout a {
289 color: #FDAC9D;
380 color: #FDAC9D;
290 }
381 }
382
291 ul.page-nav li a:hover {
383 ul.page-nav li a:hover {
292 background: #FFF;
384 background: #FFF;
293 color: #556CB5;
385 color: #556CB5;
@@ -304,14 +396,15 b' ul.submenu li {'
304 font-weight:bold;
396 font-weight: bold;
305 display: inline;
397 display: inline;
306 }
398 }
399
307 ul.submenu .repos {
400 ul.submenu .repos {
308 background: url("/images/icons/folder_edit.png") no-repeat scroll 3px;
401 background: url("/images/icons/folder_edit.png") no-repeat scroll 3px;
309 height: 16px;
402 height: 16px;
310 padding-left: 20px;
403 padding-left: 20px;
311 padding-top: 0px;
404 padding-top: 0px;
312 text-align: left;
405 text-align: left;
406 }
313
407
314 }
315 ul.submenu .users {
408 ul.submenu .users {
316 background: url("/images/icons/user_edit.png") no-repeat scroll 3px;
409 background: url("/images/icons/user_edit.png") no-repeat scroll 3px;
317 height: 16px;
410 height: 16px;
@@ -319,6 +412,7 b' ul.submenu .users {'
319 padding-top: 0px;
412 padding-top: 0px;
320 text-align: left;
413 text-align: left;
321 }
414 }
415
322 ul.submenu .permissions {
416 ul.submenu .permissions {
323 background: url("/images/icons/folder_key.png") no-repeat scroll 3px;
417 background: url("/images/icons/folder_key.png") no-repeat scroll 3px;
324 height: 16px;
418 height: 16px;
@@ -528,9 +622,8 b' dl.overview dt {'
528 #clone_url{
622 #clone_url {
529 border: 0px;
623 border: 0px;
530 }
624 }
531 /** end of summary **/
532
625
533 /** chagelog **/
626 /** end of summary **/ /** chagelog **/
534 h3.changelog {
627 h3.changelog {
535 margin: 20px 0 5px 30px;
628 margin: 20px 0 5px 30px;
536 padding: 0 0 2px;
629 padding: 0 0 2px;
@@ -568,18 +661,14 b' ul.changelog-entry li.description {'
568 font-size: 1.1em;
661 font-size: 1.1em;
569 }
662 }
570
663
571 /** end of changelog **/
664 /** end of changelog **/ /** file **/
572
573 /** file **/
574 p.files {
665 p.files {
575 margin: 0 0 0 20px;
666 margin: 0 0 0 20px;
576 font-size: 2.0em;
667 font-size: 2.0em;
577 font-weight: bold;
668 font-weight: bold;
578 }
669 }
579
670
580 /** end of file **/
671 /** end of file **/ /** changeset **/
581
582 /** changeset **/
583 #changeset_content{
672 #changeset_content {
584 width:60%;
673 width: 60%;
585 float:left;
674 float: left;
@@ -588,6 +677,7 b' p.files {'
588 #changeset_content .container .wrapper{
677 #changeset_content .container .wrapper {
589 width: 600px;
678 width: 600px;
590 }
679 }
680
591 #changeset_content .container{
681 #changeset_content .container {
592 border:1px solid #CCCCCC;
682 border: 1px solid #CCCCCC;
593 height:120px;
683 height: 120px;
@@ -608,9 +698,11 b' p.files {'
608 #changeset_content .container .left .date{
698 #changeset_content .container .left .date {
609 font-weight:bold;
699 font-weight: bold;
610 }
700 }
701
611 #changeset_content .container .left .author{
702 #changeset_content .container .left .author {
612
703
613 }
704 }
705
614 #changeset_content .container .left .message{
706 #changeset_content .container .left .message {
615 font-style: italic;
707 font-style: italic;
616 color: #556CB5;
708 color: #556CB5;
@@ -628,16 +720,20 b' p.files {'
628 margin-top: 7px;
720 margin-top: 7px;
629 text-align: left;
721 text-align: left;
630 }
722 }
723
631 .cs_files .cs_changed{
724 .cs_files .cs_changed {
632 background: url("/images/icons/page_white_edit.png") no-repeat scroll 3px;
725 background: url("/images/icons/page_white_edit.png") no-repeat scroll
726 3px;
633 /*background-color: #FFDD88;*/
727 /*background-color: #FFDD88;*/
634 height: 16px;
728 height: 16px;
635 padding-left: 20px;
729 padding-left: 20px;
636 margin-top: 7px;
730 margin-top: 7px;
637 text-align: left;
731 text-align: left;
638 }
732 }
733
639 .cs_files .cs_removed{
734 .cs_files .cs_removed {
640 background: url("/images/icons/page_white_delete.png") no-repeat scroll 3px;
735 background: url("/images/icons/page_white_delete.png") no-repeat scroll
736 3px;
641 /*background-color: #FF8888;*/
737 /*background-color: #FF8888;*/
642 height: 16px;
738 height: 16px;
643 padding-left: 20px;
739 padding-left: 20px;
@@ -645,16 +741,15 b' p.files {'
645 text-align: left;
741 text-align: left;
646 }
742 }
647
743
648 /** end of changeset **/
744 /** end of changeset **/ /** canvas **/
649
650 /** canvas **/
651 #graph_nodes{
745 #graph_nodes {
652 margin-top:8px;
746 margin-top: 8px;
653 }
747 }
748
654 #graph{
749 #graph {
655 overflow: hidden;
750 overflow: hidden;
751 }
656
752
657 }
658 #graph_nodes{
753 #graph_nodes {
659 width:160px;
754 width: 160px;
660 float:left;
755 float: left;
@@ -664,16 +759,17 b' p.files {'
664 width:800px;
759 width: 800px;
665 float:left;
760 float: left;
666 }
761 }
762
667 #graph_content .container_header{
763 #graph_content .container_header {
668 border:1px solid #CCCCCC;
764 border: 1px solid #CCCCCC;
669 height:30px;
765 height: 30px;
670 background: #EEEEEE;
766 background: #EEEEEE;
671 }
767 }
672
768
673
674 #graph_content .container .wrapper{
769 #graph_content .container .wrapper {
675 width: 600px;
770 width: 600px;
676 }
771 }
772
677 #graph_content .container{
773 #graph_content .container {
678 border-bottom: 1px solid #CCCCCC;
774 border-bottom: 1px solid #CCCCCC;
679 border-left: 1px solid #CCCCCC;
775 border-left: 1px solid #CCCCCC;
@@ -692,12 +788,15 b' p.files {'
692 width: 25%;
788 width: 25%;
693 text-align: right;
789 text-align: right;
694 }
790 }
791
695 #graph_content .container .left .date{
792 #graph_content .container .left .date {
696 font-weight:bold;
793 font-weight: bold;
697 }
794 }
795
698 #graph_content .container .left .author{
796 #graph_content .container .left .author {
699
797
700 }
798 }
799
701 #graph_content .container .left .message{
800 #graph_content .container .left .message {
702 font-size: 80%;
801 font-size: 80%;
703 }
802 }
@@ -705,6 +804,7 b' p.files {'
705 .right div{
804 .right div {
706 clear: both;
805 clear: both;
707 }
806 }
807
708 .right .changes .added,.changed,.removed{
808 .right .changes .added,.changed,.removed {
709 border:1px solid #DDDDDD;
809 border: 1px solid #DDDDDD;
710 display:block;
810 display: block;
@@ -713,12 +813,15 b' p.files {'
713 text-align:center;
813 text-align: center;
714 min-width:15px;
814 min-width: 15px;
715 }
815 }
816
716 .right .changes .added{
817 .right .changes .added {
717 background:#BBFFBB;
818 background: #BBFFBB;
718 }
819 }
820
719 .right .changes .changed{
821 .right .changes .changed {
720 background: #FFDD88;
822 background: #FFDD88;
721 }
823 }
824
722 .right .changes .removed{
825 .right .changes .removed {
723 background: #FF8888;
826 background: #FF8888;
724 }
827 }
@@ -728,6 +831,7 b' p.files {'
728 font-size: 60%;
831 font-size: 60%;
729 font-weight: bold;
832 font-weight: bold;
730 }
833 }
834
731 .right .merge img{
835 .right .merge img {
732 vertical-align: bottom;
836 vertical-align: bottom;
733 }
837 }
@@ -736,9 +840,8 b' p.files {'
736 font-size: 90%;
840 font-size: 90%;
737 font-family: monospace;
841 font-family: monospace;
738 }
842 }
739 /** end of canvas **/
740
843
741 /* FILE BROWSER */
844 /** end of canvas **/ /* FILE BROWSER */
742 div.browserblock {
845 div.browserblock {
743 overflow: hidden;
846 overflow: hidden;
744 padding: 0px;
847 padding: 0px;
@@ -749,16 +852,19 b' div.browserblock {'
749 /* new */
852 /* new */
750 line-height: 125%;
853 line-height: 125%;
751 }
854 }
855
752 div.browserblock .browser-header{
856 div.browserblock .browser-header {
753 border-bottom: 1px solid #CCCCCC;
857 border-bottom: 1px solid #CCCCCC;
754 background: #EEEEEE;
858 background: #EEEEEE;
755 color:blue;
859 color: blue;
756 padding:10px 0 10px 0;
860 padding: 10px 0 10px 0;
757 }
861 }
862
758 div.browserblock .browser-header span{
863 div.browserblock .browser-header span {
759 margin-left:25px;
864 margin-left: 25px;
760 font-weight: bold;
865 font-weight: bold;
761 }
866 }
867
762 div.browserblock .browser-body{
868 div.browserblock .browser-body {
763 background: #EEEEEE;
869 background: #EEEEEE;
764 }
870 }
@@ -767,6 +873,7 b' table.code-browser {'
767 border-collapse:collapse;
873 border-collapse: collapse;
768 width: 100%;
874 width: 100%;
769 }
875 }
876
770 table.code-browser tr{
877 table.code-browser tr {
771 margin:3px;
878 margin: 3px;
772 }
879 }
@@ -780,12 +887,12 b' table.code-browser thead th {'
780 text-align: left;
887 text-align: left;
781 padding-left: 10px;
888 padding-left: 10px;
782 }
889 }
890
783 table.code-browser tbody tr {
891 table.code-browser tbody tr {
784
892
785 }
893 }
786
894
787 table.code-browser tbody td {
895 table.code-browser tbody td {
788
789 padding-left:10px;
896 padding-left: 10px;
790 height: 20px;
897 height: 20px;
791 }
898 }
@@ -811,6 +918,7 b' table.code-browser tbody td {'
811 padding-top: 0px;
918 padding-top: 0px;
812 text-align: left;
919 text-align: left;
813 }
920 }
921
814 .archive_logo{
922 .archive_logo {
815 background: url("/images/icons/compress.png") no-repeat scroll 3px;
923 background: url("/images/icons/compress.png") no-repeat scroll 3px;
816 height: 16px;
924 height: 16px;
@@ -35,7 +35,12 b''
35 </tr>
35 </tr>
36 <tr>
36 <tr>
37 <td>${_('Owner')}</td>
37 <td>${_('Owner')}</td>
38 <td>${h.text('user')}</td>
38 <td class='ac'>
39 <div id="perm_ac">
40 ${h.text('user',class_='yui-ac-input')}
41 <div id="owner_container"></div>
42 </div>
43 </td>
39 <td>${self.get_form_error('user')}</td>
44 <td>${self.get_form_error('user')}</td>
40 </tr>
45 </tr>
41 <tr>
46 <tr>
@@ -59,10 +64,7 b''
59 <td>${r2p.user.username}</td>
64 <td>${r2p.user.username}</td>
60 </tr>
65 </tr>
61 %endfor
66 %endfor
62
63
64 <%
67 <%
65
66 if not hasattr(c,'form_errors'):
68 if not hasattr(c,'form_errors'):
67 d = 'display:none;'
69 d = 'display:none;'
68 else:
70 else:
@@ -74,7 +76,12 b''
74 <td>${h.radio('perm_new_user','repository.read')}</td>
76 <td>${h.radio('perm_new_user','repository.read')}</td>
75 <td>${h.radio('perm_new_user','repository.write')}</td>
77 <td>${h.radio('perm_new_user','repository.write')}</td>
76 <td>${h.radio('perm_new_user','repository.admin')}</td>
78 <td>${h.radio('perm_new_user','repository.admin')}</td>
77 <td>${h.text('perm_new_user_name',size=10)}</td>
79 <td class='ac'>
80 <div id="perm_ac">
81 ${h.text('perm_new_user_name',class_='yui-ac-input')}
82 <div id="perm_container"></div>
83 </div>
84 </td>
78 <td>${self.get_form_error('perm_new_user_name')}</td>
85 <td>${self.get_form_error('perm_new_user_name')}</td>
79 </tr>
86 </tr>
80 <tr>
87 <tr>
@@ -105,5 +112,114 b''
105 });
112 });
106 });
113 });
107 </script>
114 </script>
115 <script type="text/javascript">
116 YAHOO.example.FnMultipleFields = function(){
117 var myContacts = ${c.users_array|n}
118
119 // Define a custom search function for the DataSource
120 var matchNames = function(sQuery) {
121 // Case insensitive matching
122 var query = sQuery.toLowerCase(),
123 contact,
124 i=0,
125 l=myContacts.length,
126 matches = [];
127
128 // Match against each name of each contact
129 for(; i<l; i++) {
130 contact = myContacts[i];
131 if((contact.fname.toLowerCase().indexOf(query) > -1) ||
132 (contact.lname.toLowerCase().indexOf(query) > -1) ||
133 (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
134 matches[matches.length] = contact;
135 }
136 }
137
138 return matches;
139 };
140
141 // Use a FunctionDataSource
142 var oDS = new YAHOO.util.FunctionDataSource(matchNames);
143 oDS.responseSchema = {
144 fields: ["id", "fname", "lname", "nname"]
145 }
146
147 // Instantiate AutoComplete for perms
148 var oAC_perms = new YAHOO.widget.AutoComplete("perm_new_user_name", "perm_container", oDS);
149 oAC_perms.useShadow = false;
150 oAC_perms.resultTypeList = false;
151
152 // Instantiate AutoComplete for owner
153 var oAC_owner = new YAHOO.widget.AutoComplete("user", "owner_container", oDS);
154 oAC_owner.useShadow = false;
155 oAC_owner.resultTypeList = false;
156
157
158 // Custom formatter to highlight the matching letters
159 var custom_formatter = function(oResultData, sQuery, sResultMatch) {
160 var query = sQuery.toLowerCase(),
161 fname = oResultData.fname,
162 lname = oResultData.lname,
163 nname = oResultData.nname || "", // Guard against null value
164 query = sQuery.toLowerCase(),
165 fnameMatchIndex = fname.toLowerCase().indexOf(query),
166 lnameMatchIndex = lname.toLowerCase().indexOf(query),
167 nnameMatchIndex = nname.toLowerCase().indexOf(query),
168 displayfname, displaylname, displaynname;
169
170 if(fnameMatchIndex > -1) {
171 displayfname = highlightMatch(fname, query, fnameMatchIndex);
172 }
173 else {
174 displayfname = fname;
175 }
176
177 if(lnameMatchIndex > -1) {
178 displaylname = highlightMatch(lname, query, lnameMatchIndex);
179 }
180 else {
181 displaylname = lname;
182 }
183
184 if(nnameMatchIndex > -1) {
185 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
186 }
187 else {
188 displaynname = nname ? "(" + nname + ")" : "";
189 }
190
191 return displayfname + " " + displaylname + " " + displaynname;
192
193 };
194 oAC_perms.formatResult = custom_formatter;
195 oAC_owner.formatResult = custom_formatter;
196
197 // Helper function for the formatter
198 var highlightMatch = function(full, snippet, matchindex) {
199 return full.substring(0, matchindex) +
200 "<span class='match'>" +
201 full.substr(matchindex, snippet.length) +
202 "</span>" +
203 full.substring(matchindex + snippet.length);
204 };
205
206 var myHandler = function(sType, aArgs) {
207 var myAC = aArgs[0]; // reference back to the AC instance
208 var elLI = aArgs[1]; // reference to the selected LI element
209 var oData = aArgs[2]; // object literal of selected item's result data
210 myAC.getInputEl().value = oData.nname;
211 };
212
213 oAC_perms.itemSelectEvent.subscribe(myHandler);
214 oAC_owner.itemSelectEvent.subscribe(myHandler);
215
216 return {
217 oDS: oDS,
218 oAC_perms: oAC_perms,
219 oAC_owner: oAC_owner,
220 };
221 }();
222
223 </script>
108 </div>
224 </div>
109 </%def>
225 </%def>
@@ -106,6 +106,7 b' def is_current(selected):'
106 <li ${is_current('branches')}>${h.link_to(_('branches'),h.url('branches_home',repo_name=c.repo_name))}</li>
106 <li ${is_current('branches')}>${h.link_to(_('branches'),h.url('branches_home',repo_name=c.repo_name))}</li>
107 <li ${is_current('tags')}>${h.link_to(_('tags'),h.url('tags_home',repo_name=c.repo_name))}</li>
107 <li ${is_current('tags')}>${h.link_to(_('tags'),h.url('tags_home',repo_name=c.repo_name))}</li>
108 <li ${is_current('files')}>${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name))}</li>
108 <li ${is_current('files')}>${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name))}</li>
109 <li>${h.link_to(_('settings'),h.url('edit_repo',id=c.repo_name))}</li>
109 </ul>
110 </ul>
110 %else:
111 %else:
111 ##Root menu
112 ##Root menu
@@ -142,6 +143,8 b' def is_current(selected):'
142 <%def name="js()">
143 <%def name="js()">
143 <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script>
144 <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script>
144 <script type="text/javascript" src="/js/yui/container/container-min.js"></script>
145 <script type="text/javascript" src="/js/yui/container/container-min.js"></script>
146 <script type="text/javascript" src="/js/yui/datasource/datasource-min.js"></script>
147 <script type="text/javascript" src="/js/yui/autocomplete/autocomplete-min.js"></script>
145 </%def>
148 </%def>
146
149
147 <!-- DEFINITION OF FORM ERROR FETCHER -->
150 <!-- DEFINITION OF FORM ERROR FETCHER -->
@@ -7,12 +7,13 b''
7 ${c.repos_prefix} Mercurial Repositories
7 ${c.repos_prefix} Mercurial Repositories
8 </%def>
8 </%def>
9 <%def name="page_nav()">
9 <%def name="page_nav()">
10 ${self.menu('home')}
10 &nbsp;
11 </div>
11 </%def>
12 </%def>
12 <%def name="main()">
13 <%def name="main()">
13 <div>
14 <div>
14 <br />
15 <br />
15 <h2>${_('Login')}</h2>
16 <h2>${_('Login to hg app')}</h2>
16 ${h.form(h.url.current())}
17 ${h.form(h.url.current())}
17 <table>
18 <table>
18 <tr>
19 <tr>
General Comments 0
You need to be logged in to leave comments. Login now