option-functions.php 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493
  1. <?php
  2. trait OptionsFunction
  3. {
  4. public function settingsOptionGroup($options = [])
  5. {
  6. $settings = [];
  7. foreach ($options as $option) {
  8. $optionType = $option[0] ? $option[0] : false;
  9. $optionName = $option[1] ? $option[1] : null;
  10. $optionExtras = $option[2] ? $option[2] : [];
  11. $setting = $this->settingsOption($optionType, $optionName, $optionExtras);
  12. array_push($settings, $setting);
  13. }
  14. return $settings;
  15. }
  16. public function settingsOption($type, $name = null, $extras = null)
  17. {
  18. $type = strtolower(str_replace('-', '', $type));
  19. $setting = [
  20. 'name' => $name,
  21. 'value' => $this->config[$name] ?? ''
  22. ];
  23. switch ($type) {
  24. case 'orguser':
  25. $this->setUserOptionsVariable();
  26. $settingMerge = [
  27. 'type' => 'select',
  28. 'label' => 'Organizr User',
  29. 'options' => $this->userOptions
  30. ];
  31. break;
  32. case 'enable':
  33. $settingMerge = [
  34. 'type' => 'switch',
  35. 'label' => 'Enable',
  36. ];
  37. break;
  38. case 'auth':
  39. $this->setGroupOptionsVariable();
  40. $settingMerge = [
  41. 'type' => 'select',
  42. 'label' => 'Minimum Authentication',
  43. 'options' => $this->groupOptions
  44. ];
  45. break;
  46. case 'refresh':
  47. $settingMerge = [
  48. 'type' => 'select',
  49. 'label' => 'Refresh Seconds',
  50. 'options' => $this->timeOptions()
  51. ];
  52. break;
  53. case 'combine':
  54. case 'combine-downloader':
  55. $settingMerge = [
  56. 'type' => 'switch',
  57. 'label' => 'Add to Combined Downloader',
  58. ];
  59. break;
  60. case 'test':
  61. $settingMerge = [
  62. 'type' => 'button',
  63. 'label' => 'Test Connection',
  64. 'icon' => 'fa fa-flask',
  65. 'class' => 'pull-right',
  66. 'text' => 'Test Connection',
  67. 'attr' => 'onclick="testAPIConnection(\'' . $name . '\')"',
  68. 'help' => 'Remember! Please save before using the test button!'
  69. ];
  70. break;
  71. case 'url':
  72. $settingMerge = [
  73. 'type' => 'input',
  74. 'label' => 'URL',
  75. 'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
  76. 'placeholder' => 'http(s)://hostname:port'
  77. ];
  78. break;
  79. case 'multipleurl':
  80. $settingMerge = [
  81. 'type' => 'select2',
  82. 'class' => 'select2-multiple',
  83. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  84. 'label' => 'Multiple URL\'s',
  85. 'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
  86. 'placeholder' => 'http(s)://hostname:port',
  87. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  88. 'settings' => '{tags: true, selectOnClose: true, closeOnSelect: true, allowClear: true}',
  89. ];
  90. break;
  91. case 'multiple':
  92. $settingMerge = [
  93. 'type' => 'select2',
  94. 'class' => 'select2-multiple',
  95. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  96. 'label' => 'Multiple Values\'s',
  97. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  98. 'settings' => '{tags: true, selectOnClose: true, closeOnSelect: true, allowClear: true}',
  99. ];
  100. break;
  101. case 'cron':
  102. $settingMerge = [
  103. 'type' => 'cron',
  104. 'label' => 'Cron Schedule',
  105. 'help' => 'You may use either Cron format or - @hourly, @daily, @monthly',
  106. 'placeholder' => '* * * * *'
  107. ];
  108. break;
  109. case 'folder':
  110. $settingMerge = [
  111. 'type' => 'folder',
  112. 'label' => 'Save Path',
  113. 'help' => 'Folder path',
  114. 'placeholder' => '/path/to/folder'
  115. ];
  116. break;
  117. case 'cronfile':
  118. $path = $this->root . DIRECTORY_SEPARATOR . 'cron.php';
  119. $server = $this->serverIP();
  120. $installInstruction = ($this->docker) ?
  121. '<p lang="en">No action needed. Organizr\'s docker image comes with the Cron job built-in</p>' :
  122. '<p lang="en">Setup a Cron job so it\'s call will originate from either the server\'s IP address or a local IP address. Please use the following information to set up the Cron Job correctly.</p>
  123. <h5>Cron Information</h5>
  124. <ul class="list-icons">
  125. <li><i class="fa fa-caret-right text-info"></i> <b lang="en">Schedule</b> <small>* * * * *</small></li>
  126. <li><i class="fa fa-caret-right text-info"></i> <b lang="en">File Path</b> <small>' . $path . '</small></li>
  127. </ul>
  128. <h5>Command Examples</h5>
  129. <ul class="list-icons">
  130. <li><i class="ti-angle-right"></i> * * * * * /path/to/php ' . $path . '</li>
  131. <li><i class="ti-angle-right"></i> * * * * * curl -XGET -sL "http://' . $server . '/cron.php"</li>
  132. </ul>
  133. ';
  134. $settingMerge = [
  135. 'type' => 'html',
  136. 'override' => 12,
  137. 'label' => '',
  138. 'html' => '
  139. <div class="row">
  140. <div class="col-lg-12">
  141. <div class="panel panel-info">
  142. <div class="panel-heading">
  143. <span lang="en">Organizr Enable Cron Instructions</span>
  144. </div>
  145. <div class="panel-wrapper collapse in" aria-expanded="true">
  146. <div class="panel-body">
  147. <h3 lang="en">Instructions for your install type</h3>
  148. <span>' . $installInstruction . '</span>
  149. <button type="button" onclick="checkCronFile();" class="btn btn-outline btn-info btn-lg btn-block" lang="en">Check Cron Status</button>
  150. <div class="m-t-15 hidden cron-results-container">
  151. <div class="well">
  152. <pre class="cron-results"></pre>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. '
  161. ];
  162. break;
  163. case 'username':
  164. $settingMerge = [
  165. 'type' => 'input',
  166. 'label' => 'Username',
  167. ];
  168. break;
  169. case 'password':
  170. $settingMerge = [
  171. 'type' => 'password',
  172. 'label' => 'Password',
  173. ];
  174. break;
  175. case 'passwordalt':
  176. $settingMerge = [
  177. 'type' => 'password-alt',
  178. 'label' => 'Password',
  179. ];
  180. break;
  181. case 'passwordaltcopy':
  182. $settingMerge = [
  183. 'type' => 'password-alt-copy',
  184. 'label' => 'Password',
  185. ];
  186. break;
  187. case 'apikey':
  188. case 'token':
  189. $settingMerge = [
  190. 'type' => 'password-alt',
  191. 'label' => 'API Key/Token',
  192. ];
  193. break;
  194. case 'multipleapikey':
  195. case 'multipletoken':
  196. $settingMerge = [
  197. 'type' => 'select2',
  198. 'class' => 'select2-multiple',
  199. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  200. 'label' => 'Multiple API Key/Token\'s',
  201. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  202. 'settings' => '{tags: true, theme: "default", selectionCssClass: "password-alt", selectOnClose: true, closeOnSelect: true, allowClear: true}',
  203. ];
  204. break;
  205. case 'notice':
  206. $settingMerge = [
  207. 'type' => 'html',
  208. 'override' => 12,
  209. 'label' => '',
  210. 'html' => '
  211. <div class="row">
  212. <div class="col-lg-12">
  213. <div class="panel panel-' . ($extras['notice'] ?? 'info') . '">
  214. <div class="panel-heading">
  215. <span lang="en">' . ($extras['title'] ?? 'Attention') . '</span>
  216. </div>
  217. <div class="panel-wrapper collapse in" aria-expanded="true">
  218. <div class="panel-body">
  219. <span lang="en">' . ($extras['body'] ?? '') . '</span>
  220. <span>' . ($extras['bodyHTML'] ?? '') . '</span>
  221. </div>
  222. </div>
  223. </div>
  224. </div>
  225. </div>
  226. '
  227. ];
  228. break;
  229. case 'socks':
  230. $settingMerge = [
  231. 'type' => 'html',
  232. 'override' => 12,
  233. 'label' => '',
  234. 'html' => '
  235. <div class="panel panel-default">
  236. <div class="panel-wrapper collapse in">
  237. <div class="panel-body">' . $this->socksHeadingHTML($name) . '</div>
  238. </div>
  239. </div>'
  240. ];
  241. break;
  242. case 'about':
  243. $settingMerge = [
  244. 'type' => 'html',
  245. 'override' => 12,
  246. 'label' => '',
  247. 'html' => '
  248. <div class="panel panel-default">
  249. <div class="panel-wrapper collapse in">
  250. <div class="panel-body">
  251. <h3 lang="en">' . ucwords($name) . ' Homepage Item</h3>
  252. <p lang="en">' . $extras["about"] . '</p>
  253. </div>
  254. </div>
  255. </div>'
  256. ];
  257. break;
  258. case 'title':
  259. $settingMerge = [
  260. 'type' => 'input',
  261. 'label' => 'Title',
  262. 'help' => 'Sets the title of this homepage module',
  263. ];
  264. break;
  265. case 'toggletitle':
  266. $settingMerge = [
  267. 'type' => 'switch',
  268. 'label' => 'Toggle Title',
  269. 'help' => 'Shows/hides the title of this homepage module'
  270. ];
  271. break;
  272. case 'disablecertcheck':
  273. $settingMerge = [
  274. 'type' => 'switch',
  275. 'label' => 'Disable Certificate Check',
  276. ];
  277. break;
  278. case 'usecustomcertificate':
  279. $settingMerge = [
  280. 'type' => 'switch',
  281. 'label' => 'Use Custom Certificate',
  282. ];
  283. break;
  284. case 'hideseeding':
  285. $settingMerge = [
  286. 'type' => 'switch',
  287. 'label' => 'Hide Seeding',
  288. ];
  289. break;
  290. case 'hidecompleted':
  291. $settingMerge = [
  292. 'type' => 'switch',
  293. 'label' => 'Hide Completed',
  294. ];
  295. break;
  296. case 'hidestatus':
  297. $settingMerge = [
  298. 'type' => 'switch',
  299. 'label' => 'Hide Status',
  300. ];
  301. break;
  302. case 'limit':
  303. $settingMerge = [
  304. 'type' => 'number',
  305. 'label' => 'Item Limit',
  306. ];
  307. break;
  308. case 'mediasearchserver':
  309. $settingMerge = [
  310. 'type' => 'select',
  311. 'label' => 'Media Search Server',
  312. 'options' => $this->mediaServerOptions()
  313. ];
  314. break;
  315. case 'imagecachequality':
  316. $settingMerge = [
  317. 'type' => 'select',
  318. 'label' => 'Image Cache Quality',
  319. 'options' => [
  320. [
  321. 'name' => 'Low',
  322. 'value' => '.5'
  323. ],
  324. [
  325. 'name' => '1x',
  326. 'value' => '1'
  327. ],
  328. [
  329. 'name' => '2x',
  330. 'value' => '2'
  331. ],
  332. [
  333. 'name' => '3x',
  334. 'value' => '3'
  335. ]
  336. ]
  337. ];
  338. break;
  339. case 'blank':
  340. $settingMerge = [
  341. 'type' => 'blank',
  342. 'label' => '',
  343. ];
  344. break;
  345. case 'plexlibraryexclude':
  346. $settingMerge = [
  347. 'type' => 'select2',
  348. 'class' => 'select2-multiple',
  349. 'id' => $name . '-exclude-select-' . $this->random_ascii_string(6),
  350. 'label' => 'Libraries to Exclude',
  351. 'options' => $extras['options']
  352. ];
  353. break;
  354. case 'plexlibraryinclude':
  355. $settingMerge = [
  356. 'type' => 'select2',
  357. 'class' => 'select2-multiple',
  358. 'id' => $name . '-include-select-' . $this->random_ascii_string(6),
  359. 'label' => 'Libraries to Include',
  360. 'options' => $extras['options']
  361. ];
  362. break;
  363. // HTML ITEMS
  364. // precodeeditor possibly not needed anymore
  365. case 'precodeeditor':
  366. $settingMerge = [
  367. 'type' => 'textbox',
  368. 'class' => 'hidden ' . $name . 'Textarea',
  369. 'label' => '',
  370. ];
  371. break;
  372. case 'codeeditor':
  373. $mode = strtolower($extras['mode'] ?? 'css');
  374. switch ($mode) {
  375. case 'html':
  376. case 'javascript':
  377. $mode = 'ace/mode/' . $mode;
  378. break;
  379. case 'js':
  380. $mode = 'ace/mode/javascript';
  381. break;
  382. default:
  383. $mode = 'ace/mode/css';
  384. break;
  385. }
  386. $settingMerge = [
  387. 'type' => 'html',
  388. 'override' => 12,
  389. 'label' => 'Custom Code',
  390. 'html' => '
  391. <textarea data-changed="false" class="form-control hidden ' . $name . 'Textarea" name="' . $name . '" data-type="textbox" autocomplete="new-password">' . $this->config[$name] . '</textarea>
  392. <div id="' . $name . 'Editor" style="height:300px">' . htmlentities($this->config[$name]) . '</div>
  393. <script>
  394. let mode = ace.require("' . $mode . '").Mode;
  395. ' . str_replace('-', '', $name) . ' = ace.edit("' . $name . 'Editor");
  396. ' . str_replace('-', '', $name) . '.session.setMode(new mode());
  397. ' . str_replace('-', '', $name) . '.setTheme("ace/theme/idle_fingers");
  398. ' . str_replace('-', '', $name) . '.setShowPrintMargin(false);
  399. ' . str_replace('-', '', $name) . '.session.on("change", function(delta) {
  400. $(".' . $name . 'Textarea").val(' . str_replace('-', '', $name) . '.getValue());
  401. $(".' . $name . 'Textarea").trigger("change");
  402. });
  403. </script>
  404. '
  405. ];
  406. break;
  407. // CALENDAR ITEMS
  408. case 'calendarstart':
  409. $settingMerge = [
  410. 'type' => 'number',
  411. 'label' => '# of Days Before'
  412. ];
  413. break;
  414. case 'calendarend':
  415. $settingMerge = [
  416. 'type' => 'number',
  417. 'label' => '# of Days After'
  418. ];
  419. break;
  420. case 'calendarstartingday':
  421. case 'calendarstartday':
  422. case 'calendarstart':
  423. $settingMerge = [
  424. 'type' => 'select',
  425. 'label' => 'Start Day',
  426. 'options' => $this->daysOptions()
  427. ];
  428. break;
  429. case 'calendardefaultview':
  430. $settingMerge = [
  431. 'type' => 'select',
  432. 'label' => 'Default View',
  433. 'options' => $this->calendarDefaultOptions()
  434. ];
  435. break;
  436. case 'calendartimeformat':
  437. $settingMerge = [
  438. 'type' => 'select',
  439. 'label' => 'Time Format',
  440. 'options' => $this->timeFormatOptions()
  441. ];
  442. break;
  443. case 'calendarlocale':
  444. $settingMerge = [
  445. 'type' => 'select',
  446. 'label' => 'Locale',
  447. 'options' => $this->calendarLocaleOptions()
  448. ];
  449. break;
  450. case 'calendarlimit':
  451. $settingMerge = [
  452. 'type' => 'select',
  453. 'label' => 'Items Per Day',
  454. 'options' => $this->limitOptions()
  455. ];
  456. break;
  457. case 'color':
  458. $settingMerge = [
  459. 'type' => 'input',
  460. 'label' => 'Color',
  461. 'class' => 'pick-a-color-custom-options',
  462. 'attr' => 'data-original="' . $this->config[$name] . '"'
  463. ];
  464. break;
  465. case 'calendarlinkurl':
  466. $settingMerge = [
  467. 'type' => 'select-input',
  468. 'label' => 'Target URL',
  469. 'help' => 'Set the primary URL used when clicking on calendar icon.',
  470. 'options' => $this->makeOptionsFromValues($this->config[str_replace('CalendarLink', '', $name) . 'URL'], true, 'Use Default'),
  471. ];
  472. break;
  473. case 'calendarframetarget':
  474. $settingMerge = [
  475. 'type' => 'select',
  476. 'label' => 'Target Tab',
  477. 'help' => 'Set the tab used when clicking on calendar icon. If not set, link will open in new window.',
  478. 'options' => $this->getIframeTabs($this->config[str_replace('FrameTarget', 'CalendarLink', $name)])
  479. ];
  480. break;
  481. default:
  482. $settingMerge = [
  483. 'type' => strtolower($type),
  484. 'label' => ''
  485. ];
  486. break;
  487. }
  488. $setting = array_merge($settingMerge, $setting);
  489. if ($extras) {
  490. if (gettype($extras) == 'array') {
  491. $setting = array_merge($setting, $extras);
  492. }
  493. }
  494. return $setting;
  495. }
  496. public function getIframeTabs($url = "")
  497. {
  498. if (!empty($url)) {
  499. $response = [
  500. array(
  501. 'function' => 'fetchAll',
  502. 'query' => array(
  503. "SELECT * FROM tabs WHERE `enabled`='1' AND `type`='1' AND `group_id`>=? AND (`url` = '" . $url . "' OR `url_local` = '" . $url . "') ORDER BY `order` ASC",
  504. $this->getUserLevel(),
  505. )
  506. )
  507. ];
  508. } else {
  509. $response = [
  510. array(
  511. 'function' => 'fetchAll',
  512. 'query' => array(
  513. "SELECT * FROM tabs WHERE `enabled`='1' AND `type`='1' AND `group_id`>=? ORDER BY `order` ASC",
  514. $this->getUserLevel()
  515. )
  516. )
  517. ];
  518. }
  519. $formattedValues[] = [
  520. 'name' => 'Open in New Window',
  521. 'value' => ''
  522. ];
  523. foreach ($this->processQueries($response) as $result) {
  524. $formattedValues[] = [
  525. 'name' => $result['name'],
  526. 'value' => $result['id']
  527. ];
  528. }
  529. return $formattedValues;
  530. }
  531. public function makeOptionsFromValues($values = null, $appendBlank = null, $blankLabel = null)
  532. {
  533. if ($appendBlank === true) {
  534. $formattedValues[] = [
  535. 'name' => (!empty($blankLabel)) ? $blankLabel : 'Select option...',
  536. 'value' => ''
  537. ];
  538. } else {
  539. $formattedValues = [];
  540. }
  541. if (strpos($values, ',') !== false) {
  542. $explode = explode(',', $values);
  543. foreach ($explode as $item) {
  544. $formattedValues[] = [
  545. 'name' => $item,
  546. 'value' => $item
  547. ];
  548. }
  549. } elseif ($values == '') {
  550. $formattedValues = '';
  551. } else {
  552. $formattedValues[] = [
  553. 'name' => $values,
  554. 'value' => $values
  555. ];
  556. }
  557. return $formattedValues;
  558. }
  559. public function logLevels()
  560. {
  561. return [
  562. [
  563. 'name' => 'Debug',
  564. 'value' => 'DEBUG'
  565. ],
  566. [
  567. 'name' => 'Info',
  568. 'value' => 'INFO'
  569. ],
  570. [
  571. 'name' => 'Notice',
  572. 'value' => 'NOTICE'
  573. ],
  574. [
  575. 'name' => 'Warning',
  576. 'value' => 'WARNING'
  577. ],
  578. [
  579. 'name' => 'Error',
  580. 'value' => 'ERROR'
  581. ],
  582. [
  583. 'name' => 'Critical',
  584. 'value' => 'CRITICAL'
  585. ],
  586. [
  587. 'name' => 'Alert',
  588. 'value' => 'ALERT'
  589. ],
  590. [
  591. 'name' => 'Emergency',
  592. 'value' => 'EMERGENCY'
  593. ]
  594. ];
  595. }
  596. public function sandboxOptions()
  597. {
  598. return [
  599. [
  600. 'name' => 'Allow Presentation',
  601. 'value' => 'allow-presentation'
  602. ],
  603. [
  604. 'name' => 'Allow Forms',
  605. 'value' => 'allow-forms'
  606. ],
  607. [
  608. 'name' => 'Allow Same Origin',
  609. 'value' => 'allow-same-origin'
  610. ],
  611. [
  612. 'name' => 'Allow Orientation Lock',
  613. 'value' => 'allow-orientation-lock'
  614. ],
  615. [
  616. 'name' => 'Allow Pointer Lock',
  617. 'value' => 'allow-pointer-lock'
  618. ],
  619. [
  620. 'name' => 'Allow Scripts',
  621. 'value' => 'allow-scripts'
  622. ],
  623. [
  624. 'name' => 'Allow Popups',
  625. 'value' => 'allow-popups'
  626. ],
  627. [
  628. 'name' => 'Allow Popups To Escape Sandbox',
  629. 'value' => 'allow-popups-to-escape-sandbox'
  630. ],
  631. [
  632. 'name' => 'Allow Modals',
  633. 'value' => 'allow-modals'
  634. ],
  635. [
  636. 'name' => 'Allow Top Navigation',
  637. 'value' => 'allow-top-navigation'
  638. ],
  639. [
  640. 'name' => 'Allow Top Navigation By User Activation',
  641. 'value' => 'allow-top-navigation-by-user-activation'
  642. ],
  643. [
  644. 'name' => 'Allow Downloads',
  645. 'value' => 'allow-downloads'
  646. ],
  647. ];
  648. }
  649. public function iframeAllowOptions()
  650. {
  651. return [
  652. [
  653. 'name' => 'Allow Clipboard Read',
  654. 'value' => 'clipboard-read'
  655. ],
  656. [
  657. 'name' => 'Allow Clipboard Write',
  658. 'value' => 'clipboard-write'
  659. ],
  660. [
  661. 'name' => 'Allow Camera',
  662. 'value' => 'camera'
  663. ],
  664. [
  665. 'name' => 'Allow Microphone',
  666. 'value' => 'microphone'
  667. ],
  668. [
  669. 'name' => 'Allow Speaker Selection',
  670. 'value' => 'speaker-selection'
  671. ],
  672. [
  673. 'name' => 'Allow Encrypted Media',
  674. 'value' => 'encrypted-media'
  675. ],
  676. [
  677. 'name' => 'Allow Web Share',
  678. 'value' => 'web-share'
  679. ],
  680. [
  681. 'name' => 'Allow Capture the Screen',
  682. 'value' => 'display-capture'
  683. ],
  684. [
  685. 'name' => 'Allow Screen Wake Lock',
  686. 'value' => 'screen-wake-lock'
  687. ],
  688. [
  689. 'name' => 'Allow Geolocation',
  690. 'value' => 'geolocation'
  691. ],
  692. [
  693. 'name' => 'Allow Autoplay Media',
  694. 'value' => 'autoplay'
  695. ],
  696. [
  697. 'name' => 'Allow USB',
  698. 'value' => 'usb'
  699. ],
  700. [
  701. 'name' => 'Allow MIDI',
  702. 'value' => 'midi'
  703. ],
  704. [
  705. 'name' => 'Allow Fullscreen',
  706. 'value' => 'fullscreen'
  707. ],
  708. [
  709. 'name' => 'Allow Payment',
  710. 'value' => 'payment'
  711. ],
  712. [
  713. 'name' => 'Allow Picture-in-Picture',
  714. 'value' => 'picture-in-picture'
  715. ],
  716. [
  717. 'name' => 'Allow Gamepad',
  718. 'value' => 'gamepad'
  719. ],
  720. [
  721. 'name' => 'Allow WebXR Spatial Tracking (VR)',
  722. 'value' => 'xr-spatial-tracking'
  723. ],
  724. [
  725. 'name' => 'Allow Accelerometer Sensor',
  726. 'value' => 'accelerometer'
  727. ],
  728. [
  729. 'name' => 'Allow Gyroscope Sensor',
  730. 'value' => 'gyroscope'
  731. ],
  732. [
  733. 'name' => 'Allow Magnetometer Sensor',
  734. 'value' => 'magnetometer'
  735. ],
  736. [
  737. 'name' => 'Allow Ambient Light Sensor',
  738. 'value' => 'ambient-light-sensor'
  739. ],
  740. [
  741. 'name' => 'Allow Battery Status',
  742. 'value' => 'battery'
  743. ],
  744. [
  745. 'name' => 'Allow Sync XMLHttpRequest',
  746. 'value' => 'sync-xhr'
  747. ],
  748. ];
  749. }
  750. public function calendarLocaleOptions()
  751. {
  752. return [
  753. [
  754. 'name' => 'Arabic (Standard)',
  755. 'value' => 'ar',
  756. ],
  757. [
  758. 'name' => 'Arabic (Morocco)',
  759. 'value' => 'ar-ma',
  760. ],
  761. [
  762. 'name' => 'Arabic (Saudi Arabia)',
  763. 'value' => 'ar-sa'
  764. ],
  765. [
  766. 'value' => 'ar-tn',
  767. 'name' => 'Arabic (Tunisia)'
  768. ],
  769. [
  770. 'value' => 'bg',
  771. 'name' => 'Bulgarian'
  772. ],
  773. [
  774. 'value' => 'ca',
  775. 'name' => 'Catalan'
  776. ],
  777. [
  778. 'value' => 'cs',
  779. 'name' => 'Czech'
  780. ],
  781. [
  782. 'value' => 'da',
  783. 'name' => 'Danish'
  784. ],
  785. [
  786. 'value' => 'de',
  787. 'name' => 'German (Standard)'
  788. ],
  789. [
  790. 'value' => 'de-at',
  791. 'name' => 'German (Austria)'
  792. ],
  793. [
  794. 'value' => 'el',
  795. 'name' => 'Greek'
  796. ],
  797. [
  798. 'value' => 'en',
  799. 'name' => 'English'
  800. ],
  801. [
  802. 'value' => 'en-au',
  803. 'name' => 'English (Australia)'
  804. ],
  805. [
  806. 'value' => 'en-ca',
  807. 'name' => 'English (Canada)'
  808. ],
  809. [
  810. 'value' => 'en-gb',
  811. 'name' => 'English (United Kingdom)'
  812. ],
  813. [
  814. 'value' => 'es',
  815. 'name' => 'Spanish'
  816. ],
  817. [
  818. 'value' => 'fa',
  819. 'name' => 'Farsi'
  820. ],
  821. [
  822. 'value' => 'fi',
  823. 'name' => 'Finnish'
  824. ],
  825. [
  826. 'value' => 'fr',
  827. 'name' => 'French (Standard)'
  828. ],
  829. [
  830. 'value' => 'fr-ca',
  831. 'name' => 'French (Canada)'
  832. ],
  833. [
  834. 'value' => 'he',
  835. 'name' => 'Hebrew'
  836. ],
  837. [
  838. 'value' => 'hi',
  839. 'name' => 'Hindi'
  840. ],
  841. [
  842. 'value' => 'hr',
  843. 'name' => 'Croatian'
  844. ],
  845. [
  846. 'value' => 'hu',
  847. 'name' => 'Hungarian'
  848. ],
  849. [
  850. 'value' => 'id',
  851. 'name' => 'Indonesian'
  852. ],
  853. [
  854. 'value' => 'is',
  855. 'name' => 'Icelandic'
  856. ],
  857. [
  858. 'value' => 'it',
  859. 'name' => 'Italian'
  860. ],
  861. [
  862. 'value' => 'ja',
  863. 'name' => 'Japanese'
  864. ],
  865. [
  866. 'value' => 'ko',
  867. 'name' => 'Korean'
  868. ],
  869. [
  870. 'value' => 'lt',
  871. 'name' => 'Lithuanian'
  872. ],
  873. [
  874. 'value' => 'lv',
  875. 'name' => 'Latvian'
  876. ],
  877. [
  878. 'value' => 'nb',
  879. 'name' => 'Norwegian (Bokmal)'
  880. ],
  881. [
  882. 'value' => 'nl',
  883. 'name' => 'Dutch (Standard)'
  884. ],
  885. [
  886. 'value' => 'pl',
  887. 'name' => 'Polish'
  888. ],
  889. [
  890. 'value' => 'pt',
  891. 'name' => 'Portuguese'
  892. ],
  893. [
  894. 'value' => 'pt-br',
  895. 'name' => 'Portuguese (Brazil)'
  896. ],
  897. [
  898. 'value' => 'ro',
  899. 'name' => 'Romanian'
  900. ],
  901. [
  902. 'value' => 'ru',
  903. 'name' => 'Russian'
  904. ],
  905. [
  906. 'value' => 'sk',
  907. 'name' => 'Slovak'
  908. ],
  909. [
  910. 'value' => 'sl',
  911. 'name' => 'Slovenian'
  912. ],
  913. [
  914. 'value' => 'sr',
  915. 'name' => 'Serbian'
  916. ],
  917. [
  918. 'value' => 'sv',
  919. 'name' => 'Swedish'
  920. ],
  921. [
  922. 'value' => 'th',
  923. 'name' => 'Thai'
  924. ],
  925. [
  926. 'value' => 'tr',
  927. 'name' => 'Turkish'
  928. ],
  929. [
  930. 'value' => 'uk',
  931. 'name' => 'Ukrainian'
  932. ],
  933. [
  934. 'value' => 'vi',
  935. 'name' => 'Vietnamese'
  936. ],
  937. [
  938. 'value' => 'zh-cn',
  939. 'name' => 'Chinese (PRC)'
  940. ],
  941. [
  942. 'value' => 'zh-tw',
  943. 'name' => 'Chinese (Taiwan)'
  944. ]
  945. ];
  946. }
  947. public function daysOptions()
  948. {
  949. return array(
  950. array(
  951. 'name' => 'Sunday',
  952. 'value' => '0'
  953. ),
  954. array(
  955. 'name' => 'Monday',
  956. 'value' => '1'
  957. ),
  958. array(
  959. 'name' => 'Tueday',
  960. 'value' => '2'
  961. ),
  962. array(
  963. 'name' => 'Wednesday',
  964. 'value' => '3'
  965. ),
  966. array(
  967. 'name' => 'Thursday',
  968. 'value' => '4'
  969. ),
  970. array(
  971. 'name' => 'Friday',
  972. 'value' => '5'
  973. ),
  974. array(
  975. 'name' => 'Saturday',
  976. 'value' => '6'
  977. )
  978. );
  979. }
  980. public function mediaServerOptions()
  981. {
  982. return array(
  983. array(
  984. 'name' => 'N/A',
  985. 'value' => ''
  986. ),
  987. array(
  988. 'name' => 'Plex',
  989. 'value' => 'plex'
  990. ),
  991. array(
  992. 'name' => 'Emby [Not Available]',
  993. 'value' => 'emby'
  994. )
  995. );
  996. }
  997. public function requestTvOptions($includeUserOption = false)
  998. {
  999. $options = [
  1000. [
  1001. 'name' => 'All Seasons',
  1002. 'value' => 'all'
  1003. ],
  1004. [
  1005. 'name' => 'First Season Only',
  1006. 'value' => 'first'
  1007. ],
  1008. [
  1009. 'name' => 'Last Season Only',
  1010. 'value' => 'last'
  1011. ],
  1012. ];
  1013. $userOption = [
  1014. 'name' => 'Let User Select',
  1015. 'value' => 'user'
  1016. ];
  1017. if ($includeUserOption) {
  1018. array_push($options, $userOption);
  1019. }
  1020. return $options;
  1021. }
  1022. public function requestServiceOptions()
  1023. {
  1024. return [
  1025. [
  1026. 'name' => 'Ombi',
  1027. 'value' => 'ombi'
  1028. ],
  1029. [
  1030. 'name' => 'Overseerr',
  1031. 'value' => 'overseerr'
  1032. ]
  1033. ];
  1034. }
  1035. public function limitOptions()
  1036. {
  1037. return array(
  1038. array(
  1039. 'name' => '1 Item',
  1040. 'value' => '1'
  1041. ),
  1042. array(
  1043. 'name' => '2 Items',
  1044. 'value' => '2'
  1045. ),
  1046. array(
  1047. 'name' => '3 Items',
  1048. 'value' => '3'
  1049. ),
  1050. array(
  1051. 'name' => '4 Items',
  1052. 'value' => '4'
  1053. ),
  1054. array(
  1055. 'name' => '5 Items',
  1056. 'value' => '5'
  1057. ),
  1058. array(
  1059. 'name' => '6 Items',
  1060. 'value' => '6'
  1061. ),
  1062. array(
  1063. 'name' => '7 Items',
  1064. 'value' => '7'
  1065. ),
  1066. array(
  1067. 'name' => '8 Items',
  1068. 'value' => '8'
  1069. ),
  1070. array(
  1071. 'name' => 'Unlimited',
  1072. 'value' => '1000'
  1073. ),
  1074. );
  1075. }
  1076. public function notificationTypesOptions()
  1077. {
  1078. return array(
  1079. array(
  1080. 'name' => 'Toastr',
  1081. 'value' => 'toastr'
  1082. ),
  1083. array(
  1084. 'name' => 'Izi',
  1085. 'value' => 'izi'
  1086. ),
  1087. array(
  1088. 'name' => 'Alertify',
  1089. 'value' => 'alertify'
  1090. ),
  1091. array(
  1092. 'name' => 'Noty',
  1093. 'value' => 'noty'
  1094. ),
  1095. );
  1096. }
  1097. public function notificationPositionsOptions()
  1098. {
  1099. return array(
  1100. array(
  1101. 'name' => 'Bottom Right',
  1102. 'value' => 'br'
  1103. ),
  1104. array(
  1105. 'name' => 'Bottom Left',
  1106. 'value' => 'bl'
  1107. ),
  1108. array(
  1109. 'name' => 'Bottom Center',
  1110. 'value' => 'bc'
  1111. ),
  1112. array(
  1113. 'name' => 'Top Right',
  1114. 'value' => 'tr'
  1115. ),
  1116. array(
  1117. 'name' => 'Top Left',
  1118. 'value' => 'tl'
  1119. ),
  1120. array(
  1121. 'name' => 'Top Center',
  1122. 'value' => 'tc'
  1123. ),
  1124. array(
  1125. 'name' => 'Center',
  1126. 'value' => 'c'
  1127. ),
  1128. );
  1129. }
  1130. public function timeOptions()
  1131. {
  1132. return array(
  1133. array(
  1134. 'name' => '2.5',
  1135. 'value' => '2500'
  1136. ),
  1137. array(
  1138. 'name' => '5',
  1139. 'value' => '5000'
  1140. ),
  1141. array(
  1142. 'name' => '10',
  1143. 'value' => '10000'
  1144. ),
  1145. array(
  1146. 'name' => '15',
  1147. 'value' => '15000'
  1148. ),
  1149. array(
  1150. 'name' => '30',
  1151. 'value' => '30000'
  1152. ),
  1153. array(
  1154. 'name' => '60 [1 Minute]',
  1155. 'value' => '60000'
  1156. ),
  1157. array(
  1158. 'name' => '300 [5 Minutes]',
  1159. 'value' => '300000'
  1160. ),
  1161. array(
  1162. 'name' => '600 [10 Minutes]',
  1163. 'value' => '600000'
  1164. ),
  1165. array(
  1166. 'name' => '900 [15 Minutes]',
  1167. 'value' => '900000'
  1168. ),
  1169. array(
  1170. 'name' => '1800 [30 Minutes]',
  1171. 'value' => '1800000'
  1172. ),
  1173. array(
  1174. 'name' => '3600 [1 Hour]',
  1175. 'value' => '3600000'
  1176. ),
  1177. );
  1178. }
  1179. public function netdataOptions()
  1180. {
  1181. return [
  1182. [
  1183. 'name' => 'Disk Read',
  1184. 'value' => 'disk-read',
  1185. ],
  1186. [
  1187. 'name' => 'Disk Write',
  1188. 'value' => 'disk-write',
  1189. ],
  1190. [
  1191. 'name' => 'CPU',
  1192. 'value' => 'cpu'
  1193. ],
  1194. [
  1195. 'name' => 'Network Inbound',
  1196. 'value' => 'net-in',
  1197. ],
  1198. [
  1199. 'name' => 'Network Outbound',
  1200. 'value' => 'net-out',
  1201. ],
  1202. [
  1203. 'name' => 'Used RAM',
  1204. 'value' => 'ram-used',
  1205. ],
  1206. [
  1207. 'name' => 'Used Swap',
  1208. 'value' => 'swap-used',
  1209. ],
  1210. [
  1211. 'name' => 'Disk space used',
  1212. 'value' => 'disk-used',
  1213. ],
  1214. [
  1215. 'name' => 'Disk space available',
  1216. 'value' => 'disk-avail',
  1217. ],
  1218. [
  1219. 'name' => 'Custom',
  1220. 'value' => 'custom',
  1221. ]
  1222. ];
  1223. }
  1224. public function netdataChartOptions()
  1225. {
  1226. return [
  1227. [
  1228. 'name' => 'Easy Pie Chart',
  1229. 'value' => 'easypiechart',
  1230. ],
  1231. [
  1232. 'name' => 'Gauge',
  1233. 'value' => 'gauge'
  1234. ]
  1235. ];
  1236. }
  1237. public function netdataColourOptions()
  1238. {
  1239. return [
  1240. [
  1241. 'name' => 'Red',
  1242. 'value' => 'fe3912',
  1243. ],
  1244. [
  1245. 'name' => 'Green',
  1246. 'value' => '46e302',
  1247. ],
  1248. [
  1249. 'name' => 'Purple',
  1250. 'value' => 'CC22AA'
  1251. ],
  1252. [
  1253. 'name' => 'Blue',
  1254. 'value' => '5054e6',
  1255. ],
  1256. [
  1257. 'name' => 'Yellow',
  1258. 'value' => 'dddd00',
  1259. ],
  1260. [
  1261. 'name' => 'Orange',
  1262. 'value' => 'd66300',
  1263. ]
  1264. ];
  1265. }
  1266. public function netdataSizeOptions()
  1267. {
  1268. return [
  1269. [
  1270. 'name' => 'Large',
  1271. 'value' => 'lg',
  1272. ],
  1273. [
  1274. 'name' => 'Medium',
  1275. 'value' => 'md',
  1276. ],
  1277. [
  1278. 'name' => 'Small',
  1279. 'value' => 'sm'
  1280. ]
  1281. ];
  1282. }
  1283. public function timeFormatOptions()
  1284. {
  1285. return array(
  1286. array(
  1287. 'name' => '6p',
  1288. 'value' => 'h(:mm)t'
  1289. ),
  1290. array(
  1291. 'name' => '6:00p',
  1292. 'value' => 'h:mmt'
  1293. ),
  1294. array(
  1295. 'name' => '6pm',
  1296. 'value' => 'h(:mm)a'
  1297. ),
  1298. array(
  1299. 'name' => '6:00pm',
  1300. 'value' => 'h:mma'
  1301. ),
  1302. array(
  1303. 'name' => '6:00',
  1304. 'value' => 'h:mm'
  1305. ),
  1306. array(
  1307. 'name' => '18',
  1308. 'value' => 'H(:mm)'
  1309. ),
  1310. array(
  1311. 'name' => '18:00',
  1312. 'value' => 'H:mm'
  1313. )
  1314. );
  1315. }
  1316. public function rTorrentSortOptions()
  1317. {
  1318. return array(
  1319. array(
  1320. 'name' => 'Date Desc',
  1321. 'value' => 'dated'
  1322. ),
  1323. array(
  1324. 'name' => 'Date Asc',
  1325. 'value' => 'datea'
  1326. ),
  1327. array(
  1328. 'name' => 'Hash Desc',
  1329. 'value' => 'hashd'
  1330. ),
  1331. array(
  1332. 'name' => 'Hash Asc',
  1333. 'value' => 'hasha'
  1334. ),
  1335. array(
  1336. 'name' => 'Name Desc',
  1337. 'value' => 'named'
  1338. ),
  1339. array(
  1340. 'name' => 'Name Asc',
  1341. 'value' => 'namea'
  1342. ),
  1343. array(
  1344. 'name' => 'Size Desc',
  1345. 'value' => 'sized'
  1346. ),
  1347. array(
  1348. 'name' => 'Size Asc',
  1349. 'value' => 'sizea'
  1350. ),
  1351. array(
  1352. 'name' => 'Label Desc',
  1353. 'value' => 'labeld'
  1354. ),
  1355. array(
  1356. 'name' => 'Label Asc',
  1357. 'value' => 'labela'
  1358. ),
  1359. array(
  1360. 'name' => 'Status Desc',
  1361. 'value' => 'statusd'
  1362. ),
  1363. array(
  1364. 'name' => 'Status Asc',
  1365. 'value' => 'statusa'
  1366. ),
  1367. );
  1368. }
  1369. public function qBittorrentApiOptions()
  1370. {
  1371. return array(
  1372. array(
  1373. 'name' => 'V1',
  1374. 'value' => '1'
  1375. ),
  1376. array(
  1377. 'name' => 'V2',
  1378. 'value' => '2'
  1379. ),
  1380. );
  1381. }
  1382. public function qBittorrentSortOptions()
  1383. {
  1384. return array(
  1385. array(
  1386. 'name' => 'Hash',
  1387. 'value' => 'hash'
  1388. ),
  1389. array(
  1390. 'name' => 'Name',
  1391. 'value' => 'name'
  1392. ),
  1393. array(
  1394. 'name' => 'Size',
  1395. 'value' => 'size'
  1396. ),
  1397. array(
  1398. 'name' => 'Progress',
  1399. 'value' => 'progress'
  1400. ),
  1401. array(
  1402. 'name' => 'Download Speed',
  1403. 'value' => 'dlspeed'
  1404. ),
  1405. array(
  1406. 'name' => 'Upload Speed',
  1407. 'value' => 'upspeed'
  1408. ),
  1409. array(
  1410. 'name' => 'Priority',
  1411. 'value' => 'priority'
  1412. ),
  1413. array(
  1414. 'name' => 'Number of Seeds',
  1415. 'value' => 'num_seeds'
  1416. ),
  1417. array(
  1418. 'name' => 'Number of Seeds in Swarm',
  1419. 'value' => 'num_complete'
  1420. ),
  1421. array(
  1422. 'name' => 'Number of Leechers',
  1423. 'value' => 'num_leechs'
  1424. ),
  1425. array(
  1426. 'name' => 'Number of Leechers in Swarm',
  1427. 'value' => 'num_incomplete'
  1428. ),
  1429. array(
  1430. 'name' => 'Ratio',
  1431. 'value' => 'ratio'
  1432. ),
  1433. array(
  1434. 'name' => 'ETA',
  1435. 'value' => 'eta'
  1436. ),
  1437. array(
  1438. 'name' => 'State',
  1439. 'value' => 'state'
  1440. ),
  1441. array(
  1442. 'name' => 'Category',
  1443. 'value' => 'category'
  1444. )
  1445. );
  1446. }
  1447. public function calendarDefaultOptions()
  1448. {
  1449. return array(
  1450. array(
  1451. 'name' => 'Month',
  1452. 'value' => 'month'
  1453. ),
  1454. array(
  1455. 'name' => 'Day',
  1456. 'value' => 'basicDay'
  1457. ),
  1458. array(
  1459. 'name' => 'Week',
  1460. 'value' => 'basicWeek'
  1461. ),
  1462. array(
  1463. 'name' => 'List',
  1464. 'value' => 'list'
  1465. )
  1466. );
  1467. }
  1468. }