Refresh or Regenerate SPAU List
H,
I have deleted a Transport Request related to SPAU Adjustment. In SPAU (All those objects with Yellow Lights under W/o Modification Assistant Tree) i reset them to Original and System prompted for a Transport Request. Once the reset is done, I thought i should have used Adopt Modification (Sicne these Objects fall under W/o Modification Request Category). So i deleted the already created Transport Request in this Adjustment. Now i could not see those objects in SPAU list. To add another Transport Request, i have to pick them from SPAU list. But those Objects are not listed now in SPAU list. What should i do to get those objects back in SPAU? Is there any program to be Run to regenerate/Refresh the SPAU List. I hope i have described the issue in more detail. Please let me know if it is not clear. Please let me know your Solutions to this problem. I need your help urgently.
Thanks and Regards,
Kannan.
Hi Peter,
Thansk for your reply. They are listed in the SE95 with New Transports under the Reset Objects Tab. But i have deleted that Transport Request hoping that Deleting the transport Request will show up the Original SPAU List (Before Adopting Modification). So the Reset Objects List has the Invalid Transport request. Is it possible for me to attach other transport request to these Objects.
Thansk and Regards,
Kannan
Similar Messages
-
How to trigger a refresh of a dropdown list when the selection is changed
Hi,
This is a general ExtendScript question, but since I'm working with FM, I'll ask here first. I have a bit of a paradox here and I'm not sure of the best way to handle it.
I have a dialog box with a dropdown list, where I want to refresh certain controls when the user changes the selection in the list (dropdownList.onChange). This includes refreshing the contents of the list itself. However, the problem is, as soon as I try to refresh the list contents, it triggers onChange again. So, if I put the call to refresh the box within the onChange handler, it results in an endless loop, because my refresher function triggers onChange when it refreshes the list.
Does anyone know a better methodology, where I can safely trigger a refresh of a dropdown list within the list's own onChange event handler? I really wish that onChange was reserved for a user action only, or there was at least some property to that effect.
RussHi Russ,
you can stop that with "stopPropagation()"
You can find this in "Javascript Tools Guide" on page 150.
I'm not able at the moment to send you an example 'cause I'm in a hospital for a while.
Happy New Year! -
How to remove obsolete oss note from SPAU List
Dear All,
How to remove obsolete oss note from SPAU List. Bocz it having yellow trafic Signal and it is not allowing me to reset to orginal or adopt.
Please tell me how to reolve this problem.Hi,
Please mention the Netweaver release of your system.
Next, if you mention the note is obsolete - the traffic light should be grey.
If its yellow, that means semi-automatic adjustment needs to be made.
If you click on the obsolete greyed out note, you get a message saying the note correction was delivered with upgrade or support package and it could be reset.
If you click on the yellow note, the system would try to reapply the note via SNOTE.
Please try either or the above and let us know the system response.
Regards,
Srikishan -
Hi,
we have upgraded from 4.6c to ECC 6.0 and i have a query regarding SPAU list, for couple SAP standard programs we have adopted modifications but an hour later we decided to reset to orginal .
Is there any way to achieve this.
Thanks
DavidHi
I did tried to retrieve the old version in my case which is upgraded version, but for some reason its asking for access key
Let me know
Thanks in advance
David -
Urgent !!!! Spau List : Note Corrections
Hi,
we are upgrading the system and needs to clear the spau list. there is a huge list. I implemented few of this. But i am not able to implement the remaining.¨I see two types of errors.
1. "Format of correction instructions XXXX XXXXXX XXXXXXXX ; unable to
read corr. instruct."
2. And other issue is i get a green question mark for some notes.
NOw dont know how to clear this. can somebody help me in this.
Apart from Note correction there are also list in With Modification Assistant and Without Modification Assistant.
My second query is can ignore the above note errors and move ahead with With Modification Assistant list. Or i need to clear all Note correction and then proceed with With Modification Assistant & Without Modification Assistant.
Please help and guide me.
Thnaks....Hi,
Can you give the solution as to how u fixed it and answer the Questions which u have asked yourself pls...
Regards -
Visio Diagram is not refreshing the data from list
Hi,
I made a pivot diagram in visio 2013 and linked it with SharePoint 2013 list. I configured the Visio services, uploaded it document library. I can view the diagram in browser but it is not automatically refreshing not even by pressing the "Refresh"
button.
Instead i have to open it in visio, refresh the diagram manually and the save it in SP document library to refresh the diagram.
I am using visio web access to view the diagram and also the auto-refresh is enable.Hi Rizwan,
Following url's might help you.
http://social.msdn.microsoft.com/Forums/sharepoint/en-US/79476e70-51cf-412a-aac9-ebb10e82572f/2010-visio-services-data-refresh-issue
http://social.technet.microsoft.com/Forums/en-US/06d53cb3-2593-4dd0-a524-356bd9720231/visio-service-data-refresh-help
Regards Roy Joyson
Please remember to mark your question as "answered"/"Vote helpful" if this solves/helps your problem.
Roy Joyson -
Refresh Classical report/basic list
Hi,
I have created a classical report/basic list where user can select check boxes and adjacent rows should be deleted. But after the action, I wish to refresh the report and remove the selected lines from displaying.
Please let me know how to achieve this.
Thanks in advance.
NitinHi Nitin,
Check the following program.
Here on pressing the delete push button(FCODE: DELETE) it will delete all
rows which has adjacent checkboxes checked.
REPORT ztest_list_processing NO STANDARD PAGE HEADING .
TYPES: BEGIN OF ty_tab,
delete,
f1(3) TYPE c,
f2(3) TYPE c,
f3(3) TYPE c,
END OF ty_tab.
DATA: it_tab TYPE TABLE OF ty_tab,
wa_tab TYPE ty_tab.
DATA: w_delete TYPE c,
w_lines TYPE i,
w_ind TYPE i.
wa_tab-f1 = '111'.
wa_tab-f2 = 'ABC'.
wa_tab-f3 = '123'.
APPEND wa_tab TO it_tab.
wa_tab-f1 = '222'.
wa_tab-f2 = 'DEF'.
wa_tab-f3 = '456'.
APPEND wa_tab TO it_tab.
wa_tab-f1 = '333'.
wa_tab-f2 = 'GHI'.
wa_tab-f3 = '789'.
APPEND wa_tab TO it_tab.
wa_tab-f1 = '444'.
wa_tab-f2 = 'JKL'.
wa_tab-f3 = '987'.
APPEND wa_tab TO it_tab.
wa_tab-f1 = '555'.
wa_tab-f2 = 'MNO'.
wa_tab-f3 = '654'.
APPEND wa_tab TO it_tab.
SET PF-STATUS '100'. "Contains Delete button
PERFORM print_output.
"Logic which you can implement
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'DELETE'.
DESCRIBE TABLE it_tab LINES w_lines.
DO w_lines TIMES. "To read all rows
CLEAR: wa_tab.
READ LINE w_ind FIELD VALUE wa_tab-delete
wa_tab-f1. "Getting the values
IF wa_tab-delete EQ 'X'. "Delete when check box is 'X'
DELETE it_tab WHERE f1 = wa_tab-f1.
ENDIF.
ADD 1 TO w_ind."Index for next line
ENDDO.
IF it_tab IS INITIAL.
WRITE: / 'There are no data in the table'.
ELSE.
PERFORM print_output. "Reprint the updated data(like refreshing)
ENDIF.
"Modified the existing Back button in standard Toolbar so that on
"pressin the back button it will come to program and not to
"previous displayed list
WHEN '&BACK'.
LEAVE SCREEN.
ENDCASE.
*& Form print_output
* text
* --> p1 text
* <-- p2 text
FORM print_output.
LOOP AT it_tab INTO wa_tab.
WRITE:/ wa_tab-delete AS CHECKBOX INPUT ON, "Display as checkbox
wa_tab-f1,
wa_tab-f2,
wa_tab-f3.
IF sy-tabix EQ 1.
w_ind = sy-linno. "Get the line position of first row
ENDIF.
ENDLOOP.
Hope this helps you.
Regards,
Manoj Kumar P -
Refresh the drop down list after update the table
I have tab with three pages in each page one data block. I have table with primary key of combination of the other tables foreign key. I am populating the combination of foreign key in dorp down list. In the when-new-form-instance trigger I populate the two lists, work fine. But if I add a new record in the other tables and I need this one to display in the list. I am trying to execute the same procedure which is populate the list
First time I get this error. FRM-41337. How can refresh the list to display the new record as well.
Thanks in advance
nullHellow Tamer
What you wanna do is to display the element entered in the List after you have added it manualy.
I think you must re-populate the Recordgroup
again.
The Procedure you used to populate the RecordGroup in the When-new-Form-Instance,
must include the statement:
DELETE_GROUP()
like This:
PROCEDURE Populate_The_List(list_id ITEM, sql_stat VARCHAR2) IS
group_id RecordGroup;
outcome NUMBER;
BEGIN
--Create temporary record group.
group_id := CREATE_GROUP_FROM_QUERY('List_Elements', sql_stat);
IF ID_NULL(group_id) THEN
MESSAGE('Record Group could not be created in Populate_the_List.');
RAISE FORM_TRIGGER_FAILURE;
END IF;
--Populate record group.
outcome := POPULATE_GROUP(group_id);
IF outcome <> 0 THEN
MESSAGE('Record Group could not be populated in Populate_the_List.');
RAISE FORM_TRIGGER_FAILURE;
END IF;
--Populate list item
POPULATE_LIST(list_id, group_id);
--Destroy the temporary record group to release resources
DELETE_GROUP(group_id);
EXCEPTION
WHEN OTHERS THEN
MESSAGE('Internal error occurred in Populate_the_List.');
RAISE FORM_TRIGGER_FAILURE;
END Populate_the_List;
SQL_STAT refers to the SQL statement used further to populate the List.
Hope this Helps
Regards
Tariq -
SPAU list contains SAP notes with 'Unspecified Adjustment Mode'
I'm just completing an upgrade from 46c to ECC6 and I have reached the SPAU stage. In my list of adjustments all the SAP notes have the status of 'Unspecified Adjustment Mode' with a question mark. I think they should be either green, red or yellow to indicate what to do next. Is there something I need to do to get them into that state?
Seems like for some reason the adjustment mode job didn't finish... to restart it just click on the question mark and that should process it, then you will see a semaphore. the job can take a few minutes.
Regards
Juan -
Refresh a query driven list based on a search field
I have a text field in a control block that I am using as a search criteria.
I have another list whose source query is based on the previously mentioned text field's value.
As I am typing in the text field, I want the list to update based on what I have typed.
For example, as I type ORACLE, the list would show all O records, then OR records, then ORA records, then ORAC records, and so on and so on.
I have been unable to find when/where the trigger exists that will allow me to do this.
Can anyone help?Hello nameless,
first: do not use timers, because they have a negative influence on the performance.
use a pre-query trigger in which you check the value of your text field. In this trigger you can set the block property WHERE of the block to be queried like: "column_name LIKE '%'||:block_name.item_name||'%'
with this all records containing the text in your text item will be shown. You could also add a radio button with three values: Starts with, Contains, Ends with. When you implement the functionality like this, the USER controls what happens and not the programme.
greetz,
Hans -
SPAU List -- reset object back to Standard code
Hi Guys,
Is it possible to set a program back to the standard code after the modifications have been applied in the upgraded system?
When I try to reset the object, I get the message that it can not be reset back to the standard code since it has already been adjusted.
Is there a way to set it back to standard even after the object is adjusted?
Thanks..Hi Mark,
This can be done with the help of Basis people.
He will again try to copy from the golden client and paste it as per your requirement.
Vijay. -
Multiple Select List does not Refresh with Dynamic Action
All,
Scenario:
Using APEX 4.2.2, I have a Select List page item (P4_SPONSOR) set to allow multiple values which has a dynamic LOV to populate the list. What I would like to do is highlight the display values based on another page item's value (P4_DRIVER_ID). When I set the source of P4_SPONSOR to static text, such as a delimited string of 1:2:3:4, any display values where the return values are equal to the static text are highlighted when the page loads.
Problem:
The problem lies in trying to use a query as a source for P4_SPONSOR which is filtered based on the other page item, P4_DRIVER_ID. For instance, my SQL Query (returning colon separated values) returns the same as the static text noted above. In the query's WHERE clause, I specify that the driver's ID is equal to P4_DRIVER_ID:
SELECT sponsor_id
FROM sponsors_drivers_xref
WHERE driver_id = :P4_DRIVER_ID;
This, as I understand it, would necessitate a refresh of P4_SPONSOR whenever the value of P4_DRIVER_ID changes. So, I have a Dynamic Action that does just that. When executed on the page, I can see the P4_SPONSOR multiple select list actually refresh, but none of the display values become highlighted.
Thoughts?
Thanks,
-Seth.Seth,
A dynamic action refresh of your select list will refresh the list of values (this is what you are seeing), it will not refresh the value of the item itself. In fact, it will remove any values that you had already selected. To refresh the value you will need to add additional dynamic actions.
Create another dynamic action with:
Event: After Refresh
Selection Type: Item(s)
Item(s): P4_SPONSOR
If this was a normal select list you could just create a Set Value action and use your query to set the value of the select list. Since this is a multiple select list your will need to get your colon delimited value first and then use some javascript to set the values of your select list.
Create an hidden page item name P4_SPONSOR_TEMP.
Add a true action to your new dynamic action:
Action: Set Value
Set Type: SQL Statement
SQL Statement:
SELECT sponsor_id
FROM sponsors_drivers_xref
WHERE driver_id = :P4_DRIVER_ID;
Page Items to Submit: P4_DRIVER_ID
Selection Type: Item(s)
Item(s): P4_SPONSOR_TEMP
Add another true action to your new dynamic action:
Action: Set Value
Set Type: JavaScript Expression
JavaScript Expression:
$("#P4_SPONSOR_TEMP").val().split(":")
Selection Type: Item(s)
Item(s): P4_SPONSOR
--Jeff -
How to refresh mx:List when the data in dataProvider is changed
I have a mx:List that uses an ArrayCollection as a dataProvider. The ArrayCollection contains many Object, something like:
var o:Object = new Object();
o.label = "Apple";
o.price = "$1.00";
var o:Object = new Object();
o.label = "Kiwi";
o.price = "$0.20";
Now the dataProvider (ArrayCollection) is updated outside the mx:List, not through the itemEditor. I want the mx:List to show the changes in the
dataProvider (ArrayCollection), but currently it does not automatically show the changes. I could not find a refresh method in the List or dataProvider
to force the List to reload the data. Any suggestions?Hi John, have you tried arrayCollection.refresh()...where arrayCollection is dataProvider for your List.
Thanks,
Bhasker -
3 users sharing itunes in shared folder on one imac computer. What can we do to "refresh" our individual library listing to list music loaded by other 2 users? We listen to books in the car via ipods. How can books I have loaded show up on other 2 library listings and vice-versa? Had a couple of instances where 2 of us loaded the same book because we didn't know the other had already loaded it!!!
It sounds like you are using individual libraries (each user has library files in their iTunes folder) but shared media. iTunes doesn't have an active way of scanning a shared media folder for new additions. You will just have to tell each other that something has been added to each person can add the media information to their libraries. The only other ways I know of are to using a single user library (many disadvantages to that too, especially with 3 of you), or to use Home Sharing which also has disadvantages.
-
[Forum FAQ] A content management tool with dashboard based on SharePoint List
1.
Scenario:
The SharePoint OOTB List has saved us a lot of time on managing mess data. It provides three forms to create/view/edit items, the ability to save the views we want with some specific filtering and sorting condition, versioning for easy restoring, and we
can make it advanced with workflow contains the specific business logic.
However, if there is a need for better user experience, interacting with the public APIs and a bit of script to customize the web page would be required.
Suppose there is a requirement like this:
We need a content collection tool which collects ideas from contributors, the newly ideas will be reviewed by reviewers.
We may need to filter the list in a convenient way, get the wanted result with the data from the list and display in a chart or rank list.
We can add some buttons in Metro style to display the counting result of the data from the list dynamically. When we click them, the list will be filtered and sorted to display a friendly set of items. Also, we need to display a trend of the mess data graphically
in some beautiful charts. If we want to find out some outstanding contributors, top contributor board would be more comfortable than the top N items in the OOTB list view.
The page would look like this:
2.
Introduction:
Engineers will come up with some ideas in the daily job and write a content to enlighten others. Reviewers will help to review ideas or contents and publish the contents if qualified.
The complete process looks like this:
As we can see, only the approved idea can be written as a content and only the approved content can be published.
2.1
How it works
We build the whole tool in one page. All ideas and contents will be saved in a custom list. This is how it looks like:
There are three parts in this page:
1
2
2.1
2.1.1
Top menu
The top menu contains three elements:
A Drop Down menu for filtering data by team, it will refresh the other two parts with the filtered data:
A hyperlink “STATISTIC” links to a PowerBI report whose data source is the custom list.
A hyperlink “FEEDBACK” for collecting feedbacks:
The feedbacks will be saved in another list:
2.1.2
Information menu
This part will display the calculated data retrieved from the list within tiles, chart and ranking list.
The tiles can be clicked to filter and refresh the list view.
2.1.3
List view
A list stores all ideas and contents with the properties needed. It can be filtered by the Top menu and Information menu.
The customization on the OOTB custom list template makes it more powerful and more suit for this scenario:
1. An item leveled comment feature (based on OOTB Tags & Notes feature) for other users make comments to an idea or content:
2. Title column: When there is no attachment in the current item, it redirects to the default DisplayForm page. If there is, it will open the attachment (usually a .docx file) in Word Online in a new tab.
3. ECB menu: Add some custom shortcuts for popular actions:
4. A hyperlink column stores the hyperlink points to the website where the content is published to.
3.
How to achieve it
This solution will be hosted in SharePoint Online environment, so we do all the job using JavaScript, REST API and Client Object Model.
The Drop Down menu, tiles, rank list are generated with some HTML+CSS.
The Trend Chart, we take advantage of the Combo chart in the Google chart library.
The list view is hosted in a <iframe> which can be easily filtered and refreshed by just passing a generated URL with query string.
For the customization on the list view and the ECB menu, JSLink with Client Object Model would be OK.
3.1
Specific to every part
3.1.1
Top menu
3.1.1.1
Drop Down menu for retrieving filtered data and refreshing the display of the related controls
When user selects a team here, there will be a request sent out for retrieving items of the list. By default, the limit is 100 when using REST API to get list items, so we can append a “$top=1000” to require more items from server.
Code snippet like this:
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items?$top=1000",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
console.log("getListItems succ");
console.log(data);
error: function (data) {
alert("getListItems error");
//failure(data);
Then we will get the “data” as a JSON format string, it contains all the values we need from the list:
We can get the values we want like this:
//get item Count
var arr = [], len;
for(key in data.d.results)
arr.push(key);
len = arr.length;
for(var ii=0; ii<len; ii++)
var team = data.d.results[ii].Team;
var month = data.d.results[ii].Month;
As we need to know the counts of each type of ideas or contents, we use an array for saving the counters:
//ary to store all counters for tiles: all/pendingIdea/pendingContent/my/approvedIdea/approvedContent
var aryAllCounters = [0,0,0,0,0,0];
for(var ii=0; ii<len; ii++)
//get pendingIdeaCount
if(data.d.results[ii].Statuss === 'Pending')
aryAllCounters[1]++;
Once all the numbers are ready, we can do the refreshing.
As the list view page is hosted in a <iframe>, all we need to do is passing a constructed URL with query string:
url_team = URL + "?FilterField1="+FIELD_MYTEAM+"&FilterValue1=" + sel_val;
$iframe.attr('src', url_team);
3.1.1.2
Hyperlink for popping up a dialog to collect feedbacks
The feedback dialog hosts another page which contains two buttons and one text area.
The HTML code of the FEEDBACK button:
<a id="feedback" href="#" onclick="javascript:openDialogBox('../SitePages/Feedback.aspx');">FEEDBACK</a>
The openDialogBox() function:
function openDialogBox(url){
var options = SP.UI.$create_DialogOptions();
options.url = url;
options.height = 130;
options.width = 425;
options.title = "Feedback";
SP.UI.ModalDialog.showModalDialog(options);
In the Feedback.aspx page, when user click submit button, we will save the content of the text area into the feedback list:
function addListItem()
this.clientContext = new SP.ClientContext.get_current();
this.oList = clientContext.get_web().get_lists().getByTitle('Feedback');
var itemCreateInfo = new SP.ListItemCreationInformation();
this.oListItem = this.oList.addItem(itemCreateInfo);
//set person field
var userValue = new SP.FieldUserValue();
//userValue.set_lookupId(this.currentUser.get_id());
userValue.set_lookupId(_spPageContextInfo.userId);
oListItem.set_item('Provider', userValue);
//Sets the specified field value
oListItem.set_item('Title', str);
//datetime field
var currDate = new Date();
oListItem.set_item('Submit_Time',currDate);
oListItem.update();
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded_add), Function.createDelegate(this, this.onQueryFailed));
3.1.2
Information menu
3.1.2.1
Tile shortcut
In the click event of the tiles, the code will pass a generated URL with query string to the <iframe>:
//filter list only
$tile.click(function(){
//distinguish tiles by id
var v = $(this).attr('id');
switch(v)
case S_MY_CONTENT:
url_team1 = URL + "?FilterField1="+FIELD_COMPOSER+"&FilterValue1=" + currentUsername;
break;
case S_PENDING_IDEA:
url_team1 = url_team + "&FilterField2="+FIELD_STATUS+"&FilterValue2=Pending&FilterField3="+FIELD_IDEATYPE+"&FilterValue3=Idea";
break;
$iframe.attr('src', url_team1);
3.1.2.2
Trend chart
The chart will be initialized with the numbers by month stored in a 3D array:
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawVisualization);
function drawVisualization(ary)
// Some raw data (not necessarily accurate)
var data = google.visualization.arrayToDataTable(ary);
var view = new google.visualization.DataView(data);
view.setColumns([0, 1,
{ calc: "stringify",
sourceColumn: 1,
type: "string",
role: "annotation"
2]);
// Create and draw the visualization.
var ac = new google.visualization.ComboChart(document.getElementById('chart1'));
ac.draw(view, {
//legend: 'top',
legend: {
title : '',
//width: 0,
//height: 285,
vAxis: {title: "", format:'#',viewWindowMode:'explicit',
viewWindow:{
min:0
},ticks: ticks
//hAxis: {title: ""},
lineWidth: 4,
bar: {groupWidth: "60%"},
seriesType: "bars",
series: {1: {type: "line"}},
chartArea:{
colors: ['#A4C400', '#F9A13B']
3.1.2.3
Top contributors rank list
When retrieving list items, we can get the “AuthorId” which represents the id of the user in the siteUserInfoList. We run another request to retrieve all items in the siteUserInfoList which stores the username with the URL of profile.
Then we can use a hash table(provided by jshashtable.js) to store the user id, username and profile URL:
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/siteUserInfoList/Items",
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: function (data) {
console.log(data);
//get item Count
var arr = [], len;
for(key in data.d.results)
arr.push(key);
len = arr.length;
var ht_authors = new Hashtable();
for(var ii=0; ii<len; ii++)
if(authorSet.contains(data.d.results[ii].Id))
if(data.d.results[ii].Picture != null)
ht_authors.put(data.d.results[ii].Id, data.d.results[ii].Title+'|'+data.d.results[ii].Picture.Url);
else
ht_authors.put(data.d.results[ii].Id, data.d.results[ii].Title+'|');
console.log("ht_authors.keys(): "+ht_authors.keys());
console.log("ht_authors.values(): "+ht_authors.values());
error: function (data) {
alert("error");
//failure(data);
3.1.3
List view
For the Comment button, custom title link and the custom published link of each item, we can use JSLink to achieve.
Comment button: It is supposed to be the OOTB “Type” column, I change the icon and modify the click event of it to pop up a comment dialog which take advantage of the OOTB “Tags&Notes” feature;
Custom Title link: As there will be two situations of an item: has attachment or not. We will need to run a request to get the URL of attachment and change the hyperlink of the Title field accordingly:
(function () {
// Create object that have the context information about the field that we want to change it output render
var linkFiledContext = {};
linkFiledContext.Templates = {};
linkFiledContext.Templates.Fields = {
//"Attachments": { "View": AttachmentsFiledTemplate }
"LinkTitle": { "View": TitleFieldTemplate },
"Published_x0020_Link": { "View": PublishedLinkFieldTemplate },
"DocIcon": { "View": DocIconFieldTemplate },
"MyTeam": { "View": MyTeamFieldTemplate }
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(linkFiledContext);
function DocIconFieldTemplate(ctx)
var htmlStr = "";
var listId = ctx.listName;
var itemId = ctx.CurrentItem.ID;
var s = listId + "," + itemId;
htmlStr += "<img width='16' height='16' class=' ms-draggable' alt='Comment' src='"+_spPageContextInfo.webAbsoluteUrl+"/Shared%20Documents/img/comment-icon.png' border='0' ms-draggableragId='0' onclick='CommentIcon(\""+ s +"\")'></img>";
return htmlStr;
function CommentIcon(s)
var listId = s.split(',')[0];
var itemId = s.split(',')[1];
var url=_spPageContextInfo.webAbsoluteUrl+"/_layouts/15/socialdataframe.aspx?listid="+listId+"&id="+itemId+"&mode=1";
console.log(url);
openCustomDialog(url,"Comment",650,520);
function openCustomDialog(pageUrl,title,width,height)
SP.UI.ModalDialog.showModalDialog({
url: pageUrl,
width: width,
height: height,
title: title,
dialogReturnValueCallback: function (result){
if(result== SP.UI.DialogResult.OK)
parent.window.location.href=parent.window.location.href;
function PublishedLinkFieldTemplate(ctx)
//console.log(ctx);
var htmlStr = "";
var itemPublishedLink = "";
var itemPublishedLinkDesc = "";
if((ctx.CurrentItem.Published_x0020_Link != ''))
itemPublishedLink = ctx.CurrentItem.Published_x0020_Link;
itemPublishedLinkDesc = ctx.CurrentItem["Published_x0020_Link.desc"];
htmlStr = "<a href='" + itemPublishedLink + "' target='_blank'>" + itemPublishedLinkDesc + "</a>";
return htmlStr;
function MyTeamFieldTemplate(ctx)
var htmlStr = "";
var itemMyTeam = "";
if((ctx.CurrentItem.MyTeam[0] != undefined) && (ctx.CurrentItem.MyTeam[0] != null))
itemMyTeam = ctx.CurrentItem.MyTeam[0].lookupValue;
htmlStr = itemMyTeam;
return htmlStr;
function TitleFieldTemplate(ctx) {
console.log(ctx.CurrentItem);
var itemId = ctx.CurrentItem.ID;
var itemTitle = ctx.CurrentItem.Title;
var listName = ctx.ListTitle;
var siteUrl = _spPageContextInfo.webAbsoluteUrl;
var listUrl = _spPageContextInfo.webAbsoluteUrl + "/Lists/" +listName;
var fileNames = getAttachmentsNames(listName, itemId);
console.log(fileNames);
var fileNameAry = fileNames.split("|");
var htmlStr = "";
//check the attachment existence
if(fileNameAry[0] != '')
for(var j = 0; j < fileNameAry.length; j++)
var fileName = fileNameAry[j];
var s1 = "<a class=\"ms-listlink ms-draggable\" onmousedown=\"return VerifyHref(this, event, '1', 'SharePoint.OpenDocuments.3', '1";
//1``https://microsoft.sharepoint.com/teams/spfrmcs
var s2 = "/_layouts/15/WopiFrame.aspx?sourcedoc=";
//2``/teams/spfrmcs/Lists/Content%20Pool
var s3 = "/Attachments/";
//3``137
var s4 = "/";
//4``[Forum FAQ] Highlight the list tab in Quick Launch when the list view changes.docx
var s5 = "&action=default'); return false;\" href=\"";
//5``https://microsoft.sharepoint.com/teams/spfrmcs/Lists/Content Pool
var s6 = "/Attachments/";
//6``137
var s7 = "/";
//7``[Forum FAQ] Highlight the list tab in Quick Launch when the list view changes.docx
var s8 = "\" target=\"_blank\" DragId=\"1\">";
//8``Highlight the list tab in Quick Launch when the list view changes
var s9 = "</a>";
var s = s1+siteUrl+s2+listUrl+s3+itemId+s4+fileName+s5+listUrl+s6+itemId+s7+fileName+s8+itemTitle+s9;
htmlStr += s;
//console.log(htmlStr);
if (j != fileNameAry.length - 1)
htmlStr += "<br/>";
//if no attachments, set the <a> point to displayForm
else
htmlStr += "<a class='ms-listlink ms-draggable' onclick='EditLink2(this,28);return false;' onfocus='OnLink(this)' href='" + siteUrl + "/_layouts/15/listform.aspx?PageType=4&ListId=%7BE54A4FBB%2DDDC2%2D4F7E%2D8343%2D8A1C78757CF4%7D&ID=" + itemId + "&ContentTypeID=0x010079A1D928FF77984C80BFEF1D65C3809F' target='_blank' DragId='0'>" + itemTitle + "</a>";
return htmlStr;
function getAttachmentsNames(listName,itemId) {
var url = _spPageContextInfo.webAbsoluteUrl;
var requestUri = url + "/_api/web/lists/getbytitle('" + listName + "')/items(" + itemId + ")/AttachmentFiles";
var str = "";
// execute AJAX request
$.ajax({
url: requestUri,
type: "GET",
headers: { "ACCEPT": "application/json;odata=verbose" },
async: false,
success: function (data) {
for (var i = 0; i < data.d.results.length; i++)
if(i != 0)
str += "|";
str += data.d.results[i].FileName;
error: function (err) {
//alert(err);
return str;
3.2
How to make them work together
When selecting an option in the Drop Down menu, the Information menu and the List view will be refreshed separately.
When clicking the tiles, only the list view will be filtered and refreshed, the other parts will not be influenced.
When items created/modified, the whole page will be refreshed to keep all the numbers in each part updated. A workflow will also be triggered to inform engineers or reviewers the progress of an item or content.
3.3
Other customizations
3.3.1
ECB menu and permission control
As we need to refresh the page when new item or modify item, we put all the form pages in a custom modal dialog and execute the refresh in the success callback function.
There are three roles: Site owner, reviewer and engineer. They have limited privileges according to the roles they are:
Site owner: Full control on the list, can see all the buttons in the ECB menu;
Reviewer: There is another list which stores the names of each team and reviewers’ names of each team. The reviewer has limited full control only on the team they belong to. To other teams, the role can be seen as a visitor;
Composer
(create owner): The one who contribute an idea. For the ideas\contents from other teams, this role can be seen as visitor.
The ECB menu they can see is:
For the visitor, the ECB menu will only display a few buttons:
The code:
(function () {
var viewContext = {};
viewContext.Templates = {};
viewContext.OnPostRender = OnViewPostRender;
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(viewContext);
function OnViewPostRender(ctx) {
$("a[title='More options']").removeAttr("onclick");
$(".ms-list-itemLink").removeAttr("onclick");
$("a[title='More options']").attr("onclick", "showMenuList(this);return false;");
function showMenuList(obj) {
var itemId = $(obj).parents("tr").attr("id").split(",")[1];
//show ECB menu
CoreInvoke('ShowECBMenuForTr', obj, event);
var teamId = getCurrentTeamId("Content Pool", itemId);
var styles = "";
if (isSiteOwner("Technet SharePoint Team Owners")) {
styles = "li[text='Delete Item ']{display:block;} li.ms-core-menu-separator:last-child{display:block;} ul.ms-core-menu-list > li:nth-last-child(5){display:block;} li[text='Edit Item ']{display:block;} li[text='Upload Document']{display:block;} li[text='Approve']{display:block;} li[text='Reject']{display:block;} li[text='Add Publish Link']{display:block;}";
} else if (isReviewer("List1_FAQ_team", teamId, "Reviewers")) {
styles = "li[text='Delete Item ']{display:block;} li.ms-core-menu-separator:last-child{display:block;} ul.ms-core-menu-list > li:nth-last-child(5){display:block;} li[text='Edit Item ']{display:block;} li[text='Upload Document']{display:block;} li[text='Approve']{display:block;} li[text='Reject']{display:block;} li[text='Add Publish Link']{display:block;}";
} else if (isComposer(obj)) {
styles = "li[text='Delete Item ']{display:block;} li.ms-core-menu-separator:last-child{display:block;} ul.ms-core-menu-list > li:nth-last-child(5){display:block;} li[text='Edit Item ']{display:block;} li[text='Upload Document']{display:block;} li[text='Approve']{display:none;} li[text='Reject']{display:none;} li[text='Add Publish Link']{display:none;}";
} else {
styles = "li[text='Delete Item ']{display:none;} li.ms-core-menu-separator:last-child{display:none;} ul.ms-core-menu-list > li:nth-last-child(5){display:none;} li[text='Edit Item ']{display:none;} li[text='Upload Document']{display:none;} li[text='Approve']{display:none;} li[text='Reject']{display:none;} li[text='Add Publish Link']{display:none;}";
includeStyleElement(styles);
//get current team id
function getCurrentTeamId(listName,itemId){
var teamId="";
var requestUri = _spPageContextInfo.webAbsoluteUrl +
"/_api/Web/Lists/getByTitle('"+listName+"')/items("+itemId+")?$select=MyTeamId";
// execute AJAX request
$.ajax({
url: requestUri,
type: "GET",
headers: { "ACCEPT": "application/json;odata=verbose" },
async: false,
success: function (data) {
if(data.d.MyTeamId!=null){
teamId=data.d.MyTeamId;
}else{
teamId="0";
error: function () {
//alert("Failed to get details");
return teamId;
//check whether is owner
//Technet SharePoint Team Owners
function isSiteOwner(groupName) {
var flag = false;
var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/Web/effectiveBasePermissions";
// execute AJAX request
$.ajax({
url: requestUri,
type: "GET",
headers: { "ACCEPT": "application/json;odata=verbose" },
async: false,
success: function (data) {
var permissions = new SP.BasePermissions();
permissions.fromJson(data.d.EffectiveBasePermissions);
flag = permissions.has(SP.PermissionKind.managePermissions);
error: function () {
//alert("Failed to get details");
return flag;
function isComposer(obj) {
var flag = false;
var userId = _spPageContextInfo.userId;
var composerId = $(obj).parents("tr").find("a[href*='userdisp.aspx']").attr("href").split("ID=")[1];
if (composerId == userId) {
flag = true;
return flag;
//check whether is reviewer
function isReviewer(listName,teamId,peopleColumn){
var flag=false;
var userId=_spPageContextInfo.userId;
// begin work to call across network
var requestUri = _spPageContextInfo.webAbsoluteUrl +
"/_api/Web/Lists/getByTitle('"+listName+"')/items?$select=ID&$filter=(ID eq '"+teamId+"' and "+peopleColumn+"Id eq '"+userId+"')";
// execute AJAX request
$.ajax({
url: requestUri,
type: "GET",
headers: { "ACCEPT": "application/json;odata=verbose" },
async: false,
success: function (data) {
if(data.d.results.length>0){
flag=true;
error: function () {
//alert("Failed to get details");
return flag;
//insert style into page
function includeStyleElement(styles) {
var style = document.createElement("style");
style.type = "text/css";
(document.getElementsByTagName("head")[0] || document.body).appendChild(style);
if (style.styleSheet) {
//for ie
style.styleSheet.cssText = styles;
} else {
//for w3c
style.appendChild(document.createTextNode(styles));
3.3.2
Workflow email customization
The email will only be sent to engineer or team reviewer in the three scenarios:
When engineer uploads an idea or content, reviewer will receive an email;
When engineer uploads a content to an existing idea, reviewer will receive an email;
When reviewer approve/reject an idea or content, engineer will receive an email;
The design of the workflow process :
The email design like this:
Email to engineer
Email to reviewer
Let us know if you are interested in it. Happy coding!
Please click to vote if the post helps you. This can be beneficial to other community members reading the thread.A good solution. Liked it very much. Can you please make it a technet blog for others.
[email protected]
Maybe you are looking for
-
Cant download apps in iphone 6
I can't download apps in my iphone 6
-
I've got 2000$ wrapped up in 2 Thunderbolt monitors and I cannot daisy chain them with a 3000$ 15 inch Retina macbook Pro. This is completely unacceptable and I hope someone knows how to fix it. At certain points since June or July when I first got a
-
Import from Camcorder question, what resolution?
I just bought a Sony HDR-TG1 camcorder, pretty happy with it. I have a question about importing, if I import AVCHD format using 1080 import, it takes up a lot of harddrive space, is there any advantage since I am not going to do a lot of editing, jus
-
This only started happening this morning and I don't know why its acting this way. I've tried clicking 'Open Link In New Window' but it also opens in a new window. Any help?
-
Exporting Audio and Picture to PROTOOLS
I'm doing all of my audio editing and mixing on ProTools. What is the best way to export my edited work from FCP on one computer to ProTools on another? Is there a way I can do it to have high-quality audio and low-quality video to save space? Is the