You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

314 lines
8.6 KiB

4 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. (function() {
  2. "use strict";
  3. /**
  4. * Easy selector helper function
  5. */
  6. const select = (el, all = false) => {
  7. el = el.trim()
  8. if (all) {
  9. return [...document.querySelectorAll(el)]
  10. } else {
  11. return document.querySelector(el)
  12. }
  13. }
  14. /**
  15. * Easy event listener function
  16. */
  17. const on = (type, el, listener, all = false) => {
  18. if (all) {
  19. select(el, all).forEach(e => e.addEventListener(type, listener))
  20. } else {
  21. select(el, all).addEventListener(type, listener)
  22. }
  23. }
  24. /**
  25. * Easy on scroll event listener
  26. */
  27. const onscroll = (el, listener) => {
  28. el.addEventListener('scroll', listener)
  29. }
  30. /**
  31. * Sidebar toggle
  32. */
  33. if (select('.toggle-sidebar-btn')) {
  34. on('click', '.toggle-sidebar-btn', function(e) {
  35. select('body').classList.toggle('toggle-sidebar')
  36. })
  37. }
  38. /**
  39. * Search bar toggle
  40. */
  41. if (select('.search-bar-toggle')) {
  42. on('click', '.search-bar-toggle', function(e) {
  43. select('.search-bar').classList.toggle('search-bar-show')
  44. })
  45. }
  46. /**
  47. * Navbar links active state on scroll
  48. */
  49. let navbarlinks = select('#navbar .scrollto', true)
  50. const navbarlinksActive = () => {
  51. let position = window.scrollY + 200
  52. navbarlinks.forEach(navbarlink => {
  53. if (!navbarlink.hash) return
  54. let section = select(navbarlink.hash)
  55. if (!section) return
  56. if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) {
  57. navbarlink.classList.add('active')
  58. } else {
  59. navbarlink.classList.remove('active')
  60. }
  61. })
  62. }
  63. window.addEventListener('load', navbarlinksActive)
  64. onscroll(document, navbarlinksActive)
  65. /**
  66. * Toggle .header-scrolled class to #header when page is scrolled
  67. */
  68. let selectHeader = select('#header')
  69. if (selectHeader) {
  70. const headerScrolled = () => {
  71. if (window.scrollY > 100) {
  72. selectHeader.classList.add('header-scrolled')
  73. } else {
  74. selectHeader.classList.remove('header-scrolled')
  75. }
  76. }
  77. window.addEventListener('load', headerScrolled)
  78. onscroll(document, headerScrolled)
  79. }
  80. /**
  81. * Back to top button
  82. */
  83. let backtotop = select('.back-to-top')
  84. if (backtotop) {
  85. const toggleBacktotop = () => {
  86. if (window.scrollY > 100) {
  87. backtotop.classList.add('active')
  88. } else {
  89. backtotop.classList.remove('active')
  90. }
  91. }
  92. window.addEventListener('load', toggleBacktotop)
  93. onscroll(document, toggleBacktotop)
  94. }
  95. /**
  96. * Initiate tooltips
  97. */
  98. var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
  99. var tooltipList = tooltipTriggerList.map(function(tooltipTriggerEl) {
  100. return new bootstrap.Tooltip(tooltipTriggerEl)
  101. })
  102. /**
  103. * Initiate quill editors
  104. */
  105. if (select('.quill-editor-default')) {
  106. new Quill('.quill-editor-default', {
  107. theme: 'snow'
  108. });
  109. }
  110. if (select('.quill-editor-bubble')) {
  111. new Quill('.quill-editor-bubble', {
  112. theme: 'bubble'
  113. });
  114. }
  115. if (select('.quill-editor-full')) {
  116. new Quill(".quill-editor-full", {
  117. modules: {
  118. toolbar: [
  119. [{
  120. font: []
  121. }, {
  122. size: []
  123. }],
  124. ["bold", "italic", "underline", "strike"],
  125. [{
  126. color: []
  127. },
  128. {
  129. background: []
  130. }
  131. ],
  132. [{
  133. script: "super"
  134. },
  135. {
  136. script: "sub"
  137. }
  138. ],
  139. [{
  140. list: "ordered"
  141. },
  142. {
  143. list: "bullet"
  144. },
  145. {
  146. indent: "-1"
  147. },
  148. {
  149. indent: "+1"
  150. }
  151. ],
  152. ["direction", {
  153. align: []
  154. }],
  155. ["link", "image", "video"],
  156. ["clean"]
  157. ]
  158. },
  159. theme: "snow"
  160. });
  161. }
  162. /**
  163. * Initiate TinyMCE Editor
  164. */
  165. const useDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
  166. const isSmallScreen = window.matchMedia('(max-width: 1023.5px)').matches;
  167. tinymce.init({
  168. selector: 'textarea.tinymce-editor',
  169. plugins: 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media template codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount help charmap quickbars emoticons',
  170. editimage_cors_hosts: ['picsum.photos'],
  171. menubar: 'file edit view insert format tools table help',
  172. toolbar: 'undo redo | bold italic underline strikethrough | fontfamily fontsize blocks | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | forecolor backcolor removeformat | pagebreak | charmap emoticons | fullscreen preview save print | insertfile image media template link anchor codesample | ltr rtl',
  173. toolbar_sticky: true,
  174. toolbar_sticky_offset: isSmallScreen ? 102 : 108,
  175. autosave_ask_before_unload: true,
  176. autosave_interval: '30s',
  177. autosave_prefix: '{path}{query}-{id}-',
  178. autosave_restore_when_empty: false,
  179. autosave_retention: '2m',
  180. image_advtab: true,
  181. link_list: [{
  182. title: 'My page 1',
  183. value: 'https://www.tiny.cloud'
  184. },
  185. {
  186. title: 'My page 2',
  187. value: 'http://www.moxiecode.com'
  188. }
  189. ],
  190. image_list: [{
  191. title: 'My page 1',
  192. value: 'https://www.tiny.cloud'
  193. },
  194. {
  195. title: 'My page 2',
  196. value: 'http://www.moxiecode.com'
  197. }
  198. ],
  199. image_class_list: [{
  200. title: 'None',
  201. value: ''
  202. },
  203. {
  204. title: 'Some class',
  205. value: 'class-name'
  206. }
  207. ],
  208. importcss_append: true,
  209. file_picker_callback: (callback, value, meta) => {
  210. /* Provide file and text for the link dialog */
  211. if (meta.filetype === 'file') {
  212. callback('https://www.google.com/logos/google.jpg', {
  213. text: 'My text'
  214. });
  215. }
  216. /* Provide image and alt text for the image dialog */
  217. if (meta.filetype === 'image') {
  218. callback('https://www.google.com/logos/google.jpg', {
  219. alt: 'My alt text'
  220. });
  221. }
  222. /* Provide alternative source and posted for the media dialog */
  223. if (meta.filetype === 'media') {
  224. callback('movie.mp4', {
  225. source2: 'alt.ogg',
  226. poster: 'https://www.google.com/logos/google.jpg'
  227. });
  228. }
  229. },
  230. templates: [{
  231. title: 'New Table',
  232. description: 'creates a new table',
  233. content: '<div class="mceTmpl"><table width="98%%" border="0" cellspacing="0" cellpadding="0"><tr><th scope="col"> </th><th scope="col"> </th></tr><tr><td> </td><td> </td></tr></table></div>'
  234. },
  235. {
  236. title: 'Starting my story',
  237. description: 'A cure for writers block',
  238. content: 'Once upon a time...'
  239. },
  240. {
  241. title: 'New list with dates',
  242. description: 'New List with dates',
  243. content: '<div class="mceTmpl"><span class="cdate">cdate</span><br><span class="mdate">mdate</span><h2>My List</h2><ul><li></li><li></li></ul></div>'
  244. }
  245. ],
  246. template_cdate_format: '[Date Created (CDATE): %m/%d/%Y : %H:%M:%S]',
  247. template_mdate_format: '[Date Modified (MDATE): %m/%d/%Y : %H:%M:%S]',
  248. height: 600,
  249. image_caption: true,
  250. quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
  251. noneditable_class: 'mceNonEditable',
  252. toolbar_mode: 'sliding',
  253. contextmenu: 'link image table',
  254. skin: useDarkMode ? 'oxide-dark' : 'oxide',
  255. content_css: useDarkMode ? 'dark' : 'default',
  256. content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
  257. });
  258. /**
  259. * Initiate Bootstrap validation check
  260. */
  261. var needsValidation = document.querySelectorAll('.needs-validation')
  262. Array.prototype.slice.call(needsValidation)
  263. .forEach(function(form) {
  264. form.addEventListener('submit', function(event) {
  265. if (!form.checkValidity()) {
  266. event.preventDefault()
  267. event.stopPropagation()
  268. }
  269. form.classList.add('was-validated')
  270. }, false)
  271. })
  272. /**
  273. * Initiate Datatables
  274. */
  275. const datatables = select('.datatable', true)
  276. datatables.forEach(datatable => {
  277. new simpleDatatables.DataTable(datatable);
  278. })
  279. /**
  280. * Autoresize echart charts
  281. */
  282. const mainContainer = select('#main');
  283. if (mainContainer) {
  284. setTimeout(() => {
  285. new ResizeObserver(function() {
  286. select('.echart', true).forEach(getEchart => {
  287. echarts.getInstanceByDom(getEchart).resize();
  288. })
  289. }).observe(mainContainer);
  290. }, 200);
  291. }
  292. })();