No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

1129 líneas
31 KiB

  1. {
  2. "data": {
  3. "user": {
  4. "id": "",
  5. "name": "",
  6. "token": ""
  7. }
  8. },
  9. "on": {
  10. "resize": [],
  11. "hashchange": [
  12. {
  13. "log": "hashchange"
  14. },
  15. {
  16. "browser:pageFromHash": {
  17. "pagesClass": "page",
  18. "pageChanger": "rl:openPage"
  19. }
  20. }
  21. ],
  22. "init": [
  23. {
  24. "if": {
  25. "is": "{local:preferences}",
  26. "then": [
  27. {
  28. "set": {
  29. "data preferences": "{local:preferences}"
  30. }
  31. }
  32. ],
  33. "else": [
  34. {
  35. "local set": {
  36. "preferences": "{data preferences}"
  37. }
  38. }
  39. ]
  40. }
  41. },
  42. {
  43. "set": {
  44. "var saveMethod": "POST"
  45. }
  46. },
  47. {
  48. "loadTemplate": {
  49. "selector": "body",
  50. "url": "./assets/templates/menu.html",
  51. "to": "template menu",
  52. "arguments": {},
  53. "callback": []
  54. }
  55. },
  56. {
  57. "rl:menuIcons": {
  58. "selector": "body",
  59. "items": [
  60. {
  61. "title": "Buildings",
  62. "icon": "rl:menu",
  63. "link": "#building"
  64. },
  65. {
  66. "title": "Floors",
  67. "icon": "rl:floors",
  68. "link": "#floor"
  69. },
  70. {
  71. "title": "Zones",
  72. "icon": "rl:zones",
  73. "link": "#zone"
  74. },
  75. {
  76. "title": "Operators",
  77. "icon": "rl:operators",
  78. "link": "#operator"
  79. },
  80. {
  81. "title": "Subjects",
  82. "icon": "rl:subjects",
  83. "link": "#subject"
  84. },
  85. {
  86. "title": "Alarms",
  87. "icon": "rl:alarms",
  88. "link": "#alarm"
  89. },
  90. {
  91. "title": "Gateways",
  92. "icon": "rl:gateways",
  93. "link": "#gateway"
  94. },
  95. {
  96. "title": "Trackers",
  97. "icon": "rl:trackers",
  98. "link": "#tracker"
  99. },
  100. {
  101. "title": "Tracks",
  102. "icon": "rl:tracks",
  103. "link": "#track"
  104. },
  105. {
  106. "title": "Settings",
  107. "icon": "rl:settings",
  108. "link": "#setting"
  109. },
  110. {
  111. "title": "Tracker Zone",
  112. "icon": "rl:trackerZone",
  113. "link": "#trackerZone"
  114. }
  115. ]
  116. }
  117. },
  118. {
  119. "fetchJson": {
  120. "url": "./assets/api/reslevis.api-1.0.5.json",
  121. "to": "data api",
  122. "options": {
  123. "method": "GET",
  124. "headers": {
  125. "Content-Type": "application/json",
  126. "Authorization": ""
  127. }
  128. },
  129. "success": [
  130. {
  131. "log": "API {data api info version} loaded"
  132. },
  133. {
  134. "rl:checkAuth": {}
  135. }
  136. ],
  137. "error": [
  138. {
  139. "log": "Error loading reslevis.api-1.0.5.json"
  140. },
  141. {
  142. "rl:checkAuth": {}
  143. }
  144. ]
  145. }
  146. }
  147. ]
  148. },
  149. "plugins": [
  150. {
  151. "name": "app",
  152. "version": "",
  153. "ondemand": false,
  154. "files": [
  155. {
  156. "type": "link",
  157. "url": "app.css"
  158. },
  159. {
  160. "type": "script",
  161. "url": "app.js"
  162. },
  163. {
  164. "type": "script",
  165. "url": "api.js"
  166. }
  167. ]
  168. },
  169. {
  170. "name": "tablestack",
  171. "description": "Headless UI for building powerful tables & datagrids",
  172. "version": "8.21.3",
  173. "ondemand": false,
  174. "files": [
  175. {
  176. "type": "script",
  177. "url": "assets/plugins/tablestack.min.js",
  178. "cdn": "https://unpkg.com/@tanstack/table-core@8.11.6/build/umd/index.production.js"
  179. }
  180. ]
  181. },
  182. {
  183. "name": "alpinejs",
  184. "description": "The rugged, minimal JavaScript framework",
  185. "version": "3.x.x",
  186. "ondemand": false,
  187. "files": [
  188. {
  189. "type": "script",
  190. "url": "assets/plugins/alpinejs.min.js"
  191. }
  192. ]
  193. },
  194. {
  195. "name": "simplebar",
  196. "description": "Scrollbars, simpler",
  197. "version": "6.2.7",
  198. "ondemand": false,
  199. "files": [
  200. {
  201. "type": "link",
  202. "url": "assets/plugins/simplebar.css"
  203. },
  204. {
  205. "type": "script",
  206. "url": "assets/plugins/simplebar.min.js"
  207. }
  208. ]
  209. },
  210. {
  211. "name": "flatpickr",
  212. "description": " A lightweight, powerful javascript datetime picker",
  213. "version": "4.6.13",
  214. "ondemand": false,
  215. "files": [
  216. {
  217. "type": "link",
  218. "url": "assets/plugins/flatpickr.min.css"
  219. },
  220. {
  221. "type": "script",
  222. "url": "assets/plugins/flatpickr.min.js"
  223. }
  224. ]
  225. },
  226. {
  227. "name": "sweetalert2",
  228. "description": "A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes",
  229. "version": "11.17.2",
  230. "ondemand": false,
  231. "files": [
  232. {
  233. "type": "script",
  234. "url": "assets/plugins/sweetalert2@11.js"
  235. }
  236. ]
  237. },
  238. {
  239. "name": "snapsvg",
  240. "description": "JavaScript Vector Library",
  241. "type": "script",
  242. "version": "0.5.1",
  243. "ondemand": false,
  244. "url": "assets/plugins/snap.svg-min.js"
  245. },
  246. {
  247. "name": "qrcode-svg",
  248. "description": "A simple QR Code generator in pure JavaScript",
  249. "type": "script",
  250. "version": "1.1.0",
  251. "ondemand": false,
  252. "url": "assets/plugins/qrcode.min.js",
  253. "ref": "https://papnkukn.github.io/qrcode-svg/"
  254. }
  255. ],
  256. "plugins-disabled": [],
  257. "setup": {
  258. "languages": [
  259. "en"
  260. ],
  261. "language": "en",
  262. "log": false,
  263. "modules": [
  264. {
  265. "name": "reslevisData",
  266. "url": "assets/modules/reslevis.config.json"
  267. },
  268. {
  269. "name": "reslevisIcons",
  270. "url": "assets/modules/reslevis.icons.json"
  271. },
  272. {
  273. "name": "reslevisData",
  274. "url": "assets/modules/reslevis.data.json"
  275. },
  276. {
  277. "name": "reslevisTexts",
  278. "url": "assets/modules/reslevis.texts.json"
  279. }
  280. ]
  281. },
  282. "parts": {
  283. "rl": {
  284. "checkAuth": [
  285. {
  286. "if": {
  287. "is": "{data settings authRequired}",
  288. "then": [
  289. {
  290. "getToken": {
  291. "url": "{data settings serverTokenUrl}",
  292. "options": {
  293. "method": "POST",
  294. "headers": {
  295. "Content-Type": "application/x-www-form-urlencoded"
  296. },
  297. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret={data settings serverClientSecret}"
  298. },
  299. "success": [
  300. {
  301. "rl:createDashboard": {
  302. "page": "home",
  303. "db": "alarm"
  304. }
  305. },
  306. {
  307. "rl:createPages": {}
  308. }
  309. ],
  310. "error": [
  311. {
  312. "rl:createDashboard": {
  313. "page": "home",
  314. "db": "alarm"
  315. }
  316. },
  317. {
  318. "rl:createPages": {}
  319. }
  320. ]
  321. }
  322. }
  323. ],
  324. "else": [
  325. {
  326. "rl:createDashboard": {
  327. "page": "home",
  328. "db": "alarm"
  329. }
  330. },
  331. {
  332. "rl:createPages": {}
  333. }
  334. ]
  335. }
  336. }
  337. ],
  338. "getToken": [
  339. {
  340. "log": "getToken from {arguments:serverTokenUrl}"
  341. },
  342. {
  343. "fetchJson": {
  344. "to": "data user token",
  345. "url": "{arguments:serverTokenUrl}",
  346. "options": {
  347. "method": "POST",
  348. "headers": {
  349. "Content-Type": "application/x-www-form-urlencoded"
  350. },
  351. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret=wojuoB7Z5xhlPFrF2lIxJSSdVHCApEgC"
  352. },
  353. "success": [
  354. {
  355. "log": "token ok"
  356. }
  357. ],
  358. "error": [
  359. {
  360. "log": "Error fetching auth token"
  361. }
  362. ]
  363. }
  364. }
  365. ],
  366. "createPages": {
  367. "do": [
  368. {
  369. "log": "Create pages"
  370. },
  371. {
  372. "for": {
  373. "var": "db",
  374. "of": [
  375. "building",
  376. "floor",
  377. "zone",
  378. "operator",
  379. "subject",
  380. "gateway",
  381. "tracker",
  382. "trackerZone",
  383. "track",
  384. "fingerprint",
  385. "setting"
  386. ],
  387. "do": [
  388. {
  389. "html": [
  390. {
  391. "selector": ".main",
  392. "tag": "div",
  393. "attr": {
  394. "id": "page{var db}",
  395. "data-value": "{var db}",
  396. "class": "page hidden"
  397. },
  398. "text": ""
  399. }
  400. ]
  401. },
  402. {
  403. "if": {
  404. "is": "'{data settings localDb}' == '1'",
  405. "then": [
  406. {
  407. "rl:getDb": {
  408. "template": "{var db}",
  409. "db": "{var db}",
  410. "serverMethod": "GET",
  411. "localDb": "{data settings localDb}",
  412. "localPath": "{data settings localPath}",
  413. "token": "{data user token}"
  414. }
  415. }
  416. ],
  417. "else": [
  418. {
  419. "apiGet": {
  420. "db": "{var db}",
  421. "template": "{var db}",
  422. "method": "GET",
  423. "success": [
  424. {
  425. "log": "apiCall get success"
  426. }
  427. ],
  428. "error": [
  429. {
  430. "log": "apiCall get error"
  431. }
  432. ]
  433. }
  434. }
  435. ]
  436. }
  437. }
  438. ]
  439. }
  440. },
  441. {
  442. "browser:pageFromHash": {
  443. "pagesClass": "page",
  444. "pageChanger": "rl:openPage"
  445. }
  446. }
  447. ]
  448. },
  449. "createDashboard": {
  450. "do": [
  451. {
  452. "log": "Create page {arguments:page}"
  453. },
  454. {
  455. "html": [
  456. {
  457. "selector": ".main",
  458. "tag": "div",
  459. "attr": {
  460. "id": "page{arguments:page}",
  461. "data-value": "{arguments:page}",
  462. "class": "page hidden"
  463. },
  464. "text": ""
  465. }
  466. ]
  467. },
  468. {
  469. "rl:getDb": {
  470. "template": "{arguments:page}",
  471. "db": "{arguments:db}",
  472. "serverMethod": "GET",
  473. "localDb": "{data settings localDb}",
  474. "localPath": "{data settings localPath}",
  475. "token": "{data user token}"
  476. }
  477. },
  478. {
  479. "browser:pageFromHash": {
  480. "pagesClass": "page",
  481. "pageChanger": "rl:openPage"
  482. }
  483. }
  484. ]
  485. },
  486. "apiPostCallback": {
  487. "do": [
  488. {
  489. "log": "apiPostCallback"
  490. },
  491. {
  492. "log": "{arguments:data}"
  493. },
  494. {
  495. "if": {
  496. "is": "{arguments:data detail 0}",
  497. "then": [
  498. {
  499. "log": "apiPostCallback error"
  500. },
  501. {
  502. "alert": "arguments:data detail 0 msg"
  503. }
  504. ],
  505. "else": [
  506. {
  507. "log": "apiPostCallback success"
  508. }
  509. ]
  510. }
  511. },
  512. {
  513. "apiGet": {
  514. "db": "{arguments:db}",
  515. "template": "{arguments:db}",
  516. "method": "GET",
  517. "success": [
  518. {
  519. "log": "apiCall get success"
  520. }
  521. ],
  522. "error": [
  523. {
  524. "log": "apiCall get error"
  525. }
  526. ]
  527. }
  528. }
  529. ]
  530. },
  531. "apiUpdateCallback": {
  532. "do": [
  533. {
  534. "log": "apiUpdateCallback"
  535. },
  536. {
  537. "log": "{arguments:data}"
  538. }
  539. ]
  540. },
  541. "apiDeleteCallback": {
  542. "do": [
  543. {
  544. "log": "apiDeleteCallback"
  545. },
  546. {
  547. "log": "{arguments:data}"
  548. }
  549. ]
  550. },
  551. "apiGetCallback": {
  552. "do": [
  553. {
  554. "log": "apiGetCallback"
  555. },
  556. {
  557. "log": "{arguments:data}"
  558. },
  559. {
  560. "set": {
  561. "data db {arguments:db}": "{arguments:data}"
  562. }
  563. },
  564. {
  565. "loadTemplate": {
  566. "selector": "#page{arguments:template}",
  567. "url": "./assets/templates/{arguments:template}.html",
  568. "to": "template {arguments:template}",
  569. "empty": true,
  570. "arguments": {
  571. "db": "{arguments:db}",
  572. "info": "{texts info{arguments:db}s}",
  573. "serverUrl": "{arguments:serverUrl}",
  574. "new": "rl:newPost"
  575. },
  576. "callback": []
  577. }
  578. }
  579. ]
  580. },
  581. "updateDb": {
  582. "do": [
  583. {
  584. "set": {
  585. "var dbUrl": [
  586. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  587. "{arguments:localPath}/{arguments:db}.json"
  588. ],
  589. "var token": "{data user token}"
  590. }
  591. },
  592. {
  593. "log": "DB update: {var dbUrl {arguments:localDb}}"
  594. },
  595. {
  596. "fetchJson": {
  597. "to": "data db {arguments:db}",
  598. "url": "{var dbUrl {arguments:localDb}}",
  599. "options": {
  600. "method": "GET",
  601. "headers": {
  602. "Content-Type": "application/json",
  603. "Authorization": "Bearer {var token}"
  604. }
  605. },
  606. "success": [
  607. {
  608. "js": "{document.querySelector('.update{arguments:db}').click()}"
  609. }
  610. ]
  611. }
  612. }
  613. ]
  614. },
  615. "getDb": {
  616. "do": [
  617. {
  618. "set": {
  619. "var infoText": "{texts info{arguments:db}s}"
  620. }
  621. },
  622. {
  623. "log": "getDb: {var dbUrl {arguments:localDb}}"
  624. },
  625. {
  626. "fetchJson": {
  627. "to": "var getResult",
  628. "url": "{arguments:localPath}/{arguments:db}.json",
  629. "options": {
  630. "method": "GET",
  631. "headers": {
  632. "Content-Type": "application/json",
  633. "Authorization": "Bearer {var token}"
  634. }
  635. },
  636. "success": [
  637. {
  638. "set": {
  639. "data db {arguments:db}": "{var getResult}"
  640. }
  641. },
  642. {
  643. "loadTemplate": {
  644. "selector": "#page{arguments:template}",
  645. "url": "./assets/templates/{arguments:template}.html",
  646. "to": "template {arguments:template}",
  647. "empty": true,
  648. "arguments": {
  649. "db": "{arguments:db}",
  650. "info": "{texts info{arguments:db}s}",
  651. "serverUrl": "{data settings serverUrl}",
  652. "new": "rl:newPost"
  653. },
  654. "callback": []
  655. }
  656. }
  657. ],
  658. "errorDisabled": [
  659. {
  660. "log": "Error loading {var dbUrl {arguments:localDb}}"
  661. },
  662. {
  663. "log": "{var getResult}"
  664. }
  665. ]
  666. }
  667. }
  668. ]
  669. },
  670. "openPage": {
  671. "arguments": "(page, path)",
  672. "do": [
  673. {
  674. "if2": {
  675. "is": "'{arguments:page}' === 'home'",
  676. "then": [
  677. {
  678. "attr": {
  679. "selector": ".menuleft",
  680. "addClass": "hidden"
  681. }
  682. }
  683. ],
  684. "else": [
  685. {
  686. "attr": {
  687. "selector": ".menuleft",
  688. "removeClass": "hidden"
  689. }
  690. }
  691. ]
  692. }
  693. },
  694. {
  695. "if": {
  696. "is": "'{arguments:page}' === ''",
  697. "then": [
  698. {
  699. "link": "#home"
  700. }
  701. ]
  702. }
  703. },
  704. {
  705. "set": {
  706. "var infoText": "{texts info{arguments:page}}"
  707. }
  708. },
  709. {
  710. "html": [
  711. {
  712. "selector": ".infoText",
  713. "text": "{var infoText}",
  714. "empty": true
  715. }
  716. ]
  717. },
  718. {
  719. "log": "openPage: {var infoText}"
  720. },
  721. {
  722. "if": {
  723. "is": "{arguments:page} !== {var actualPage}",
  724. "then": [
  725. {
  726. "set": {
  727. "var actualPage": "{arguments:page}"
  728. }
  729. }
  730. ],
  731. "else": [
  732. {
  733. "rl:closePost": {
  734. "db": "{arguments:page}"
  735. }
  736. },
  737. {
  738. "clearInterval": {
  739. "name": "update"
  740. }
  741. },
  742. {
  743. "setInterval2": {
  744. "name": "update",
  745. "duration": 5000,
  746. "do": [
  747. {
  748. "apiGet": {
  749. "db": "{arguments:page}",
  750. "template": "{arguments:page}",
  751. "method": "GET",
  752. "success": [
  753. {
  754. "log": "apiCall get success"
  755. }
  756. ],
  757. "error": [
  758. {
  759. "log": "apiCall get error"
  760. }
  761. ]
  762. }
  763. }
  764. ]
  765. }
  766. }
  767. ]
  768. }
  769. }
  770. ]
  771. },
  772. "updateTable": {
  773. "do": [
  774. {
  775. "set": {
  776. "var dbUrl": [
  777. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  778. "{arguments:localPath}/{arguments:db}.json"
  779. ],
  780. "var token": "{data user token}"
  781. }
  782. },
  783. {
  784. "log": "DB source: {var dbUrl {arguments:localDb}}"
  785. },
  786. {
  787. "fetchJson": {
  788. "to": "data db {arguments:db}",
  789. "url": "{var dbUrl {arguments:localDb}}",
  790. "options": {
  791. "method": "POST",
  792. "headers": {
  793. "Content-Type": "application/json",
  794. "Authorization": "Bearer {var token}"
  795. },
  796. "body": ""
  797. },
  798. "success": [
  799. {
  800. "loadTemplate": {
  801. "selector": "#page{arguments:db}",
  802. "url": "./assets/templates/{arguments:db}Table.html",
  803. "to": "template {arguments:db}",
  804. "empty": true,
  805. "arguments": {
  806. "db": "{arguments:db}",
  807. "info": "{var infoText}",
  808. "serverUrl": "{data settings serverUrl}",
  809. "new": "rl:newPost"
  810. },
  811. "callback": []
  812. }
  813. }
  814. ]
  815. }
  816. }
  817. ]
  818. },
  819. "openPost": {
  820. "do": [
  821. {
  822. "set": {
  823. "var saveMethod": "{arguments:method}"
  824. }
  825. },
  826. {
  827. "set": {
  828. "var schemaItem": "{data api components schemas {arguments:db}Item}"
  829. }
  830. },
  831. {
  832. "set": {
  833. "var schemaItem": "{data api components schemas {arguments:db}Item}"
  834. }
  835. },
  836. {
  837. "loadTemplate": {
  838. "selector": ".page[data-value={arguments:db}] .post",
  839. "url": "./assets/templates/post.html",
  840. "to": "template post",
  841. "empty": true,
  842. "arguments": {
  843. "db": "{arguments:db}",
  844. "id": "{arguments:fields id}",
  845. "fields": "{arguments:fields}",
  846. "method": "{arguments:method}",
  847. "serverUrl": "{data settings serverUrl}",
  848. "close": "rl:closePost",
  849. "remove": "rl:removePost",
  850. "save": "rl:savePost"
  851. },
  852. "callback": [
  853. {
  854. "html": [
  855. {
  856. "selector": ".cancelButton",
  857. "on": {
  858. "mousedown": [
  859. {
  860. "rl:closePost": {
  861. "db": "{arguments:db}"
  862. }
  863. }
  864. ]
  865. }
  866. }
  867. ]
  868. },
  869. {
  870. "createForm": {
  871. "selector": ".page[data-value={arguments:db}] .fields",
  872. "serverUrl": "{data settings serverUrl}",
  873. "db": "{arguments:db}",
  874. "name": "{arguments:db}",
  875. "schema": "{var schemaItem}",
  876. "fields": "{arguments:fields}",
  877. "error": [
  878. {
  879. "log": "error"
  880. }
  881. ],
  882. "success": [
  883. {
  884. "log": "success"
  885. }
  886. ],
  887. "callback": []
  888. }
  889. }
  890. ]
  891. }
  892. },
  893. {
  894. "attr": {
  895. "selector": ".page[data-value={arguments:db}] .post",
  896. "removeClass": "hidden"
  897. }
  898. }
  899. ]
  900. },
  901. "newPost": {
  902. "note": "https://developer.mozilla.org/en-US/docs/Glossary/UUID",
  903. "do": [
  904. {
  905. "set": {
  906. "var newId": "{js:window.crypto.randomUUID();}"
  907. }
  908. },
  909. {
  910. "rl:openPost": {
  911. "db": "{arguments:db}",
  912. "method": "POST",
  913. "id": "{var newId}",
  914. "fields": {
  915. "id": "{var newId}"
  916. }
  917. }
  918. }
  919. ]
  920. },
  921. "closePost": {
  922. "do": [
  923. {
  924. "attr": {
  925. "selector": ".page[data-value={arguments:db}] .post",
  926. "addClass": "hidden"
  927. }
  928. }
  929. ]
  930. },
  931. "savePost": {
  932. "do": [
  933. {
  934. "log": "savePost:{arguments:name}"
  935. },
  936. {
  937. "set": {
  938. "var formData": "{formDataToJson:.form{arguments:name}}"
  939. }
  940. },
  941. {
  942. "apiPost": {
  943. "db": "{arguments:name}",
  944. "method": "{var saveMethod}",
  945. "item": "{var formData}",
  946. "success": [
  947. {
  948. "log": "apiPost {var saveMethod} success"
  949. }
  950. ],
  951. "error": [
  952. {
  953. "log": "apiPost {var saveMethod} error"
  954. }
  955. ]
  956. }
  957. }
  958. ]
  959. },
  960. "removePost": {
  961. "do": [
  962. {
  963. "log": "removePost:{arguments:name}"
  964. },
  965. {
  966. "apiPost": {
  967. "db": "{arguments:name}",
  968. "id": "{arguments:id}",
  969. "method": "DELETE",
  970. "success": [
  971. {
  972. "log": "apiPost DELETE success"
  973. }
  974. ],
  975. "error": [
  976. {
  977. "log": "apiPost DELETE error"
  978. }
  979. ]
  980. }
  981. }
  982. ]
  983. },
  984. "menuIcons": {
  985. "do": [
  986. {
  987. "html": [
  988. {
  989. "selector": "body",
  990. "tag": "div",
  991. "attr": {
  992. "class": "menuleft float-left w-[200px] hidden lg:block"
  993. }
  994. },
  995. {
  996. "selector": "body",
  997. "tag": "div",
  998. "attr": {
  999. "class": "main h-screen h-full"
  1000. },
  1001. "comment": [
  1002. {
  1003. "tag": "div",
  1004. "attr": {
  1005. "class": "header flex align-items-center justify-content-center text-center float-wrap"
  1006. },
  1007. "html": [
  1008. {
  1009. "tag": "div",
  1010. "attr": {
  1011. "class": "logo m-[10px]"
  1012. },
  1013. "html": [
  1014. {
  1015. "tag": "div",
  1016. "attr": {
  1017. "class": "w-[120px] float-left"
  1018. },
  1019. "html": [
  1020. {
  1021. "tag": "a",
  1022. "attr": {
  1023. "href": "#home"
  1024. },
  1025. "html": [
  1026. {
  1027. "tag": "img",
  1028. "attr": {
  1029. "class": "",
  1030. "src": "./assets/images/logo-reslevis.svg"
  1031. }
  1032. }
  1033. ]
  1034. }
  1035. ]
  1036. }
  1037. ]
  1038. },
  1039. {
  1040. "for": {
  1041. "var": "item",
  1042. "of": "{arguments:items}",
  1043. "html": [
  1044. {
  1045. "tag": "div",
  1046. "attr": {
  1047. "class": "p-[20px] text-center"
  1048. },
  1049. "html": [
  1050. {
  1051. "tag": "a",
  1052. "attr": {
  1053. "href": "{var item link}"
  1054. },
  1055. "html": [
  1056. {
  1057. "tag": "span",
  1058. "attr": {
  1059. "class": "iconify text-[60px] bg-[transparent] text-[#008EED]",
  1060. "data-icon": "{var item icon}"
  1061. }
  1062. }
  1063. ]
  1064. },
  1065. {
  1066. "html": [
  1067. {
  1068. "tag": "a",
  1069. "attr": {
  1070. "href": "{var item link}"
  1071. }
  1072. },
  1073. {
  1074. "tag": "span",
  1075. "text": "{var item title}",
  1076. "attr": {
  1077. "class": "text-[#008EED] text-[16px] px-[0px] py-[10px]"
  1078. }
  1079. }
  1080. ]
  1081. }
  1082. ]
  1083. }
  1084. ]
  1085. }
  1086. }
  1087. ]
  1088. }
  1089. ]
  1090. }
  1091. ]
  1092. },
  1093. {
  1094. "loadTemplate": {
  1095. "selector": ".menuleft",
  1096. "url": "./assets/templates/menuleft.html",
  1097. "to": "template menuleft",
  1098. "arguments": {},
  1099. "callback": []
  1100. }
  1101. }
  1102. ]
  1103. }
  1104. }
  1105. },
  1106. "functions": {
  1107. "apiGet": {
  1108. "js": "let args = arguments[0]; console.log('UI.apiGet'); UI.apiGet(args);"
  1109. },
  1110. "apiPost": {
  1111. "js": "let args = arguments[0]; console.log('UI.apiPost'); UI.apiPost(args);"
  1112. },
  1113. "apiCall": {
  1114. "js": "let args = arguments[0]; console.log('UI.apiCall'); UI.apiCall(args);"
  1115. },
  1116. "getToken": {
  1117. "js": "let args = arguments[0]; UI.getToken(args);"
  1118. },
  1119. "createTable": {
  1120. "js": "let args = arguments[0]; console.log('createTable'); console.log(args); UI.createTable(args); js.callback({do:args.callback});"
  1121. },
  1122. "createForm": {
  1123. "js": "let args = arguments[0]; /*console.log('createForm'); console.log(args);*/ UI.createForm(args); js.callback({do:args.callback});"
  1124. },
  1125. "loadTemplate": {
  1126. "js": "let args = arguments[0]; /*console.log('loadTemplate'); console.log(args);*/ UI.loadTemplate(args); js.callback({do:args.callback});"
  1127. }
  1128. }
  1129. }