Функция инициализации:
Код:
/* Client scripts module */
declare const console: any
declare const window: any
interface IApp {
code: string,
ns: INamespace,
name: string
}
interface INamespace {
code: string,
name: string
}
/** поля приложения которые игнорируются */
const ignor_fields = [
'__directory',
'__subscribers',
'__externalId',
'__tasks',
'__tasks_earliest_duedate',
'__tasks_performers',
'__debug',
'__deletedAt',
'__externalProcessMeta',
'__statusChangedAt',
'__printForm']
/** токен из администрирование -> токены */
const API_TOKEN = `af9790b0-8224-4831-84b7-d28909d700dc`
let base_url: string = ''
/** функция инициализации */
async function onInit(): Promise<void> {
base_url = System.company.url
const namespaces = await getNamespaces()
if (namespaces?.length) {
const apps_arr = await Promise.all(namespaces.map(f => getApps(f)));
let all_apps: IApp[] = []
all_apps = all_apps.concat(...apps_arr)
for (let item of all_apps) {
Context.fields.application.data.variants.push({
name: `${item.ns.name}/${item.name}`,
code: `${item.ns.code}.${item.code}`
})
}
}
}
Функции для получения разделов/приложений:
Код:
/** получить разделы */
async function getNamespaces(): Promise<INamespace[]> {
let namespaces: INamespace[] = []
let res = await fetch(`${base_url}/pub/v1/scheme/namespaces`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_TOKEN}`,
}
})
if (!res.ok) {
let text = await res.text()
console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
return []
} else {
try {
let json_result = await res.json();
//получаем разделы которые не скрыты и не глобальные
const namespaces_json = json_result.result.result.filter((f: any) => f.namespace == "global" && f.hidden == false && f.__deletedAt == null)
namespaces_json.map((f: any) => {
namespaces.push({
code: f.code,
name: f.name
})
})
}
catch (err) {
console.log(`Ошибка при формировании ответа: ${err.message}`);
return []
}
}
return namespaces
}
/**получить приложения из раздела */
async function getApps(ns: INamespace): Promise<IApp[]> {
const curr_ns_apps: IApp[] = []
let res = await fetch(`${base_url}/pub/v1/scheme/namespaces/${ns.code}/apps`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_TOKEN}`,
}
})
if (!res.ok) {
let text = await res.text()
console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
return []
} else {
try {
let json_result = await res.json();
const apps_json = json_result.result.result
apps_json.map((f: any) => {
curr_ns_apps.push({
code: f.code,
ns: ns,
name: f.name
})
})
}
catch (err) {
console.log(`Ошибка при формировании ответа: ${err.message}`);
return []
}
}
return curr_ns_apps
}
Фунция при изменении значения в поле "Приложение":
Код:
async function getAttrs():Promise<void> {
//очищаем старые варианты
if (Context.fields.attributes.data.variants?.length) {
for (let i = Context.fields.attributes.data.variants.length; i > 0; i--) {
Context.fields.attributes.data.variants.pop()
}
}
if(!Context.data.application) return
const [ns, code] = (Context.data.application.code as string).split('.')
let res = await fetch(`${base_url}/pub/v1/scheme/namespaces/${ns}/apps/${code}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_TOKEN}`,
}
})
if (!res.ok) {
let text = await res.text()
console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
} else {
try {
let json_result = await res.json();
const fields = json_result.application.fields.filter((f: any) => ignor_fields.indexOf(f.code) < 0);
for (let field of fields) {
let code = ''
let name = ''
//для дат/время дополнительно записываем подтип
if (field.type == 'DATETIME') {
code = `${field.code}.${field.type}.${field.view.data.additionalType}`
name = field.view.name
} else {
code = `${field.code}.${field.type}`
name = field.view.name
}
Context.fields.attributes.data.variants.push({code: code, name: name})
}
}
catch (err) {
console.log(`Ошибка при формировании ответа: ${err.message}`);
}
}
}
Более подробно можно посмотреть в ролике - ролик
Еще больше полезной информации в ТГ канале WhatDaELMA365