Добрый день! Генерация таблицы в виджете "Код" подробно описана в статье https://tssdk.elma365.com/ru/pages/how-to/make-custom-display-of-application-elements.html
Если нет желания хранить данные в контексте, то создадим интерфейсы, которые наполним данными из приложения-источника.
Привожу пример Формы просмотра элемента, на которую вынесен виджет код (таблица), в контексте данного виджета (ViewContext) только одно свойство - render (перерисовка таблицы). В сценарии созданы интерфейсы, функция onInit, функция заполнения таблицы данными fillTable, функция getElements, отдающая элементы виджету Код.
Виджет Код:
Код:
<% if (ViewContext.data.render) { %>
<div class="objects-container">
<table>
<thead>
<tr>
<th>Название</th>
<th>Файлы</th>
<th>В наличии</th>
<th>Менеджеры</th>
</tr>
</thead>
<tbody>
<% for (let j=0; j < getElements().length;j++) { %>
<%= renderRow( getElements()[j] ) %>
<% } %>
</tbody>
</table>
</div>
<% } %>
<% $template renderRow(el) %>
<tr class="material-need-title">
<td><a href="(p:item/forum_tablica/iskhodnoe/<%- el.nazvanie.elementId %>)"><%- el.nazvanie.elementName %></td>
<td>
<% for (let i=0; i < el.files.length; i++) { %>
<a href="(p:preview/<%- el.files.fileLink %>/readonly)?active=true)"><%- el.files.fileName %><br/>
<% } %>
</td>
<td><%- el.bool ? "В наличии" : "Нет в наличии" %></td>
<td>
<% for (let j=0; j < el.users.length; j++) { %>
<%- el.users[j].userName %><br/>
<% } %>
</td>
</tr>
<% $endtemplate %>
<style>
.objects-container table {
width: 100%;
border: 1px solid black;
}
.objects-container thead {
background-color: #82bd8e;
border: 1px solid black;
}
th {
text-align: center;
border: 1px solid black;
}
.objects-container th {
padding: 18px 6px;
}
.objects-container td {
padding: 18px 6px;
border: 1px solid black;
}
td {
text-align: center;
}
tr.material-need-title {
font-weight: bold;
background-color: #e3eef7;
}
</style>
Сценарий:
Код:
interface ElementData {
nazvanie: Element;
files: MyFileData[];
bool: TBoolean;
users: MyUserData[];
}
interface Element {
elementName: string;
elementId: string
}
interface MyFileData {
fileName: string;
fileLink: string
}
interface MyUserData {
userName: string;
userId: string
}
let elements: ElementData[]=[];
async function onInit():p: Promise<void>{
await fillTable();
}
async function fillTable(): Promise<void>{
debugger;
elements=[];
const need_elements = await Namespace.app.iskhodnoe.search()
.where((f, g) => g.and(
f.__deletedAt.eq(null),
))
.size(1000)
.all();
for (const el of need_elements) {
let element: ElementData
let files: TFile[] = el.data.faily!
let filesData: MyFileData[]=[]
let users: TUser[] = el.data.polzovateli!
let usersData: MyUserData[]=[]
const promises = files.map(async (f: FileItemRef)=> {
let data = await getFilesData(f);
filesData.push(data)
});
await Promise.all(promises)
const promises2 = users.map(async (u: UserItemRef)=> {
let data2 = await getUsersData(u);
usersData.push(data2)
});
await Promise.all(promises2)
element = {
nazvanie: {
elementName: el.data.__name,
elementId: el.data.__id
} ,
files: filesData,
bool: el.data.vybor_da_net!,
users: usersData
}
elements.push(element!)
};
Context.data.render = Context.data.render
}
async function getFilesData(f: FileItemRef): Promise<MyFileData> {
let fetched = await f.fetch();
return {
fileName: fetched.data.__name,
fileLink: fetched.data.__id
}
}
async function getUsersData(u: UserItemRef): Promise<MyUserData> {
let fetched = await u.fetch();
return {
userName: fetched.data.__name,
userId: fetched.data.__id
}
}
function getElements() {
return elements;
}