v1.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace zin;
  3. class queryBase extends wg
  4. {
  5. /**
  6. * @var mixed[]
  7. */
  8. protected static $defineProps = array(
  9. 'title?: string',
  10. 'titleTip?: string',
  11. 'sql?: string',
  12. 'cols?: array',
  13. 'data?: array',
  14. 'settings?: array',
  15. 'tableOptions?: array',
  16. 'pager?: array',
  17. 'mode?: string=text',
  18. 'error?: string',
  19. 'onQuery?: function',
  20. 'onSqlChange?: function',
  21. 'onSaveFields?: function'
  22. );
  23. /**
  24. * @var mixed[]
  25. */
  26. protected static $defineBlocks = array(
  27. 'heading' => array(),
  28. 'formActions' => array(),
  29. 'formFooter' => array(),
  30. 'builder' => array()
  31. );
  32. public static function getPageCSS()
  33. {
  34. return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css');
  35. }
  36. public static function getPageJS()
  37. {
  38. return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
  39. }
  40. protected function buildTitleTip()
  41. {
  42. list($titleTip) = $this->prop(array('titleTip'));
  43. if(empty($titleTip)) return null;
  44. return div
  45. (
  46. setClass('sql-help-text pl-2'),
  47. sqlBuilderHelpIcon('', false),
  48. span(setClass('text-gray-500'), $titleTip)
  49. );
  50. }
  51. protected function buildQueryPanel()
  52. {
  53. global $lang;
  54. list($title, $sql, $mode, $onQuery, $onSqlChange, $error) = $this->prop(array('title', 'sql', 'mode', 'onQuery', 'onSqlChange', 'error'));
  55. $headingBlock = $this->block('heading');
  56. $formActionsBlock = $this->block('formActions');
  57. $formFooterBlock = $this->block('formFooter');
  58. return panel
  59. (
  60. setClass('mb-4 sql-panel'),
  61. set::title($title),
  62. to::heading
  63. (
  64. setClass('relative justify-start-important gap-0-important'),
  65. $this->buildTitleTip(),
  66. $headingBlock
  67. ),
  68. form
  69. (
  70. setID('sqlForm'),
  71. setClass('relative'),
  72. set::actionsClass('pull-left'),
  73. to::actions
  74. (
  75. btn
  76. (
  77. setClass('query primary'),
  78. set::text($lang->dataview->query),
  79. on::click()->do($onQuery)
  80. ),
  81. $formActionsBlock
  82. ),
  83. set::submitBtnText($lang->bi->query),
  84. formGroup
  85. (
  86. setID('querySql'),
  87. setClass(array('hidden' => $mode != 'text')),
  88. set::control(array('type' => 'textarea', 'rows' => 4)),
  89. set::name('sql'),
  90. set::value($sql),
  91. on::change()->do($onSqlChange)
  92. ),
  93. $this->block('builder'),
  94. !empty($error) ? formGroup
  95. (
  96. set::tipClass('text-danger'),
  97. set::tip($error)
  98. ) : null,
  99. $formFooterBlock
  100. )
  101. );
  102. }
  103. protected function buildTablePanel()
  104. {
  105. global $lang;
  106. list($sql, $cols, $data, $pager) = $this->prop(array('sql', 'cols', 'data', 'pager'));
  107. return panel
  108. (
  109. set::title($lang->dataview->result),
  110. to::headingActions
  111. (
  112. empty($sql) ? null :
  113. modalTrigger
  114. (
  115. btn
  116. (
  117. set::type('ghost'),
  118. set::icon('cog-outline'),
  119. $lang->dataview->fieldSettings
  120. ),
  121. set::target('#fieldSettingsModal')
  122. )
  123. ),
  124. dtable(set::cols($cols), set::data($data), set::height(440), set::footPager($pager))
  125. );
  126. }
  127. protected function buildFormBatchItem()
  128. {
  129. global $config;
  130. $items = array();
  131. foreach($config->langs as $key => $name)
  132. {
  133. $items[] = formBatchItem
  134. (
  135. set::name($key),
  136. set::label($name),
  137. set::width('120px')
  138. );
  139. }
  140. return $items;
  141. }
  142. protected function buildFieldSettingsModal()
  143. {
  144. global $lang, $app;
  145. list($cols, $settings, $tableOptions, $onSaveFields) = $this->prop(array('cols', 'settings', 'tableOptions', 'onSaveFields'));
  146. if(empty($cols)) return null;
  147. $data = array();
  148. foreach((array)$settings as $key => $setting)
  149. {
  150. $setting = (array)$setting;
  151. $setting['key'] = $key;
  152. $data[] = $setting;
  153. }
  154. return modal
  155. (
  156. setID('fieldSettingsModal'),
  157. set::title($lang->dataview->fieldSettings),
  158. setData('backdrop', 'static'),
  159. setData('tables', $tableOptions),
  160. set::size('lg'),
  161. formBatch(setID('fieldSettingsForm'), set::mode('read-only'), set::data($data), set::actions(array()), on::change('[data-name="object"]')->do('clearField(event)'), on::change('[name^=object]')->do('loadFields(event)'), on::change('[name^=field]')->do('changeFields(event)'), formBatchItem
  162. (
  163. set::name('key'),
  164. set::label($lang->dataview->field),
  165. set::control('input'),
  166. set::width('100px'),
  167. set::readonly(true)
  168. ), formBatchItem
  169. (
  170. set::name('object'),
  171. set::label($lang->dataview->relatedTable),
  172. set::control('picker'),
  173. set::width('120px'),
  174. set::items($tableOptions)
  175. ), formBatchItem
  176. (
  177. set::name('field'),
  178. set::label($lang->dataview->relatedField),
  179. set::control('picker'),
  180. set::width('120px'),
  181. set::items(array())
  182. ), formBatchItem
  183. (
  184. set::name('type'),
  185. set::label($lang->dataview->type),
  186. set::control('picker'),
  187. set::width('120px'),
  188. set::items($lang->bi->fieldTypeList),
  189. set::required(true)
  190. ), $this->buildFormBatchItem(), set::onRenderRow(jsRaw('renderRow'))),
  191. set::footerClass('form-actions gap-4 mt-4'),
  192. to::footer
  193. (
  194. btn
  195. (
  196. setID('saveFields'),
  197. set::type('primary'),
  198. $lang->save,
  199. on::click()->do($onSaveFields)
  200. ),
  201. btn
  202. (
  203. set::type('default'),
  204. set('data-dismiss', 'modal'),
  205. $lang->close
  206. )
  207. )
  208. );
  209. }
  210. protected function build()
  211. {
  212. return array
  213. (
  214. $this->buildQueryPanel(),
  215. $this->buildTablePanel(),
  216. $this->buildFieldSettingsModal()
  217. );
  218. }
  219. }