Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Witam

Czy zna ktoś sposób jak można zrobić zakładki na liście "kontakty". Mam rozbudowaną liste do ponad 70 kolumn i wygodnie było by pogrupować poszczególne elementy jak telefon, umowy na osobnych zakładkach bo teraz mam bardzo długa i nieczytelną listę. czy jest to możliwe a jeśli nie to może ktoś podpowie inne rozwiązanie.

Pozdrawiam
Leon
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Polecam to rozwiązanie. Gdyby skrypt z początku nie działał, zmień kod na następujący:


<!-- Date field text size -->
<style type="text/css">
.ms-dtinput,.ms-dttimeinput{
font-size:0.7em;
}
</style>
<DIV id="tabs">
<UL style="font-size:12px">
<LI><A href="#tabs-1">Tab 1</A></LI>
<LI><A href="#tabs-2">Tab 2</A></LI>
<LI><A href="#tabs-3">Tab 3</A></LI>
<LI><A href="#tabs-4">Attachments</A></LI>
</UL>

<div><table cellpadding="0" cellspacing="0" id="tabs-1"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-2"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-3"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-4"></table></div>
</DIV>

<link type="text/css" href="/Docs/css/ui-lightness/jquery-ui-1.8.6.custom.css" rel="stylesheet" />
<script type="text/javascript" src="/Docs/jquery-1.4.3.min.js"></script>
<script type="text/javascript" src="/Docs/jquery-ui-1.8.6.custom.min.js"></script>
<script type="text/javascript">
$(function() {

// Array of all fields - format: tabID|FieldInternalName
arrTab = ['1|Title','1|Employee_x0020_ID','1|Employee_x0020_Name','1|Superior_x0020_ID',
'2|Phone','2|Address','2|City','2|State',
'3|Country','3|Email'];

// Initiate all the fields
fields = init_fields();

// Add the "tabs" to the formtable
$("#tabs").insertAfter('.ms-formtable').tabs();
// Loop trough all fields and move them to the right tab
$.each(arrTab,function(idx,item){
var split = item.split('|');
var tabID = split[0];
var fieldName = split[1];
if(fields[fieldName]!=undefined){
currField = $(fields[fieldName]);
currField.appendTo('#tabs-'+tabID);
}
});

// Are there any required fields not filled? - select the tab containing the first field
selectTabOnFormValidation(false);

// Move the Attachment's to the last tab
$("#idAttachmentsRow").appendTo('#tabs-4').find('.ms-formlabel').attr('width','165px');

});


function selectTabOnFormValidation(preSave){
var formvalidationTab = '';
// Formvalidation - find the first tab with empty required fields
$.each(arrTab,function(idx,item){
var split = item.split('|');
var tabID = split[0];
var fieldName = split[1];
currField = $(fields[fieldName]);
// Handles DateTimeField (empty field validation is performed without page reload)
if(currField.find("SPAN[ID*='_DateTimeField_']").length>0){
if(currField.find('input:first').val()=='' && preSave){
formvalidationTab = tabID;
}
}
if(formvalidationTab == '' && currField.find('.ms-formbody span.ms-formvalidation').length>0){
formvalidationTab = tabID;
}
});
// Select the first tab containing an empty required field
if(formvalidationTab!=''){
$('#tabs').tabs('select', formvalidationTab);
}
}


// function - to make "object" of all tr's in the form
function init_fields(){
var res = {};
$("td.ms-formbody").each(function(){
if($(this).html().indexOf('FieldInternalName="')<0) return;
var start = $(this).html().indexOf('FieldInternalName="')+19;
var stopp = $(this).html().indexOf('FieldType="')-7;
var nm = $(this).html().substring(start,stopp);
res[nm] = this.parentNode;
});
return res;
}

// Catch "empty field validation" on date and time columns
function PreSaveAction(){
selectTabOnFormValidation(true);
return true;
}
</script>




Oczywiście pamiętaj o podmienieniu ścieżek do bibliotek oraz wstawieniu własnych nazw pól.
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Bardzo dziękuję, będę próbował.

