Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

927 linhas
27 KiB

  1. {
  2. "data": {
  3. "settings": {
  4. "debug": true,
  5. "unit": 1,
  6. "localDb": "0",
  7. "localPath": "db/reslevis",
  8. "localPath1":"https://jsonic.it/reslevis/app/db/reslevis",
  9. "serverId": "0",
  10. "serverMethod": "GET",
  11. "serverToken": "0",
  12. "serverTokenUrl": "https://192.168.1.3:10002/realms/API.Server.local/protocol/openid-connect/token",
  13. "updateInterval": 50000
  14. },
  15. "user": {
  16. "id": "1",
  17. "name": "Vito",
  18. "token": ""
  19. },
  20. "ui": {
  21. "pages": {
  22. "Building": {
  23. "columns": [
  24. { "accessorKey": "name", "header": "Name" },
  25. { "accessorKey": "city", "header": "City" },
  26. { "accessorKey": "actions", "header": "" }
  27. ]
  28. },
  29. "Plan": {
  30. "columns": [
  31. { "accessorKey": "name", "header": "Name" },
  32. { "accessorKey": "Building", "header": "Building" },
  33. { "accessorKey": "actions", "header": "" }
  34. ]
  35. },
  36. "Zone": {
  37. "columns": [
  38. { "accessorKey": "name", "header": "Name" },
  39. { "accessorKey": "Building", "header": "Building" },
  40. { "accessorKey": "Plan", "header": "Plan" },
  41. { "accessorKey": "actions", "header": "" }
  42. ]
  43. },
  44. "Operator": {
  45. "columns": [
  46. { "accessorKey": "name", "header": "Name" },
  47. { "accessorKey": "actions", "header": "" }
  48. ]
  49. },
  50. "Subject": {
  51. "columns": [
  52. { "accessorKey": "name", "header": "Name" },
  53. { "accessorKey": "actions", "header": "" }
  54. ]
  55. },
  56. "Alarm": {
  57. "columns": [
  58. { "accessorKey": "name", "header": "Name" },
  59. { "accessorKey": "actions", "header": "" }
  60. ]
  61. },
  62. "Gateway": {
  63. "columns": [
  64. { "accessorKey": "name", "header": "Name" },
  65. { "accessorKey": "status", "header": "Status" },
  66. { "accessorKey": "model", "header": "Model" },
  67. { "accessorKey": "ip", "header": "IP" },
  68. { "accessorKey": "position", "header": "Position" },
  69. { "accessorKey": "actions", "header": "" }
  70. ]
  71. },
  72. "Tracker": {
  73. "columns": [
  74. { "accessorKey": "name", "header": "Name" },
  75. { "accessorKey": "status", "header": "Status" },
  76. { "accessorKey": "model", "header": "Model" },
  77. { "accessorKey": "actions", "header": "" }
  78. ]
  79. },
  80. "Track": {
  81. "columns": [
  82. { "accessorKey": "time", "header": "Time" },
  83. { "accessorKey": "subject", "header": "Subject" },
  84. { "accessorKey": "gateway", "header": "Gateway" },
  85. { "accessorKey": "status", "header": "Status" },
  86. { "accessorKey": "signal", "header": "Signal" },
  87. { "accessorKey": "actions", "header": "" }
  88. ]
  89. },
  90. "Setting": {
  91. "columns": [
  92. { "accessorKey": "name", "header": "Name" },
  93. { "accessorKey": "role", "header": "Role" },
  94. { "accessorKey": "actions", "header": "" }
  95. ]
  96. }
  97. }
  98. }
  99. },
  100. "on": {
  101. "resize": [
  102. ],
  103. "hashchange": [
  104. {
  105. "log": "hashchange"
  106. },
  107. {
  108. "browser:pageFromHash": {
  109. "pagesClass": "page",
  110. "pageChanger": "rl:openPage"
  111. }
  112. }
  113. ],
  114. "init": [
  115. {
  116. "rl:menuIcons": {
  117. "selector": "body",
  118. "items": [
  119. {
  120. "title": "Buildings",
  121. "icon": "rl:buildings",
  122. "link": "#Building"
  123. },
  124. {
  125. "title": "Plans",
  126. "icon": "rl:plans",
  127. "link": "#Plan"
  128. },
  129. {
  130. "title": "Zones",
  131. "icon": "rl:zones",
  132. "link": "#Zone"
  133. },
  134. {
  135. "title": "Operators",
  136. "icon": "rl:operators",
  137. "link": "#Operator"
  138. },
  139. {
  140. "title": "Subjects",
  141. "icon": "rl:subjects",
  142. "link": "#Subject"
  143. },
  144. {
  145. "title": "Alarms",
  146. "icon": "rl:alarms",
  147. "link": "#Alarm"
  148. },
  149. {
  150. "title": "Gateways",
  151. "icon": "rl:gateways",
  152. "link": "#Gateway"
  153. },
  154. {
  155. "title": "Trackers",
  156. "icon": "rl:trackers",
  157. "link": "#Tracker"
  158. },
  159. {
  160. "title": "Tracks",
  161. "icon": "rl:tracks",
  162. "link": "#Track"
  163. },
  164. {
  165. "title": "Settings",
  166. "icon": "rl:settings",
  167. "link": "#Setting"
  168. },
  169. {
  170. "title": "Info",
  171. "icon": "rl:info",
  172. "link": "#Info"
  173. }
  174. ]
  175. }
  176. },
  177. {
  178. "fetchJson": {
  179. "url": "./assets/api/reslevis.api-1.0.4.json",
  180. "to": "data api",
  181. "options": {
  182. "method": "POST",
  183. "headers": {
  184. "Content-Type": "application/json",
  185. "Authorization": ""
  186. },
  187. "body": "{var formData}"
  188. },
  189. "success": [
  190. {
  191. "log": "API {data api info version} loaded"
  192. },
  193. {
  194. "getToken": {
  195. "url": "{data settings serverTokenUrl}",
  196. "options": {
  197. "method": "POST",
  198. "headers": {
  199. "Content-Type": "application/x-www-form-urlencoded"
  200. },
  201. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret=wojuoB7Z5xhlPFrF2lIxJSSdVHCApEgC"
  202. },
  203. "success": [
  204. {
  205. "rl:createPages": {}
  206. }
  207. ],
  208. "error": [
  209. {
  210. "rl:createPages": {}
  211. }
  212. ]
  213. }
  214. }
  215. ],
  216. "error": [
  217. {
  218. "log": "Error loading reslevis.api-1.0.4.json"
  219. },
  220. {
  221. "getToken": {
  222. "url": "{data settings serverTokenUrl}",
  223. "options": {
  224. "method": "POST",
  225. "headers": {
  226. "Content-Type": "application/x-www-form-urlencoded"
  227. },
  228. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret=wojuoB7Z5xhlPFrF2lIxJSSdVHCApEgC"
  229. },
  230. "success": [
  231. {
  232. "rl:createPages": {}
  233. }
  234. ],
  235. "error": [
  236. {
  237. "rl:createPages": {}
  238. }
  239. ]
  240. }
  241. }
  242. ]
  243. }
  244. }
  245. ]
  246. },
  247. "plugins": [
  248. {
  249. "name": "app",
  250. "version": "",
  251. "ondemand": false,
  252. "files": [
  253. {
  254. "type": "link",
  255. "url": "app.css"
  256. },
  257. {
  258. "type": "script",
  259. "url": "app.js"
  260. }
  261. ]
  262. },
  263. {
  264. "name": "tablestack",
  265. "description": "Headless UI for building powerful tables & datagrids",
  266. "version": "8.21.3",
  267. "ondemand": false,
  268. "files": [
  269. {
  270. "type": "script",
  271. "url": "assets/plugins/tablestack.min.js",
  272. "cdn": "https://unpkg.com/@tanstack/table-core@8.11.6/build/umd/index.production.js"
  273. }
  274. ]
  275. },
  276. {
  277. "name": "alpinejs",
  278. "description": "The rugged, minimal JavaScript framework",
  279. "version": "3.x.x",
  280. "ondemand": false,
  281. "files": [
  282. {
  283. "type": "script",
  284. "url": "assets/plugins/alpinejs.min.js"
  285. }
  286. ]
  287. },
  288. {
  289. "name": "simplebar",
  290. "description": "Scrollbars, simpler",
  291. "version": "6.2.7",
  292. "ondemand": false,
  293. "files": [
  294. {
  295. "type": "link",
  296. "url": "assets/plugins/simplebar.css"
  297. },
  298. {
  299. "type": "script",
  300. "url": "assets/plugins/simplebar.min.js"
  301. }
  302. ]
  303. },
  304. {
  305. "name": "flatpickr",
  306. "description": " A lightweight, powerful javascript datetime picker",
  307. "version": "4.6.13",
  308. "ondemand": false,
  309. "files": [
  310. {
  311. "type": "link",
  312. "url": "assets/plugins/flatpickr.min.css"
  313. },
  314. {
  315. "type": "script",
  316. "url": "assets/plugins/flatpickr.min.js"
  317. }
  318. ]
  319. },
  320. {
  321. "name": "sweetalert2",
  322. "description": "A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes",
  323. "version": "11.17.2",
  324. "ondemand": false,
  325. "files": [
  326. {
  327. "type": "script",
  328. "url": "assets/plugins/sweetalert2@11.js"
  329. }
  330. ]
  331. },
  332. {
  333. "name": "snapsvg",
  334. "description": "JavaScript Vector Library",
  335. "type": "script",
  336. "version": "0.5.1",
  337. "ondemand": false,
  338. "url": "assets/plugins/snap.svg-min.js"
  339. },
  340. {
  341. "name": "qrcode-svg",
  342. "description": "A simple QR Code generator in pure JavaScript",
  343. "type": "script",
  344. "version": "1.1.0",
  345. "ondemand": false,
  346. "url": "assets/plugins/qrcode.min.js",
  347. "ref": "https://papnkukn.github.io/qrcode-svg/"
  348. }
  349. ],
  350. "plugins-disabled": [],
  351. "setup": {
  352. "webhookPlayground": "https://webhook.site/#!/view/03f56bb4-e516-49cf-96d7-89bd76eff70c/fb1151db-574e-4bbe-b253-66e8c7030a6e/1",
  353. "languages": [
  354. "en"
  355. ],
  356. "language": "en",
  357. "log": false,
  358. "modules": [
  359. {
  360. "name": "reslevisIcons",
  361. "url": "assets/modules/reslevis.icons.json"
  362. },
  363. {
  364. "name": "reslevisData",
  365. "url": "assets/modules/reslevis.data.json"
  366. },
  367. {
  368. "name": "reslevisTexts",
  369. "url": "assets/modules/reslevis.texts.json"
  370. }
  371. ]
  372. },
  373. "parts": {
  374. "rl": {
  375. "getToken": [
  376. {
  377. "log": "getToken from {arguments:serverTokenUrl}"
  378. },
  379. {
  380. "fetchJson": {
  381. "to": "data user token",
  382. "url": "{arguments:serverTokenUrl}",
  383. "options": {
  384. "method": "POST",
  385. "headers": {
  386. "Content-Type": "application/x-www-form-urlencoded"
  387. },
  388. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret=wojuoB7Z5xhlPFrF2lIxJSSdVHCApEgC"
  389. },
  390. "success": [
  391. {
  392. "log": "token ok"
  393. }
  394. ],
  395. "error": [
  396. {
  397. "log": "Error fetching auth token"
  398. }
  399. ]
  400. }
  401. }
  402. ],
  403. "createPages": {
  404. "do": [
  405. {
  406. "log": "Create pages"
  407. },
  408. {
  409. "for": {
  410. "var": "db",
  411. "of": [
  412. "Building", "Plan", "Zone", "Operator", "Subject", "Alarm", "Gateway", "Tracker", "Track", "Setting"
  413. ],
  414. "do": [
  415. {
  416. "html": [
  417. {
  418. "selector": ".main",
  419. "tag": "div",
  420. "attr": {
  421. "id": "page{var db}",
  422. "data-value": "{var db}",
  423. "class": "page hidden"
  424. },
  425. "text": ""
  426. }
  427. ]
  428. },
  429. {
  430. "rl:getDb": {
  431. "db": "{var db}",
  432. "serverId": "{data settings serverId}",
  433. "serverMethod": "{data settings serverMethod}",
  434. "localDb": "{data settings localDb}",
  435. "localPath": "{data settings localPath}",
  436. "token": "{data user token}"
  437. }
  438. }
  439. ]
  440. }
  441. },
  442. {
  443. "browser:pageFromHash": {
  444. "pagesClass": "page",
  445. "pageChanger": "rl:openPage"
  446. }
  447. }
  448. ]
  449. },
  450. "updateDb": {
  451. "do": [
  452. {
  453. "set": {
  454. "var dbUrl": [
  455. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  456. "{arguments:localPath}/{arguments:db}.json"
  457. ],
  458. "var token": "{data user token}"
  459. }
  460. },
  461. {
  462. "log": "DB update: {var dbUrl {arguments:localDb}}"
  463. },
  464. {
  465. "fetchJson": {
  466. "to": "data db {arguments:db}",
  467. "url": "{var dbUrl {arguments:localDb}}",
  468. "options": {
  469. "method": "{arguments:serverMethod}",
  470. "headers": {
  471. "Content-Type": "application/json",
  472. "Authorization": "Bearer {var token}"
  473. },
  474. "body": ""
  475. },
  476. "success": [
  477. {
  478. "js": "{document.querySelector('.update{arguments:db}').click()}"
  479. }
  480. ]
  481. }
  482. }
  483. ]
  484. },
  485. "getDb": {
  486. "do": [
  487. {
  488. "set": {
  489. "var dbUrl": [
  490. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  491. "{arguments:localPath}/{arguments:db}.json"
  492. ],
  493. "var infoText": "{texts info{arguments:db}s}",
  494. "var token": "{data user token}"
  495. }
  496. },
  497. {
  498. "log": "getDb: {var dbUrl {arguments:localDb}}"
  499. },
  500. {
  501. "fetchJson": {
  502. "to": "data db {arguments:db}",
  503. "url": "{var dbUrl {arguments:localDb}}",
  504. "options": {
  505. "method": "{arguments:serverMethod}",
  506. "headers": {
  507. "Content-Type": "application/json",
  508. "Authorization": "Bearer {var token}"
  509. }
  510. },
  511. "success": [
  512. {
  513. "loadTemplate": {
  514. "selector": "#page{arguments:db}",
  515. "url": "./assets/templates/{arguments:db}.html",
  516. "to": "template {arguments:db}",
  517. "empty": true,
  518. "arguments": {
  519. "db": "{arguments:db}",
  520. "info": "{texts info{arguments:db}s}",
  521. "serverId": "{data settings serverId}",
  522. "new": "rl:newPost"
  523. },
  524. "callback": []
  525. }
  526. }
  527. ],
  528. "errorDisabled": [
  529. {
  530. "log": "Error loading {var dbUrl {arguments:localDb}}"
  531. }
  532. ]
  533. }
  534. }
  535. ]
  536. },
  537. "openPage": {
  538. "arguments": "(page, path)",
  539. "do": [
  540. {
  541. "if": {
  542. "is": "{arguments:page} !== {var actualPage}",
  543. "then": [
  544. {
  545. "set": {
  546. "var actualPage": "{arguments:page}"
  547. }
  548. }
  549. ],
  550. "else": [
  551. {
  552. "rl:closePost": {
  553. "db": "{arguments:page}"
  554. }
  555. },
  556. {
  557. "clearInterval": {
  558. "name": "update"
  559. }
  560. },
  561. {
  562. "setInterval2": {
  563. "name": "update",
  564. "duration": 10000,
  565. "do": [
  566. {
  567. "rl:updateDb": {
  568. "db": "{arguments:page}",
  569. "serverId": "{data settings serverId}",
  570. "serverMethod": "{data settings serverMethod}",
  571. "localDb": "{data settings localDb}",
  572. "localPath": "{data settings localPath}",
  573. "token": "{data user token}"
  574. }
  575. }
  576. ]
  577. }
  578. }
  579. ]
  580. }
  581. }
  582. ]
  583. },
  584. "updateTable": {
  585. "do": [
  586. {
  587. "set": {
  588. "var dbUrl": [
  589. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  590. "{arguments:localPath}/{arguments:db}.json"
  591. ],
  592. "var token": "{data user token}"
  593. }
  594. },
  595. {
  596. "log": "DB source: {var dbUrl {arguments:localDb}}"
  597. },
  598. {
  599. "fetchJson": {
  600. "to": "data db {arguments:db}",
  601. "url": "{var dbUrl {arguments:localDb}}",
  602. "options": {
  603. "method": "POST",
  604. "headers": {
  605. "Content-Type": "application/json",
  606. "Authorization": "Bearer {var token}"
  607. },
  608. "body": ""
  609. },
  610. "success": [
  611. {
  612. "loadTemplate": {
  613. "selector": "#page{arguments:db}",
  614. "url": "./assets/templates/{arguments:db}Table.html",
  615. "to": "template {arguments:db}",
  616. "empty": true,
  617. "arguments": {
  618. "db": "{arguments:db}",
  619. "info": "{var infoText}",
  620. "serverId": "{data settings serverId}",
  621. "new": "rl:newPost"
  622. },
  623. "callback": []
  624. }
  625. }
  626. ]
  627. }
  628. }
  629. ]
  630. },
  631. "openPost": {
  632. "do": [
  633. {
  634. "set": {
  635. "var schemaItem": "{data api components schemas {arguments:db}Item}"
  636. }
  637. },
  638. {
  639. "loadTemplate": {
  640. "selector": ".page[data-value={arguments:db}] .post",
  641. "url": "./assets/templates/Post.html",
  642. "to": "template post",
  643. "empty": true,
  644. "arguments": {
  645. "db": "{arguments:db}",
  646. "serverId": "{data settings serverId}",
  647. "close": "rl:closePost",
  648. "remove": "rl:removePost",
  649. "save": "rl:savePost"
  650. },
  651. "callback": [
  652. {
  653. "html": [
  654. {
  655. "selector": ".cancelButton",
  656. "on": {
  657. "mousedown": [
  658. {
  659. "rl:closePost": {
  660. "db": "{arguments:db}"
  661. }
  662. }
  663. ]
  664. }
  665. }
  666. ]
  667. },
  668. {
  669. "createForm": {
  670. "selector": ".page[data-value={arguments:db}] .fields",
  671. "serverId": "{data settings serverId}",
  672. "db": "{arguments:db}",
  673. "name": "{arguments:db}",
  674. "schema": "{var schemaItem}",
  675. "fields": "{arguments:fields}",
  676. "error": [
  677. {
  678. "log": "error"
  679. }
  680. ],
  681. "success": [
  682. {
  683. "log": "success"
  684. }
  685. ],
  686. "callback": []
  687. }
  688. }
  689. ]
  690. }
  691. },
  692. {
  693. "attr": {
  694. "selector": ".page[data-value={arguments:db}] .post",
  695. "removeClass": "hidden"
  696. }
  697. }
  698. ]
  699. },
  700. "newPost": {
  701. "note": "https://developer.mozilla.org/en-US/docs/Glossary/UUID",
  702. "do": [
  703. {
  704. "rl:openPost": {
  705. "db": "{arguments:db}",
  706. "id": "",
  707. "fields": {
  708. "id": "{js:window.crypto.randomUUID();}"
  709. }
  710. }
  711. }
  712. ]
  713. },
  714. "closePost": {
  715. "do": [
  716. {
  717. "attr": {
  718. "selector": ".page[data-value={arguments:db}] .post",
  719. "addClass": "hidden"
  720. }
  721. }
  722. ]
  723. },
  724. "savePost": {
  725. "do": [
  726. {
  727. "log": "savePost:{arguments:name} {arguments:serverId}"
  728. },
  729. {
  730. "for": {
  731. "var": "field",
  732. "of": [],
  733. "do": []
  734. }
  735. },
  736. {
  737. "set": {
  738. "var formData": "{formDataToJson:.form{arguments:name}}"
  739. }
  740. },
  741. {
  742. "set": {
  743. "var formUrl": "{data api servers {arguments:serverId} url}",
  744. "var token": "{data user token}"
  745. }
  746. },
  747. {
  748. "fetchJson": {
  749. "url": "{data api servers {arguments:serverId} url}/post{arguments:name}",
  750. "to": "var result",
  751. "options": {
  752. "method": "{arguments:serverMethod}",
  753. "headers": {
  754. "Content-Type": "application/json",
  755. "Authorization": "Bearer {var token}"
  756. },
  757. "body": "{var formData}"
  758. },
  759. "success": [
  760. {
  761. "log": "fetched!"
  762. }
  763. ]
  764. }
  765. }
  766. ]
  767. },
  768. "removePost": {
  769. "do": [
  770. {
  771. "log": "removePost:{arguments:name}"
  772. },
  773. {
  774. "for": {
  775. "var": "field",
  776. "of": [],
  777. "do": []
  778. }
  779. },
  780. {
  781. "set": {
  782. "var formData": "{formDataToJson:.form{arguments:name}}"
  783. }
  784. },
  785. {
  786. "set": {
  787. "var formUrl": "{data api servers {arguments:serverId} url}",
  788. "var token": "{data user token}"
  789. }
  790. },
  791. {
  792. "fetchJson": {
  793. "url": "{var formUrl}/remove{arguments:name}",
  794. "to": "var result",
  795. "options": {
  796. "method": "{arguments:serverMethod}",
  797. "headers": {
  798. "Content-Type": "application/json",
  799. "Authorization": "Bearer {var token}"
  800. },
  801. "body": "{var formData}"
  802. },
  803. "success": [
  804. {
  805. "log": "fetched!"
  806. }
  807. ]
  808. }
  809. }
  810. ]
  811. },
  812. "menuIcons": {
  813. "do": [
  814. {
  815. "html": [
  816. {
  817. "selector": "body",
  818. "tag": "div",
  819. "attr": {
  820. "class": "main w-full h-full"
  821. },
  822. "html": [
  823. {
  824. "tag": "div",
  825. "attr": {
  826. "class": "header flex align-items-center justify-content-center text-center float-wrap"
  827. },
  828. "html": [
  829. {
  830. "tag": "div",
  831. "attr": {
  832. "class": "logo m-[10px]"
  833. },
  834. "html": [
  835. {
  836. "tag": "div",
  837. "attr": {
  838. "class": "w-[120px] h-[120px] float-left"
  839. },
  840. "html": [
  841. {
  842. "tag": "img",
  843. "attr": {
  844. "class": "",
  845. "src": "./assets/images/logo-reslevis.svg"
  846. }
  847. }
  848. ]
  849. }
  850. ]
  851. },
  852. {
  853. "for": {
  854. "var": "item",
  855. "of": "{arguments:items}",
  856. "html": [
  857. {
  858. "tag": "div",
  859. "attr": {
  860. "class": "p-[20px] text-center"
  861. },
  862. "html": [
  863. {
  864. "tag": "a",
  865. "attr": {
  866. "href": "{var item link}"
  867. },
  868. "html": [
  869. {
  870. "tag": "span",
  871. "attr": {
  872. "class": "iconify text-[60px] bg-[transparent] text-[#008EED]",
  873. "data-icon": "{var item icon}"
  874. }
  875. }
  876. ]
  877. },
  878. {
  879. "html": [
  880. {
  881. "tag": "a",
  882. "attr": {
  883. "href": "{var item link}"
  884. }
  885. },
  886. {
  887. "tag": "span",
  888. "text": "{var item title}",
  889. "attr": {
  890. "class": "text-[#008EED] text-[16px] px-[0px] py-[10px]"
  891. }
  892. }
  893. ]
  894. }
  895. ]
  896. }
  897. ]
  898. }
  899. }
  900. ]
  901. }
  902. ]
  903. }
  904. ]
  905. }
  906. ]
  907. }
  908. }
  909. },
  910. "functions": {
  911. "getToken": {
  912. "js": "let args = arguments[0]; UI.getToken(args);"
  913. },
  914. "createTable": {
  915. "js": "let args = arguments[0]; console.log('createTable'); console.log(args); UI.createTable(args); js.callback({do:args.callback});"
  916. },
  917. "createForm": {
  918. "js": "let args = arguments[0]; /*console.log('createForm'); console.log(args);*/ UI.createForm(args); js.callback({do:args.callback});"
  919. },
  920. "loadTemplate": {
  921. "js": "let args = arguments[0]; /*console.log('loadTemplate'); console.log(args);*/ UI.loadTemplate(args); js.callback({do:args.callback});"
  922. }
  923. }
  924. }