您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

928 行
27 KiB

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