Pozdrawiam
Leon
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Czy próbowałeś to odpalić pod SharePoint Foundation ? Nie mogę sobie z tym poradzić :-(

Pozdrawiam
Leon
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Mam to odpalone i działające na maszynie z WSS 3.0. W wolnej chwili wrzucę to dziś na maszynkę z SPF i dam znać, czy zadziała. Możliwe, że potrzebna będzie mała zmiana skryptu...
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Na SPF też udało mi się to uruchomić. Testowałem na New i EditFormie, ale myślę, że na DispFormie też powinno ruszyć. Zmieniłem tylko trochę skrypt:


<!-- Date field text size -->
<style type="text/css">
.ms-dtinput,.ms-dttimeinput{
font-size:0.7em;
}
</style>
<DIV id="tabs">
<UL style="font-size:12px">
<LI><A href="#tabs-1">Tab 1</A></LI>
<LI><A href="#tabs-2">Tab 2</A></LI>
<LI><A href="#tabs-3">Tab 3</A></LI>
<LI><A href="#tabs-4">Attachments</A></LI>
</UL>

<div><table cellpadding="0" cellspacing="0" id="tabs-1"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-2"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-3"></table></div>
<div><table cellpadding="0" cellspacing="0" id="tabs-4"></table></div>
</DIV>

<link type="text/css" href="/siteAssets/jquery-ui-1.8.6.custom.css" rel="stylesheet" />
<script type="text/javascript" src="/siteAssets/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="/siteAssets/jquery-ui-1.8.6.custom.min.js"></script>
<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("t");

function t() {

// Array of all fields - format: tabID|FieldInternalName
arrTab = ['1|Title', '1|Status',
'2|AssignedTo','2|Priority','2|Predecessors','2|Body', '2|PercentComplete',
'3|TaskGroup', '3|StartDate', '3|DueDate'];

// Initiate all the fields
fields = init_fields();

// Add the "tabs" to the formtable
$("#tabs").insertAfter('.ms-formtable').tabs();
// Loop trough all fields and move them to the right tab
$.each(arrTab,function(idx,item){
var split = item.split('|');
var tabID = split[0];
var fieldName = split[1];
if(fields[fieldName]!=undefined){
currField = $(fields[fieldName]);
currField.appendTo('#tabs-'+tabID);
}
});

// Are there any required fields not filled? - select the tab containing the first field
selectTabOnFormValidation(false);

// Move the Attachment's to the last tab
$("#idAttachmentsRow").appendTo('#tabs-4').find('.ms-formlabel').attr('width','165px');

}


function selectTabOnFormValidation(preSave){
var formvalidationTab = '';
// Formvalidation - find the first tab with empty required fields
$.each(arrTab,function(idx,item){
var split = item.split('|');
var tabID = split[0];
var fieldName = split[1];
currField = $(fields[fieldName]);
// Handles DateTimeField (empty field validation is performed without page reload)
if(currField.find("SPAN[ID*='_DateTimeField_']").length>0){
if(currField.find('input:first').val()=='' && preSave){
formvalidationTab = tabID;
}
}
if(formvalidationTab == '' && currField.find('.ms-formbody span.ms-formvalidation').length>0){
formvalidationTab = tabID;
}
});
// Select the first tab containing an empty required field
if(formvalidationTab!=''){
$('#tabs').tabs('select', formvalidationTab);
}
}


// function - to make "object" of all tr's in the form
function init_fields(){
var res = {};
$("td.ms-formbody").each(function(){
if($(this).html().indexOf('FieldInternalName="')<0) return;
var start = $(this).html().indexOf('FieldInternalName="')+19;
var stopp = $(this).html().indexOf('FieldType="')-7;
var nm = $(this).html().substring(start,stopp);
res[nm] = this.parentNode;
});
return res;
}

// Catch "empty field validation" on date and time columns
function PreSaveAction(){
selectTabOnFormValidation(true);
return true;
}
</script>


Po kolei kroki:
1. Wrzucić do biblioteki dokumentów wymagane biblioteki jquery. Powyższy skrypt najlepiej także zapisać jako plik tekstowy i wrzucić do biblioteki. Proszę pamiętać o podmienieniu ścieżek i pól!
2. Wejść na stronę NewForm (wpisując z palca adres formatki: http://site/Lists/MyList/NewForm.aspx)
3. Wyedytować stronę i dodać Content Editor Web Parta (alternatywnie, do trybu edycji można wejść dodając ToolPaneView=2 do adresu formatki.
4. We właściwościach editor web parta wskazać plik skryptu jako źródło treści.
5. Zakończyć edycję strony
6. Przetestować dodawanie elementu.
7. Cieszyć się z zakładek na formatce :)
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Bardzo dziękuję. Chyba coś robię nie tak, bo działa ale nie do końca tak jak bym chciał :-). Otóż wrzuciłem biblioteki jquery, skrypt w formacie TXT. Następnie wyedytowałem w SPD NewForm.aspx z kontaktów, wstawiłem WebParta ContentEditor i podałem ścieżkę do skryptu. I teraz w NewForm pojawiły mi się Tab 1,Tab 2 ... ale jako lista wypunktowana, czyli mam Tab 1 pod spodem Tab 2 itd.
Przepraszam, że Ci tyle głowę zawracam, ale nie bardzo wiem co jest nie tak a bardzo mi zależy na tych zakładkach.

Zobacz jak to wygląda :-)
http://edollar.republika.pl/lista.jpg

