labStartProjectFilter

Отмечает в выпадающем списке запуска исследований технологии, которые уже исследуются вами

  1. // ==UserScript==
  2. // @name labStartProjectFilter
  3. // @description Отмечает в выпадающем списке запуска исследований технологии, которые уже исследуются вами
  4. // @description fix for new design 2014
  5. // @author cobra3125
  6. // @license MIT
  7. // @version 1.58
  8. // @include http*://virtonomica.*/*/main/company/view/*/unit_list
  9. // @include http*://virtonomica.*/*/window/unit/view/*/project_create
  10. // @include http*://virtonomica.*/*/main/management_action/*/investigations/technologies
  11. // @include http*://virtonomica.*/*/main/unit/view/*/investigation
  12. // @namespace https://greasyfork.org/users/2055
  13. // ==/UserScript==
  14.  
  15. // [1] Оборачиваем скрипт в замыкание, для кроссбраузерности (opera, ie)
  16. (function (window, undefined) {
  17.  
  18. // [2] нормализуем window
  19. var w;
  20.  
  21. if (typeof unsafeWindow != undefined) {
  22. w = unsafeWindow
  23. } else {
  24. w = window;
  25. }
  26.  
  27. // [3] не запускаем скрипт во фреймах
  28. // без этого условия скрипт будет запускаться несколько раз на странице с фреймами
  29. if (w.self != w.top) {
  30. return;
  31. }
  32.  
  33. // a function that loads jQuery and calls a callback function when jQuery has finished loading
  34. function addJQuery(callback) {
  35. var script = document.createElement("script");
  36. script.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js");
  37. script.addEventListener('load', function () {
  38. var script = document.createElement("script");
  39. script.textContent = "(" + callback.toString() + ")();";
  40. document.body.appendChild(script);
  41. }, false);
  42. document.body.appendChild(script);
  43. }
  44.  
  45.  
  46. // the guts of this userscript
  47. function main() {
  48. // [4] дополнительная проверка наряду с @include
  49. function getRealm(){
  50. var svHref = window.location.href;
  51. var matches = svHref.match(/\/(\w+)\/main\//);
  52. if (matches == null){
  53. matches = svHref.match(/\/(\w+)\/window\//);
  54. }
  55. return matches[1];
  56. }
  57. function getVal(spName){
  58. return JSON.parse(window.localStorage.getItem(getRealm() + '_' + spName));
  59. }
  60. function setVal(spName, pValue){
  61. window.localStorage.setItem(getRealm() + '_' + spName, JSON.stringify(pValue));
  62. }
  63. function MultDimArrToStr(anArray){
  64. var str = '';
  65. var len = anArray.length;
  66. for (var i = 0; i < len; ++i) {
  67. if(str != ''){
  68. str += '|';
  69. }
  70. str += anArray[i]['id'] + ';' + anArray[i]['name'] + ';' + anArray[i]['tech'];
  71. }
  72. //str == "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  73. return str;
  74. }
  75.  
  76. function StrToMultDimArr(str){
  77. if (str == null){
  78. return new Array();
  79. }
  80. //alert(str);
  81. //var str = "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  82. var tempArray = str.split('|');
  83. var finalArray = new Array();
  84. var len = tempArray.length;
  85. for (var i = 0; i < len; ++i) {
  86. var tmp = tempArray[i].split(';');
  87. finalArray.push({
  88. id: tmp[0],
  89. name: tmp[1],
  90. tech: tmp[2]
  91. });
  92. }
  93. return finalArray;
  94. }
  95. function inMultDimArray(value, anArray, attr){
  96. var theIndex = -1;
  97. var len = anArray.length;
  98. for (var i = 0; i < len; ++i) {
  99. if ((anArray[i][attr] + '').toUpperCase() == value.toUpperCase()) {
  100. theIndex = i;
  101. break;
  102. }
  103. }
  104. return theIndex;
  105. }
  106. function delByVal(anArray, attr, value){
  107. var result = new Array();
  108. var len = anArray.length;
  109. for (var i = 0; i < len; ++i) {
  110. if (anArray[i][attr] != value) result.push(anArray[i]);
  111. }
  112. return result;
  113. }
  114. function countInDimArray(value, anArray){
  115. var cnt = 0;
  116. var len = anArray.length;
  117. for (var i = 0; i < len; ++i) {
  118. if (anArray[i]['name'] == value) {
  119. ++cnt;
  120. }
  121. }
  122. return cnt;
  123. }
  124. function distinct(anArray) {
  125. var result = new Array();
  126. var len = anArray.length;
  127. for (var i = 0; i < len; ++i) {
  128. if (inMultDimArray(anArray[i]['id'], result, 'id') == -1) result.push(anArray[i]);
  129. }
  130. return result;
  131. }
  132. function sort(anArray){
  133. return anArray.sort(function(a, b) {
  134. var compA = a['name'].toUpperCase();
  135. var compB = b['name'].toUpperCase();
  136. var compTA = parseFloat(a['tech'].trim());
  137. var compTB = parseFloat(b['tech'].trim());
  138. return (compA < compB) ? -1 : (compA > compB) ? 1 : (compTA > compTB) ? -1 : (compTA < compTB) ? 1 : 0;
  139. });
  140. }
  141. // @include http*://virtonomica.*/*/main/unit/view/*/investigation
  142. //для определения изучаемой в открытой лабе технологии
  143. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/unit\/view\/\w+\/investigation/.test(window.location)) {
  144. var arr = StrToMultDimArr( getVal('labStartFilterArray') );
  145. if (!$.isArray(arr)){
  146. arr = new Array();
  147. }
  148. var id = (window.location + '').trim().split('/');
  149. id = id[id.length-2];
  150. $('td[class="title"]').each(function() {
  151. if (jQuery(this).text() == 'Текущее исследование'){
  152. var texhName = jQuery(this).parent().children('td').eq(1).children('a').eq(1).text();
  153. var texhLvl = jQuery(this).parent().parent().children('tr').eq(1).children('td').eq(1).children('span').text();
  154. arr = delByVal(arr, 'id', id);
  155. arr.push({
  156. id: id,
  157. name: texhName,
  158. tech: texhLvl
  159. });
  160. arr = sort(arr);
  161. arr = distinct(arr);
  162. setVal('labStartFilterArray', MultDimArrToStr(arr));
  163. }
  164. });
  165. }
  166. //для сбора списка уже изученных технологий
  167. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/management_action\/\d+\/investigations\/technologies[#]{0,1}/.test(window.location)) {
  168. var arr = new Array();
  169. $('div[class="tech_d"], div[class="tech_s"]').children('a').each(function() {
  170. var id = jQuery(this).attr('href').trim().split('/');
  171. id = id[id.length-1];
  172. arr.push({
  173. id: id,
  174. name: jQuery(this).parent().parent().parent().children('div[class="tech_title_cell"]').children('b').text().trim(),
  175. tech: jQuery(this).text().trim()
  176. });
  177. });
  178. arr = sort(arr);
  179. //alert(MultDimArrToStr(arr));
  180. arr = distinct(arr);
  181. //alert(MultDimArrToStr(arr));
  182. setVal('labSFTechDoneArray', MultDimArrToStr(arr));
  183. //console.log(arr);
  184. }
  185. //для добавления в выпадающий список отметок о текущих исследованиях
  186. if (/\w*virtonomic\w+\.\w+\/\w+\/window\/unit\/view\/\d+\/project_create/.test(window.location)) {
  187. var arr = StrToMultDimArr( getVal('labStartFilterArray') );
  188. var techArr = StrToMultDimArr( getVal('labSFTechDoneArray') );
  189. var str;
  190. var cnt;
  191. console.log(arr);
  192. console.log(techArr);
  193. if (arr){
  194. //select name = unit_type
  195. $('select[name="unit_type"]').children().each(function() {
  196. str = jQuery(this).text().trim();
  197. cnt = countInDimArray(str, arr);
  198. idx = inMultDimArray(str, techArr, 'name');
  199. if(idx != -1){
  200. str = str + ' (' + techArr[idx]['tech'] + ')';
  201. }
  202. if(cnt > 0){
  203. str = str + ' +' + cnt;
  204. jQuery(this).css("padding-left","20px");
  205. }
  206. if(cnt > 1){
  207. jQuery(this).css("color","orangered");
  208. }
  209. if(cnt > 0 || idx != -1){
  210. jQuery(this).text(str);
  211. }
  212. });
  213. }
  214. }
  215. //для сбора списка текущих исследований из списка подразделений
  216. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/company\/view\/\d+\/unit_list$/.test(window.location)) {
  217. //Ниже идёт непосредственно код скрипта
  218. //setVal('test','val');
  219. //alert(getVal('test'));
  220. //alert(getVal('labStartFilterArray'));
  221. var arr;
  222. //alert(arr);
  223. var currDate = (new Date()).getDate() + '';
  224. var lastSaveDate = getVal('labStartFilterDate');
  225. if (currDate == lastSaveDate){
  226. // arr = StrToMultDimArr( getVal('labStartFilterArray') );
  227. }else{
  228. setVal('labStartFilterDate', currDate);
  229. //alert('set date = ' + currDate);
  230. }
  231. if (!$.isArray(arr)){
  232. arr = new Array();
  233. //alert('reset');
  234. }
  235. //alert(arr.toString());
  236. var executed = 0;
  237. // $('td[class="u-c i-lab"]').parent().find('td[class="u-e"]').each(function () {
  238. $('td[class="info i-lab"]').parent().find('td[class="spec"]').each(function () {
  239. var str = jQuery(this).children().text();
  240. var tech = jQuery(this).children().children('b').eq(1).text();
  241. //var url = jQuery(this).parent().children('td[class="u-c i-lab"]').children('a').attr('href');
  242. var url = jQuery(this).parent().children('td[class="info i-lab"]').children('a').attr('href');
  243. var id = url.split('/');
  244. id = id[id.length-1];
  245. //alert(id);
  246. var substr = str.split(' ');
  247. substr[0] = '';
  248. substr[1] = '';
  249. str = substr.join(' ');
  250. //alert(tech);
  251. arr.push({
  252. id: id,
  253. name: str.trim(),
  254. tech: tech.trim()
  255. });
  256. executed = 1;
  257. /*var object2 = {
  258. id: id,
  259. name: str.trim()
  260. };*/
  261. /* merge object2 into arr, recursively */
  262. //$.extend(true, arr, object2);
  263. });
  264. if(1 == executed){
  265. arr = sort(arr);
  266. arr = distinct(arr);
  267. setVal('labStartFilterArray', MultDimArrToStr(arr));
  268. //alert(MultDimArrToStr(arr));
  269. //alert('saved');
  270. //console.log(arr);
  271. }
  272. }
  273. }
  274.  
  275. // load jQuery and execute the main function
  276. addJQuery(main);
  277. })(window);