Bocian.php.addItemToRaport.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. const createReactClass = window.p5VendorJs.createReactClass;
  2. const h = window.p5VendorJs.React.createElement;
  3. const ReactDOM = window.p5VendorJs.ReactDOM;
  4. const AsyncTypeahead = window.p5VendorJs.AsyncTypeahead;
  5. const swal = window.swal;
  6. const DBG = 1;
  7. function convertXlinkToObjects(items) {
  8. var _childCache = {}; // fieldName => { pk => child }
  9. items.forEach(function (item) {
  10. var refFields = Object.keys(item).filter(function (fieldName) {
  11. return (-1 !== fieldName.indexOf(':') && item[fieldName]);
  12. });
  13. refFields.forEach(function (fieldName) {
  14. item[fieldName].forEach(function (child) {
  15. if (1 === Object.keys(child).length && 'xlink' in child) {
  16. // xlink
  17. } else if (Object.keys(child).length > 1) {
  18. if ('@primaryKey' in child) {
  19. if (!(fieldName in _childCache)) _childCache[fieldName] = {};
  20. _childCache[fieldName][ child['@primaryKey'] ] = child;
  21. }
  22. }
  23. })
  24. })
  25. return item;
  26. });
  27. DBG && console.log('DBG convertXlinkToObjects', { _childCache, items });
  28. return items.map(function (item) {
  29. var refFields = Object.keys(item).filter(function (fieldName) {
  30. return (-1 !== fieldName.indexOf(':') && item[fieldName]);
  31. });
  32. refFields.forEach(function (fieldName) {
  33. item[fieldName] = item[fieldName].map(function (child) {
  34. if (1 === Object.keys(child).length && 'xlink' in child) {
  35. var pk = child['xlink'].split('.').pop();
  36. return _childCache[fieldName][pk];
  37. }
  38. return child;
  39. })
  40. })
  41. return item;
  42. })
  43. }
  44. var P5UI_AddItemToReport_SelectKrsPerson = createReactClass({
  45. // h(SelectKrsPerson, { krs: this.state.selected })
  46. // this.props.krs: {
  47. // "@primaryKey": "161323",
  48. // "A_kod": "80-299",
  49. // "A_kraj": "POLSKA",
  50. // "A_miejscowosc": "GDAŃSK",
  51. // "A_nrDomu": "54C",
  52. // "A_nrLokalu": null,
  53. // "A_poczta": "GDAŃSK",
  54. // "A_ulica": "BARNIEWICKA",
  55. // "ID": "161323",
  56. // "S_kraj": "POLSKA",
  57. // "S_miejscowosc": "GDAŃSK",
  58. // "S_wojewodztwo": "POMORSKIE",
  59. // "krs": "0000223476",
  60. // "nazwa": "BIALL Sp. z o.o.",
  61. // "nip": "6040018535",
  62. // "regon": "193106935",
  63. // "default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person": [
  64. // {
  65. // "@primaryKey": "747004",
  66. // "ID": "747004",
  67. // "imiona": "ADRIAN RYSZARD",
  68. // "nazwisko": "WIECZORKOWSKI",
  69. // "pesel": "75040301615"
  70. // },
  71. // {
  72. // "@primaryKey": "747003",
  73. // "ID": "747003",
  74. // "imiona": "EWA",
  75. // "nazwisko": "WIECZORKOWSKA",
  76. // "pesel": "75090401549"
  77. // },
  78. render: function () {
  79. var krsPresons = (this.props.krs && this.props.krs['default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person'])
  80. ? this.props.krs['default_db__x3A__BI_audit_KRS_person:BI_audit_KRS_person']
  81. : [];
  82. return (krsPresons.length > 0)
  83. ? h('ol', { style: { margin: '22px', textAlign: 'left' } }, krsPresons.map(function (person) {
  84. return h('li', {}, [
  85. (person.imiona || '') + ' ' + (person.nazwisko || '') + ', ' + (person.pesel || ''),
  86. h('button', {
  87. className: "btn btn-primary",
  88. style: { marginLeft: "8px", padding: "4px 8px", fontSize: "small" },
  89. onClick: function () { this.props.selectPerson(person) }.bind(this)
  90. }, "Dodaj osobę")
  91. ]);
  92. }))
  93. : null;
  94. }
  95. });
  96. var P5UI_AddItemToReport_BazaMenuItem = createReactClass({
  97. // this.props: { key: option.ID, baza: selectedBaza, data: option }
  98. render: function () {
  99. return h('div', {}, this.props.data.label);
  100. }
  101. });
  102. var P5UI_AddItemToReport = createReactClass({
  103. getInitialState: function () {
  104. return {
  105. baza: null,
  106. newItemBaza: null,
  107. isSearching: false,
  108. selected: null,
  109. };
  110. },
  111. _handleSelectBaza: function (baza) {
  112. this.setState({ baza: baza, newItemBaza: null });
  113. },
  114. _handleSelectNewItem: function (baza) {
  115. this.setState({ baza: null, newItemBaza: baza });
  116. },
  117. _handleSelected: function (selected) {
  118. this.setState({ selected: (selected.length > 0) ? selected[0] : null });
  119. },
  120. _handleSearch: function (query) {
  121. this.setState({ isSearching: true });
  122. var _setState = this.setState.bind(this);
  123. var baza = this.state.baza;
  124. var options= [];
  125. window.fetch(URL_FETCH_FROM_BAZA, {
  126. method: 'POST',
  127. header: {
  128. 'contentType': 'applications/json'
  129. },
  130. credentials: 'same-origin',
  131. body: JSON.stringify({
  132. baza: baza,
  133. query: query,
  134. })
  135. })
  136. .then(function(response) {
  137. return response.text();
  138. })
  139. .then(function(responseText) {
  140. try {
  141. return JSON.parse(responseText);
  142. } catch (e) {
  143. throw responseText;
  144. }
  145. })
  146. .then(function(result) {
  147. if (result.type == 'success') {
  148. // p5UI__notifyAjaxCallback(result);
  149. if (result.body && result.body.items && result.body.items.length > 0) {
  150. return result.body.items;
  151. } else {
  152. p5UI__notifyAjaxCallback({ type: 'warning', msg: "Brak danych pasujących do kryteriów wyszukiwania" });
  153. }
  154. }
  155. })
  156. .then(function(items) {
  157. DBG && console.log('items fetched:', items);
  158. _setState({ isSearching: false, options: convertXlinkToObjects(items) });
  159. })
  160. .catch(function(error) {
  161. DBG && console.log('request failed', error);
  162. })
  163. },
  164. componentWillUnmount: function () {
  165. DBG && console.log("DBG: conponentDidUnmount...");
  166. },
  167. render: function () {
  168. var bazaBtns = [];
  169. bazaBtns.push({ baza: "default_db/BI_audit_KRS/BI_audit_KRS", title: "KRS - Firmy", label: "KRS" });
  170. bazaBtns.push({ baza: "default_db/BI_audit_KRS_person/BI_audit_KRS_person", title: "KRS - Osoby", label: "KRS/p" });
  171. bazaBtns.push({ baza: "default_db/BI_audit_MSIG/BI_audit_MSIG", title: "MSIG - Firmy", label: "MSIG" });
  172. bazaBtns.push({ baza: "default_db/BI_audit_MSIG_person/BI_audit_MSIG_person", title: "KRS - Osoby", label: "MSIG/p" });
  173. bazaBtns.push({ baza: "default_db/BI_audit_taxpayer/BI_audit_taxpayer", title: "VAT - Aktywni płatnicy", label: "VATp" });
  174. bazaBtns.push({ baza: "default_db/BI_audit_CEIDG/BI_audit_CEIDG", title: "CEIDG", label: "CEIDG" });
  175. var newItemBtns = [];
  176. newItemBtns.push({ baza: "default_db/BI_audit_ENERGA_PRACOWNICY/BI_audit_ENERGA_PRACOWNICY", title: "Nowa osoba", label: "Nowa osoba" });
  177. newItemBtns.push({ baza: "default_db/BI_audit_ENERGA_RUM_KONTRAHENCI/BI_audit_ENERGA_RUM_KONTRAHENCI", title: "Nowy podmiot", label: "Nowy podmiot" });
  178. function generateBazaBtn(btn, opts) {
  179. return h('button', {
  180. title: btn.title,
  181. className: "btn btn-success" + (opts.selected ? " active" : ""),
  182. style: { margin: "3px" },
  183. onClick: function () {
  184. opts.onClick(btn.baza)
  185. },
  186. }, btn.label)
  187. }
  188. function generateNewItemBtn(btn, opts) {
  189. return h('button', {
  190. title: btn.title,
  191. className: "btn btn-success" + (opts.selected ? " active" : ""),
  192. style: { margin: "3px" },
  193. onClick: function () {
  194. opts.onClick(btn.baza)
  195. },
  196. }, btn.label)
  197. }
  198. var handleSelectBaza = this._handleSelectBaza.bind(this);
  199. var handleSelectNewItem = this._handleSelectNewItem.bind(this);
  200. var selectedBaza = this.state.baza;
  201. var selectedNewItem = this.state.newItemBaza;
  202. var selectedLabel = '';
  203. if (selectedBaza) {
  204. var selBazaBtn = bazaBtns.filter(function (btn) { return btn.baza === selectedBaza; })
  205. if (selBazaBtn) {
  206. selBazaBtn[0].title
  207. }
  208. }
  209. var handleSearch = this._handleSearch.bind(this);
  210. var handleSelected = this._handleSelected.bind(this);
  211. DBG && console.log('DBG: render this.state.options', this.state.options);
  212. return h('div', {}, [
  213. h('p', { style: { textAlign: "center" } }, "Wybierz bazę"),
  214. h('div', { style: { marginBottom: '22px' } },
  215. bazaBtns.map(function (btn) {
  216. return generateBazaBtn(btn, {
  217. onClick: handleSelectBaza,
  218. selected: (selectedBaza === btn.baza),
  219. });
  220. }).concat(
  221. newItemBtns.map(function (btn) {
  222. return generateNewItemBtn(btn, {
  223. onClick: handleSelectNewItem,
  224. selected: (selectedNewItem === btn.baza),
  225. });
  226. })
  227. )
  228. ),
  229. selectedBaza && h(AsyncTypeahead, {
  230. isLoading: this.state.isSearching,
  231. allowNew: false,
  232. multiple: false,
  233. options: this.state.options,
  234. labelKey: "label",
  235. // labelKey: function (option) {
  236. // return [
  237. // option.nazwa.replace('"', ''),
  238. // option.nip,
  239. // option.krs,
  240. // option.regon,
  241. // option.S_miejscowosc,
  242. // ].join(' ')
  243. // },
  244. minLength: 3,
  245. onSearch: handleSearch,
  246. placeholder: "Wyszukaj...",
  247. onChange: handleSelected,
  248. autoFocus: true,
  249. // filterBy: function (option, text) {
  250. // console.log('TODO: filterBy...', {option, text});
  251. // return true;
  252. // },
  253. renderMenuItemChildren: function (option, props) {
  254. return h(P5UI_AddItemToReport_BazaMenuItem, { key: option.ID, baza: selectedBaza, data: option });
  255. }
  256. }),
  257. selectedNewItem && h('div', { className: 'form-group' }, [
  258. h('input',{
  259. className:'form-control required',
  260. id:'personName',
  261. placeholder:'Imię'
  262. }),
  263. h('input',{
  264. className:'form-control required',
  265. id:'personSurname',
  266. placeholder:'Nazwisko'
  267. }),
  268. h('input',{
  269. className:'form-control required',
  270. id:'personNip',
  271. placeholder:'NIP'
  272. }),
  273. h('input',{
  274. className:'form-control required',
  275. id:'personPesel',
  276. placeholder:'personPesel'
  277. }),
  278. h('input',{
  279. className:'form-control required',
  280. id:'personRegon',
  281. placeholder:'REGON'
  282. })
  283. ]),
  284. (selectedBaza && this.state.selected) && h('div', { style: { margin: '22px' } }, [
  285. h('button', {
  286. className: "btn btn-success active",
  287. onClick: function () {
  288. this.props.onSelect(this.state.baza, this.state.selected);
  289. // ReactDOM.unmountComponentAtNode(document.getElementById('createPracownikAjax__searchBaza'));
  290. // swal.close()
  291. }
  292. }, "Dodaj firmę")
  293. ]),
  294. ('default_db/BI_audit_KRS/BI_audit_KRS' === this.state.baza && this.state.selected) && h(P5UI_AddItemToReport_SelectKrsPerson, {
  295. krs: this.state.selected,
  296. selectPerson: function (person) {
  297. this.props.onSelect("default_db/BI_audit_KRS_person/BI_audit_KRS_person", person);
  298. // ReactDOM.unmountComponentAtNode(document.getElementById('createPracownikAjax__searchBaza'));
  299. // swal.close()
  300. }
  301. }),
  302. (DBG && this.state.selected) && h('pre', { style: { textAlign: 'left' } }, JSON.stringify(this.state.selected, null, 2)),
  303. ])
  304. }
  305. });
  306. function getWindowWidth() {
  307. var w = window, d = document,
  308. e = d.documentElement,
  309. g = d.getElementsByTagName('body')[0];
  310. return w.innerWidth || e.clientWidth || g.clientWidth;
  311. }
  312. function createPracownikAjax(event) {
  313. // default_db/BI_audit_KRS/BI_audit_KRS
  314. // default_db/BI_audit_KRS_person/BI_audit_KRS_person
  315. // default_db/BI_audit_MSIG/BI_audit_MSIG
  316. // default_db/BI_audit_MSIG_person/BI_audit_MSIG_person
  317. // default_db/BI_audit_taxpayer/BI_audit_taxpayer
  318. // default_db/BI_audit_CEIDG/BI_audit_CEIDG
  319. // default_db/BI_audit_ENERGA_RUM_UMOWY/BI_audit_ENERGA_RUM_UMOWY
  320. // default_db/BI_audit_ENERGA_RUM_KONTRAHENCI/BI_audit_ENERGA_RUM_KONTRAHENCI
  321. // default_db/BI_audit_ENERGA_FAKTURY/BI_audit_ENERGA_FAKTURY
  322. swal({
  323. title: "Dodaj osobę lub podmiot",
  324. width: (getWindowWidth() * 0.8),
  325. html: '<div id="createPracownikAjax__searchBaza" style="padding:0 24px 24px 24px; min-height:400px"></div>',
  326. animation: false,
  327. showConfirmButton: false,
  328. showCancelButton: false,
  329. showCloseButton: true,
  330. onOpen: function () {
  331. ReactDOM.render(
  332. h(P5UI_AddItemToReport, {
  333. onSelect: function (baza, selected) {
  334. //insert do tabeli BI_audit_ENERGA_PRACOWNICY
  335. console.log('TODO: selected ', { baza, selected });
  336. }
  337. }),
  338. document.getElementById('createPracownikAjax__searchBaza')
  339. )
  340. }
  341. }).catch(function (err) {
  342. DBG && console.log('err', err)
  343. })
  344. }
  345. global.createPracownikAjax = createPracownikAjax;
  346. // module.exports = {
  347. // P5UI_AddItemToReport_BazaMenuItem,
  348. // P5UI_AddItemToReport,
  349. // createPracownikAjax
  350. // }