93 lines
31 KiB
JavaScript
93 lines
31 KiB
JavaScript
|
|
// OPC �𥕢��箏�瘚贝� 繚 �唳旿銝舘恣���餉�嚗��銝��唳旿皞琜��� OPC�𥕢�瘚贝�/scripts/*.json ���嚗�
|
|||
|
|
// ����𡁏𧋦閫��OPC�𥕢�瘚贝�/scripts/_generate_opcTest.js嚗�𧋦�唬�甈⊥�抒��琜�
|
|||
|
|
|
|||
|
|
export const QUESTIONS = [{"id":1,"part":"P1","quick":true,"question":"�W笆銝�銝芣瓷鈭箇��孵���遙�∴�雿𣳇�𡁜虜","A":"�芸楛摰𡁏�������嚗𣬚凒�交�摰��摰�","B":"撣峕��劐犖���銝芣��塚�敹���滩�摰�"},{"id":2,"part":"P1","quick":false,"question":"�𤑳緵銝�銝芸末�箔��塚�雿䭾凒�航�","A":"���銝𠹺�隡港�韏瑁�隡啜���韏瑕�摰�","B":"��䌊撌勗僕�箔葵�瑕�嚗������曉�鈭�"},{"id":3,"part":"P1","quick":false,"question":"�喃��芣䔉�嗅�������雿䭾凒�賣𦻖�堒𪑛蝘�","A":"�滚�銝芣�銝滨迅摰𡄯��擧��X�韏瑟䔉","B":"銝�撘�憪见停閬��蝔喳����摨閙𤣰��"},{"id":4,"part":"P1","quick":true,"question":"銝�蝚𥪜虾�舫���兝嚗䔶��游�曉�","A":"撠賡�摮条�嚗���峕凒摰厩迅","B":"�踹枂銝��典��餉��嗘�銝芸虾�質��梁��圈★��"},{"id":5,"part":"P1","quick":true,"question":"瘝∩犖���雿删��嗅�辷�雿惩�鈭�","A":"靘萘�隡𡁏��芸楛���憟𤩺�蝏剜綫餈�","B":"摰寞��硋��㗇⏛甇X𠯫�滚𢆡��"},{"id":6,"part":"P1","quick":false,"question":"摮虫�憿寞鰵���賣𧒄嚗䔶��游虜","A":"��閬��霂曄����鈭箏蒂�滚郎敺𡑒���","B":"�芸楛銝餃𢆡�亥��踺��器�朞器�䁅�隡�"},{"id":7,"part":"P1","quick":false,"question":"憒���𥕢�蝚砌�撟游蘨�劐�銝�銝芯犖嚗䔶��游虾��","A":"�亙��䔶�銋���芸楛銝𦠜��滚僎銋𣂼銁�嗡葉","B":"閫匧���澈銋𤩺钟��𠗕隞交𦻖��"},{"id":8,"part":"P1","quick":true,"question":"�峕𧒄閬��������摰X����鈭支�嚗䔶��游�曉�","A":"閫匧�敹�◆�劐犖��極�滢�銝�","B":"銝�銝芯犖�冽�銝𧢲䔉嚗諹器�朞器摮�"},{"id":9,"part":"P1","quick":true,"question":"撖孵� AI 撌亙�嚗䔶�����漲�游�","A":"�踵�銝餃𢆡撠肽��� AI 蝏躰䌊撌望���","B":"閫匧��啁鍂撌亙�憭毺鍂嚗�郎�啁�暻餌�"},{"id":10,"part":"P1","quick":false,"question":"�祈秩�𣬚鍂 AI �凋�憟𡑒䌊�冽�蝔贝����瘥誩𪂹 10 撠𤩺𧒄�㵪�雿牐�","A":"閫匧�憭芸������𦆮銝��曉�霂�","B":"蝡见��喟䰻�𤘪�𦒘��准���撽砌��刻絲��"},{"id":11,"part":"P1","quick":false,"question":"��挽雿䭾𦻖銝𧢲䔉�𠰴僑瘝⊥�蝔喳��嗅�嚗䔶�","A":"�匧�甈暹��嗡��嗅��𨅯�嚗諹�憿嗡�","B":"隡𡁶��駁萅�亥揣�∠揮撘�"},{"id":12,"part":"P1","quick":true,"question":"雿䭾��刻�蝔喳��訫��𥕢���𧒄��","A":"�芾��日妟蝣擧𧒄�湛�敺�𠗕靽肽�","B":"�賭�霂�𤐄摰𡁶�銝�憭批��園𡢿嚗��瘥誩予 2 撠𤩺𧒄隞乩�嚗�"},{"id":13,"part":"P2","quick":true,"question":"雿䭾凒鈭怠��芰��嗆��","A":"��恥�瑯���銵䎚����煺犖�剔��啗��單�嚗䔶�銝剛繮敺𡑒���","B":"�祈䌊銝𤘪釣�梶ㄗ銝�銝芯����瘝㗇絡�刻䌊撌梁�銝𣇉�"},{"id":14,"part":"P2","quick":true,"question":"�𡁜�摰寞𧒄雿䭾凒憿箸�","A":"�湔偘��𢒰撖寥𢒰嚗𣬚凒�亥挈�箸䔉","B":"�䠷鵭�����瘛勗漲�𠉛弦嚗峕��X�蝤�"},{"id":15,"part":"P2","quick":false,"question":"�𡁏�蝚砌��閧��𧶏���霈拐��㗇�撠望�����湔糓","A":"敶㯄𢒰�𠰴恥�瑁��具��◇�拍倌銝�","B":"鈭支��𤾸恥�瑞��箇�霂𡁶�霈文虾"},{"id":16,"part":"P2","quick":true,"question":"�W笆銝�銝芾�瘝∩犖�朞�����啣�蝐鳴�雿牐�","A":"敺��憟页��喟洵銝�銝芸�餈𥕦縧霂閗�","B":"敺�馬�𠬍��喳��𧢲�瘝⊥�鈭粹�霂��"},{"id":17,"part":"P2","quick":true,"question":"雿䭾凒�踵��羓移�𥟇𦆮��","A":"餈䀹瓷�怨絲�亦�璁�艙嚗�虾�賣�銝箔�銝�銝芷���","B":"撌脩�鋡恍�霂����蝔喳���瘙��撣�㦤"},{"id":18,"part":"P2","quick":false,"question":"�厰★�格𧒄雿䭾凒�钅�","A":"�鞾鵭蝛粹𡢿憭改��芣�訫�銝钅�瘙��銝齿�蝖�","B":"�啣銁撠望��𡒊&��犖隞䁅晶嚗�𪑛�閧�鈭㗇���"},{"id":19,"part":"P2","quick":true,"question":"�𡁶��讐��𣂼停��凒憭𡁏䔉��","A":"撣桐�銝芸恥�瑞�甇�圾�喃��桅���窖敺𦯀縑隞�","B":"�𦠜�蝔见�敹怒���閫�芋�帋���"},{"id":20,"part":"P2","quick":true,"question":"雿䭾凒�踵���","A":"�㗇萱摨衣�銝�撖嫣��滚𦛚嚗�倮霂�/�芾�/摰𡁜�嚗�","B":"����𣇉�鈭批��𤥁紋蝔页��帋�甈~��虾憭滚�嚗�"},{"id":21,"part":"P2","quick":false,"question":"摰X��鞾�瘙�𧒄嚗䔶��港���","A":"瘛勗�鈭�圾隞𤥁�銝芯犖嚗峕�隞𣇉����摰𡁜�","B":"�鞟��望�折䔮憸矋��𡁏�����寞�憭滚�"},{"id":22,"part":"P2","quick":true,"question":"雿删��亦��讐��孵��游�","A":"�劐�
|
|||
|
|
|
|||
|
|
export const RULES = [{"id":1,"A":"IND","B":null},{"id":2,"A":null,"B":"IND"},{"id":3,"A":"RISK","B":null},{"id":4,"A":null,"B":"RISK"},{"id":5,"A":"DRIVE","B":null},{"id":6,"A":null,"B":"DRIVE"},{"id":7,"A":"SOLO","B":null},{"id":8,"A":null,"B":"SOLO"},{"id":9,"A":"AI","B":null},{"id":10,"A":null,"B":"AI"},{"id":11,"A":"STABLE","B":null},{"id":12,"A":null,"B":"STABLE"},{"id":13,"A":"E","B":"I"},{"id":14,"A":"E","B":"I"},{"id":15,"A":"E","B":"I"},{"id":16,"A":"V","B":"G"},{"id":17,"A":"V","B":"G"},{"id":18,"A":"V","B":"G"},{"id":19,"A":"R","B":"T"},{"id":20,"A":"R","B":"T"},{"id":21,"A":"R","B":"T"},{"id":22,"A":"P","B":"F"},{"id":23,"A":"F","B":"P"},{"id":24,"A":"P","B":"F"},{"id":25,"A":"TOUR","B":"CONTENT"},{"id":26,"A":"TOUR","B":"DIGITAL"},{"id":27,"A":"CONTENT","B":"ECOMM"},{"id":28,"A":"CONTENT","B":"CROSS"},{"id":29,"A":"DIGITAL","B":"LOCAL"},{"id":30,"A":"DIGITAL","B":"TOUR"},{"id":31,"A":"ECOMM","B":"CONTENT"},{"id":32,"A":"ECOMM","B":"DIGITAL"},{"id":33,"A":"CROSS","B":"LOCAL"},{"id":34,"A":"CROSS","B":"TOUR"},{"id":35,"A":"LOCAL","B":"ECOMM"},{"id":36,"A":"LOCAL","B":"DIGITAL"},{"id":37,"A":"MAKER","B":"CREATOR"},{"id":38,"A":"MAKER","B":"HUNTER"},{"id":39,"A":"MAKER","B":"RUNNER"},{"id":40,"A":"CREATOR","B":"MAKER"},{"id":41,"A":"CREATOR","B":"ARCH"},{"id":42,"A":"CREATOR","B":"RUNNER"},{"id":43,"A":"HUNTER","B":"MAKER"},{"id":44,"A":"HUNTER","B":"RUNNER"},{"id":45,"A":"RUNNER","B":"HUNTER"},{"id":46,"A":"RUNNER","B":"CREATOR"},{"id":47,"A":"ARCH","B":"MAKER"},{"id":48,"A":"ARCH","B":"RUNNER"},{"id":49,"A":"DIALOG","B":"AGENT"},{"id":50,"A":"DIALOG","B":"AUTOCON"},{"id":51,"A":"DIALOG","B":"OUTSOURCE"},{"id":52,"A":"AUTOCON","B":"DIALOG"},{"id":53,"A":"AUTOCON","B":"AGENT"},{"id":54,"A":"AUTOCON","B":"OUTSOURCE"},{"id":55,"A":"AGENT","B":"AUTOCON"},{"id":56,"A":"AGENT","B":"DIALOG"},{"id":57,"A":"AGENT","B":"OUTSOURCE"},{"id":58,"A":"OUTSOURCE","B":"AGENT"},{"id":59,"A":"OUTSOURCE","B":"DIALOG"},{"id":60,"A":"OUTSOURCE","B":"AUTOCON"}];
|
|||
|
|
|
|||
|
|
export const PROFILES = {"meta":{"name":"OPC �𥕢��箏�瘚贝��餃��唳旿","version":"1.0","description":"韏偦�/閫坿𠧧/撌亙�璅∪�/���蝑厩漣/16鈭箄挽/�寡捶頧渡�摰峕㟲�讛膩�唳旿��𥁒�𦠜葡�㮖�閫�粉���韏𡝗𧋦��辣��","pairs":{"EI":["E","I"],"VG":["V","G"],"RT":["R","T"],"PF":["P","F"]}},"axes":[{"code":"EI","name":"�賡�頧�","left":"E","right":"I","leftLabel":"撖孵�餈墧𦻖","rightLabel":"撖孵�瘛梯��","leftDesc":"隞𦒘�鈭箸��𠾼����乓����蓥葉�瑕��賡�嚗偦����瑕恥銝舘��亙����","rightDesc":"隞𡒊𡠺�芯�瘜具��楛摨虫漣�箔葉�瑕��賡�嚗偦����𥕢�銝𦒘漣������"},{"code":"VG","name":"閫��頧�","left":"V","right":"G","leftLabel":"�Y揣�唳㦤隡�","rightLabel":"�𦠜𨘥�鞟��箔�","leftDesc":"�𨀣洽�啣�蝐颯��鰵璁�艙��虾�賜�憌𤾸藁嚗偦�����捆IP/頝典�/�啣�鈭批�","rightDesc":"�訾縑撌脤�霂����瘙��蝔喳�撣�㦤嚗偦����寡𠧧�萄�/�砍𧑐�滚𦛚/���"},{"code":"RT","name":"隞瑕�潸蓬","left":"R","right":"T","leftLabel":"�喟頂�滚𦛚","rightLabel":"���鈭斗�","leftDesc":"�滢犖���靽∩遙���摰𡁜��𡝗��∴�����啣��刻砭/���/�砍𧑐�滚𦛚","rightDesc":"�齿������璅~������憭滚�嚗偦����萄�/��捆IP/頝典�"},{"code":"PF","name":"���頧�","left":"P","right":"F","leftLabel":"霈∪�蝟餌�","rightLabel":"�菜暑摨𥪜�","leftDesc":"�� SOP���蝔卝��䌊�典���虾憭滚�嚗偦����砍𧑐�滚𦛚/�萄�/�啣�鈭批�","rightDesc":"�滚��塩����嫘��緵�箔�撉䕘������捆IP/���/頝典�"}],"personas":[{"code":"EVRP","name":"韏���游���","tagline":"蝏����犖","desc":"�穃�餈墧𦻖 + �X��唳㦤隡� + �滢犖�滢縑隞� + �厩頂蝏麄����賣�銝滚���犖�諹�皞鞉僼����䔶�撘删�獢䔶�嚗�予�罸����𡁜像�啜�������游��讠��譌��","openPath":"雿删� OPC �枏��孵�嚗𡁜��諹��亥���㵪��𡃏�皞鞟�蝏��撟喳蝱�𣇉�����𧶏�霈拍頂蝏�𤜯雿㰘蓮��"},{"code":"EVRF","name":"憌𤾸藁�閙�","tagline":"餈賣鰵��犖","desc":"�穃�餈墧𦻖 + �X��唳㦤隡� + �滢犖�滢縑隞� + 摨𥪜�敹怒���撖寞鰵�箔�����菜�嚗����鵭撣血𢆡鈭綽����蝷曄黎�卝���撉����翰�����鰵韏偦���","openPath":"雿删� OPC �枏��孵�嚗𡁜�甇亙翰頝穃�蝷曄黎銝𦒘�撉䕘��惩�蝟餃��剖漲皛𡁜𢆡韏瑟䔉��"},{"code":"EVTP","name":"�条裦�滨���","tagline":"撣����犖","desc":"�穃�餈墧𦻖 + �X��唳㦤隡� + �齿��� + �厩頂蝏麄����賣��唳㦤隡𡁏��𣂼虾憭滚���頂蝏������𡁜像�唳沲����䌊�典��曉之����譌��","openPath":"雿删� OPC �枏��孵�嚗𡁻▲撅�挽霈� + 蝟餌�憭滚�嚗𣬚鍂�箄�雿枏𣪧���閫�芋�帋��颯��"},{"code":"EVTF","name":"�箔��𤾸仍","tagline":"�X貍��犖","desc":"�穃�餈墧𦻖 + �X��唳㦤隡� + �齿��� + 摨𥪜�敹怒�������閙�蝒堒藁�麄��翰�笔��堆����瘚���𤘪���鰵��掩�X貍��","openPath":"雿删� OPC �枏��孵�嚗𡁜�甇亙翰頝㻫����𤩺�瘜𤏪��㮖�蝒堒藁敹恍�蠘��踺��翰�蠘翮隞���"},{"code":"EGRP","name":"餈鮋�摨烾鵭","tagline":"�擧覔��犖","desc":"�穃�餈墧𦻖 + �賢𧑐摮㗛� + �滢犖�滢縑隞� + �厩頂蝏麄�������𠹺�隞嗡��典𧑐�笔��𡁏楛�𡁻�𧶏��典藁蝣穃����憭滚��拙���","openPath":"雿删� OPC �枏��孵�嚗𡁜銁�砍𧑐�𠹺�摰嗅����銝芯漣����鞉�����滢�摰嗅振憭滚���"},{"code":"EGRF","name":"�啣㦤餈鞱𨯫摰�","tagline":"�硺���犖","desc":"�穃�餈墧𦻖 + �賢𧑐摮㗛� + �滢犖�滢縑隞� + 摨𥪜�敹怒����𠹺犖瘞𠉛�蝏�絲�交糓憭拍�撘粹★嚗屸����砍𧑐瘣餃𢆡���撉䎚��冗蝢方��乓��","openPath":"雿删� OPC �枏��孵�嚗𡁏�鈭箇�蝏�絲�交�鈭页��其��箏㦤瘣餃𢆡瘝㗇����銝𤾸�韐准��"},{"code":"EGTP","name":"蝟餌�蝏讐�鈭�","tagline":"�𡁏����鈭�","desc":"�穃�餈墧𦻖 + �賢𧑐摮㗛� + �齿��� + �厩頂蝏麄����賣��砍𧑐����𡁏��臬��嗆�������隞���乓��������OP �����","openPath":"雿删� OPC �枏��孵�嚗𡁏��滚𦛚 SOP �硔������嚗𣬚鍂蝟餌��餅��⊥凒憭𡁏𧋦�啣�摰嗚��"},{"code":"EGTF","name":"皜𣳇��桀恥","tagline":"�刻蓮��犖","desc":"�穃�餈墧𦻖 + �賢𧑐摮㗛� + �齿��� + 摨𥪜�敹怒�����鵭靽⊥�撌柴��僼������枏𪂹頧穿���������誨餈鞱𨯫��笆�亙������"
|
|||
|
|
|
|||
|
|
const RULE_MAP = {};
|
|||
|
|
RULES.forEach((r) => { RULE_MAP[r.id] = r; });
|
|||
|
|
|
|||
|
|
export const ADAPT_DIMS = ['IND','RISK','DRIVE','SOLO','AI','STABLE'];
|
|||
|
|
export const ADAPT_LABELS = { IND:'�祉��芯蜓', RISK:'憌𡡞埯�踹�', DRIVE:'�芷店�典�', SOLO:'�訫�憭𡁻𢒰', AI:'AI �𤩺�', STABLE:'摰匧���' };
|
|||
|
|
export const AXIS_PAIRS = [['E','I'],['V','G'],['R','T'],['P','F']];
|
|||
|
|
export const AXIS_NAMES = { EI:'�賡�', VG:'閫��', RT:'隞瑕��', PF:'���' };
|
|||
|
|
export const SECTIONS = {
|
|||
|
|
P1: '蝚砌��典� 繚 �𥕢���瓲嚗�𡠺蝡� / 憌𡡞埯 / �芷店 / �訫� / AI / 摰匧��恬�',
|
|||
|
|
P2: '蝚砌��典� 繚 �寡捶�曉�嚗���� / 閫�� / 隞瑕�� / ���嚗�',
|
|||
|
|
P3: '蝚砌��典� 繚 韏偦��誩末嚗���� / ��捆IP / �刻砭 / �萄� / 頝典� / �砍𧑐嚗�',
|
|||
|
|
P4: '蝚砍��典� 繚 閫坿𠧧�誩�嚗�漣�� / ��捆 / ��𦛚 / 餈鞱𨯫 / �嗆�嚗�',
|
|||
|
|
P5: '蝚砌��典� 繚 鈭箸㦤�譍�嚗�笆霂� / �芸𢆡�� / �箄�雿� / 憭硋�嚗�'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
export function currentQuestions(version) {
|
|||
|
|
return version === 'quick' ? QUESTIONS.filter((x) => x.quick) : QUESTIONS;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** 霈∪�嚗帋�霈曇恣��﹝銝��� �婙�� �����㺭(6蝏渡���) + 蝐餃���(4頧�) + 韏偦�/閫坿𠧧/撌亙�(share of votes) */
|
|||
|
|
export function calculate(answers, version = 'full') {
|
|||
|
|
const ids = currentQuestions(version).map((x) => x.id);
|
|||
|
|
const counts = {};
|
|||
|
|
ids.forEach((id) => {
|
|||
|
|
const ans = answers[id];
|
|||
|
|
if (ans !== 'A' && ans !== 'B') return;
|
|||
|
|
const rule = RULE_MAP[id];
|
|||
|
|
if (!rule) return;
|
|||
|
|
const code = ans === 'A' ? rule.A : rule.B;
|
|||
|
|
if (code) counts[code] = (counts[code] || 0) + 1;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const adaptDims = [];
|
|||
|
|
let adaptSum = 0;
|
|||
|
|
ADAPT_DIMS.forEach((dim) => {
|
|||
|
|
let max = 0;
|
|||
|
|
ids.forEach((id) => { const r = RULE_MAP[id]; if ((r && r.A === dim) || (r && r.B === dim)) max++; });
|
|||
|
|
const votes = counts[dim] || 0;
|
|||
|
|
const score = max > 0 ? Math.round((votes / max) * 100) : 0;
|
|||
|
|
adaptSum += score;
|
|||
|
|
adaptDims.push({ code: dim, label: ADAPT_LABELS[dim], score, votes, max });
|
|||
|
|
});
|
|||
|
|
const adaptIndex = Math.round(adaptSum / ADAPT_DIMS.length);
|
|||
|
|
let adaptLevel = null;
|
|||
|
|
PROFILES.adaptLevels.forEach((lv) => { if (adaptIndex >= lv.range[0] && adaptIndex <= lv.range[1]) adaptLevel = lv; });
|
|||
|
|
const weakestDims = [...adaptDims].sort((a, b) => a.score - b.score).slice(0, 2);
|
|||
|
|
|
|||
|
|
let typeCode = '';
|
|||
|
|
const axesDetail = [];
|
|||
|
|
AXIS_PAIRS.forEach(([left, right]) => {
|
|||
|
|
const l = counts[left] || 0, r = counts[right] || 0, total = l + r;
|
|||
|
|
const letter = l >= r ? left : right;
|
|||
|
|
typeCode += letter;
|
|||
|
|
axesDetail.push({ pair: left + right, left, right, leftPct: total > 0 ? Math.round((l / total) * 100) : 50, rightPct: total > 0 ? Math.round((r / total) * 100) : 50, winner: letter, lCount: l, rCount: r });
|
|||
|
|
});
|
|||
|
|
const persona = PROFILES.personas.find((x) => x.code === typeCode) || null;
|
|||
|
|
|
|||
|
|
function rank(dims) {
|
|||
|
|
let total = 0;
|
|||
|
|
dims.forEach((d) => { total += counts[d] || 0; });
|
|||
|
|
return dims.map((d) => ({ code: d, votes: counts[d] || 0, pct: total > 0 ? Math.round(((counts[d] || 0) / total) * 100) : 0 }))
|
|||
|
|
.sort((a, b) => b.votes - a.votes || a.code.localeCompare(b.code));
|
|||
|
|
}
|
|||
|
|
const tracks = rank(PROFILES.tracks.map((t) => t.code)).filter((t) => t.pct >= 10).slice(0, 3);
|
|||
|
|
const roles = rank(PROFILES.roles.map((t) => t.code)).filter((t) => t.pct >= 5).slice(0, 2);
|
|||
|
|
const tools = rank(PROFILES.toolModes.map((t) => t.code)).filter((t) => t.pct >= 5).slice(0, 2);
|
|||
|
|
|
|||
|
|
return { version, answeredCount: Object.keys(answers).filter((id) => ids.includes(Number(id))).length, typeCode, persona, adaptIndex, adaptLevel, adaptDims, weakestDims, axesDetail, tracks, roles, tools };
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 撅訫��亙�嚗𡁏� tracks / roles / tools 隞汿�稪ode + 蟡冽㺭�滩‘�其蛹��鉄�券�霂�祗/�讛膩����游笆鞊∴�
|
|||
|
|
* 餈蹱甅摰X�蝡舀葡�𤘪𥁒�𦠜𧒄�𣳇��齿��� PROFILES �砍𧑐�舀𧋦嚗��霂剖��冽䔉�芸�蝡荔���
|
|||
|
|
*/
|
|||
|
|
export function expandResult(r) {
|
|||
|
|
const find = (list, code) => list.find((x) => x.code === code) || {};
|
|||
|
|
return {
|
|||
|
|
...r,
|
|||
|
|
tracks: (r.tracks || []).map((t) => ({ ...t, ...find(PROFILES.tracks, t.code) })),
|
|||
|
|
roles: (r.roles || []).map((x) => ({ ...x, ...find(PROFILES.roles, x.code) })),
|
|||
|
|
tools: (r.tools || []).map((x) => ({ ...x, ...find(PROFILES.toolModes, x.code) }))
|
|||
|
|
};
|
|||
|
|
}
|