Pozdrawiam
Leon
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Taki widok oznacza jedno z poniższych:
- któryś z plików js/css jest nieprawidłowo podpięty
- nie uruchamia się kod skryptu js

Czy wstawiałeś na stronę mój skrypt, czy raczej oryginalny skrypt ze strony? W SPF oryginalny skrypt nie uruchamiał mi się (strona wyglądała wtedy dokładnie jak na twoim obrazku) i dlatego trochę go zmodyfikowałem.

Sprawdź czy na pewno dobrze wstawione zostały pliki do bibliotek (wiem, powtarzam to za często :)). Dodatkowo, uruchom developer tools w IE8 i sprawdź debuggerem, czy kod skryptu jest wykonywany (np. ustawiając breakpoint). Sprawdź, czy kod js uruchamiany jest bez błędów (w dev tools wszystkie powinny wyskoczyć w konsoli).
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Ja pierdziele - działa :-). Jesteś Wielki, jak ja Ci się odwdzięczę ??? Pojawiły mi się zakładki na dole i w pierwszej zakładce przypisał mi pierwszą istniejącą kolumnę. Teraz jak mogę dodawać poszczególne kolumny do wybranych zakładek - czy to ustawiam w skrypcie bo nie mogę się doszukać.

http://edollar.republika.pl/list2.jpg
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Tak jak pisał autor skryptu: najlepiej dodać wszystkie pola listy do zakładek, inaczej brzydko formatka wygląda :)

Pola dodaje się do konkretnych zakładek dodając do zmiennej arrTab. Każda wartość składa się z numeru zakładki oraz internalname pola (np. dla pola tytuł to Title) rozdzielonej znakiem '|'.

arrTab = ['1|Title', '1|Status', '2|AssignedTo','2|Priority','2|Predecessors','2|Body', '2|PercentComplete',
'3|TaskGroup', '3|StartDate', '3|DueDate'];

Nazwę wewnętrzną pola można uzyskać na parę sposobów
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Raz jeszcze bardzo Ci dziękuję, wszystko działa jak należy. Żeby nie zaczynać nowego wątku mam pytanie czy znasz jakiś sprawdzony sposób aby można dodać załącznik do konkretnej kolumny a nie tak jak jest domyślnie (na końcu listy)? Ładnie to można sobie poukładać w InfoPath, jednak SPF nie obsługuje list IP w przeglądarce.
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Zakładam, że chodzi o wstawienie kolumny z załącznikami do konkretnej zakładki. Proponuję ponownie zmodyfikować skrypt. Teraz wystarczy wstawić wartość z nazwą wewnętrzną 'Attachments' z numerem odpowiedniej zakładki (w poniższym kodzie załączniki wylądują pomiędzy polami Title i Status na zakładce pierwszej).


function t() {

// Array of all fields - format: tabID|FieldInternalName
arrTab = ['1|Title','1|Attachments','1|Status',
'2|AssignedTo','2|Priority','2|Predecessors','2|Body', '2|PercentComplete',
'3|TaskGroup', '3|StartDate', '3|DueDate'];

// Initiate all the fields
fields = init_fields();

// Add the "tabs" to the formtable
$("#tabs").insertAfter('.ms-formtable').tabs();
// Loop trough all fields and move them to the right tab
$.each(arrTab,function(idx,item){
var split = item.split('|');
var tabID = split[0];
var fieldName = split[1];
if (fieldName == "Attachments") {
// Move the Attachment's to the defined tab
$("#idAttachmentsRow").appendTo('#tabs-'+tabID).find('.ms-formlabel').attr('width','165px');
}
else {
if(fields[fieldName]!=undefined) {
currField = $(fields[fieldName]);
currField.appendTo('#tabs-'+tabID);
}
}

});

// Are there any required fields not filled? - select the tab containing the first field

selectTabOnFormValidation(false);

}
Robert Trubas

Robert Trubas Informatyczna
Obsługa Firm

Temat: Zakładki

Na wszystkich przeglądarkach działają te zakładki oprócz Chrome (sprawdzałem w IE, Opera, FF). Niby na stronie producenta jest napisane, że powinno działać a nie działa. Miałeś taki przypadek ? Sprawdzałem na kilku komputerach.
Konrad K.

Konrad K. Jack of all trades,
master of none

Temat: Zakładki

Witam,

Aby działało, trzeba zmodyfikować skrypt (metodę init_fields()). W chrome metoda ucina ostanią literę wszystkich nazw internal pól (zamiast Title zwraca Titl itd.).


function init_fields(){
var res = {};
$("td.ms-formbody").each(function(){
if($(this).html().indexOf('FieldInternalName="')<0) return;
var match = $(this).html().match('FieldInternalName="[a-zA-Z_0-9]*"');
var nm = match.toString().substring(19,match.toString().length-1);
res[nm] = this.parentNode;
});
return res;
}



Wyślij zaproszenie do