labStartProjectFilter

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

目前为 2016-10-06 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name labStartProjectFilter
  3. // @description Отмечает в выпадающем списке запуска исследований технологии, которые уже исследуются вами
  4. // @description fix for new design 2014
  5. // @author cobra3125
  6. // @license MIT
  7. // @version 1.53
  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 getVal(spName){
  50. return JSON.parse(window.localStorage.getItem(spName));
  51. }
  52. function setVal(spName, pValue){
  53. window.localStorage.setItem(spName, JSON.stringify(pValue));
  54. }
  55. function MultDimArrToStr(anArray){
  56. var str = '';
  57. var len = anArray.length;
  58. for (var i = 0; i < len; ++i) {
  59. if(str != ''){
  60. str += '|';
  61. }
  62. str += anArray[i]['id'] + ';' + anArray[i]['name'] + ';' + anArray[i]['tech'];
  63. }
  64. //str == "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  65. return str;
  66. }
  67.  
  68. function StrToMultDimArr(str){
  69. //alert(str);
  70. //var str = "4224597;Тракторный завод|4224597;Тракторный завод|4224597;Тракторный завод";
  71. var tempArray = str.split('|');
  72. var finalArray = new Array();
  73. var len = tempArray.length;
  74. for (var i = 0; i < len; ++i) {
  75. var tmp = tempArray[i].split(';');
  76. finalArray.push({
  77. id: tmp[0],
  78. name: tmp[1],
  79. tech: tmp[2]
  80. });
  81. }
  82. return finalArray;
  83. }
  84. function inMultDimArray(value, anArray, attr){
  85. var theIndex = -1;
  86. var len = anArray.length;
  87. for (var i = 0; i < len; ++i) {
  88. if (anArray[i][attr].toUpperCase() == value.toUpperCase()) {
  89. theIndex = i;
  90. break;
  91. }
  92. }
  93. return theIndex;
  94. }
  95. function delByVal(anArray, attr, value){
  96. var result = new Array();
  97. var len = anArray.length;
  98. for (var i = 0; i < len; ++i) {
  99. if (anArray[i][attr] != value) result.push(anArray[i]);
  100. }
  101. return result;
  102. }
  103. function countInDimArray(value, anArray){
  104. var cnt = 0;
  105. var len = anArray.length;
  106. for (var i = 0; i < len; ++i) {
  107. if (anArray[i]['name'] == value) {
  108. ++cnt;
  109. }
  110. }
  111. return cnt;
  112. }
  113. function distinct(anArray) {
  114. var result = new Array();
  115. var len = anArray.length;
  116. for (var i = 0; i < len; ++i) {
  117. if (inMultDimArray(anArray[i]['id'], result, 'id') == -1) result.push(anArray[i]);
  118. }
  119. return result;
  120. }
  121. function sort(anArray){
  122. return anArray.sort(function(a, b) {
  123. var compA = a['name'].toUpperCase();
  124. var compB = b['name'].toUpperCase();
  125. var compTA = parseFloat(a['tech'].trim());
  126. var compTB = parseFloat(b['tech'].trim());
  127. return (compA < compB) ? -1 : (compA > compB) ? 1 : (compTA > compTB) ? -1 : (compTA < compTB) ? 1 : 0;
  128. });
  129. }
  130. // @include http*://virtonomica.*/*/main/unit/view/*/investigation
  131. //для определения изучаемой в открытой лабе технологии
  132. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/unit\/view\/\w+\/investigation/.test(window.location)) {
  133. var arr = StrToMultDimArr( getVal('labStartFilterArray') );
  134. if (!$.isArray(arr)){
  135. arr = new Array();
  136. }
  137. var id = (window.location + '').trim().split('/');
  138. id = id[id.length-2];
  139. $('td[class="title"]').each(function() {
  140. if (jQuery(this).text() == 'Текущее исследование'){
  141. var texhName = jQuery(this).parent().children('td').eq(1).children('a').eq(1).text();
  142. var texhLvl = jQuery(this).parent().parent().children('tr').eq(1).children('td').eq(1).children('span').text();
  143. arr = delByVal(arr, 'id', id);
  144. arr.push({
  145. id: id,
  146. name: texhName,
  147. tech: texhLvl
  148. });
  149. arr = sort(arr);
  150. arr = distinct(arr);
  151. setVal('labStartFilterArray', MultDimArrToStr(arr));
  152. }
  153. });
  154. }
  155. //для сбора списка уже изученных технологий
  156. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/management_action\/\d+\/investigations\/technologies[#]{0,1}/.test(window.location)) {
  157. var arr = new Array();
  158. $('div[class="tech_d"], div[class="tech_s"]').children('a').each(function() {
  159. var id = jQuery(this).attr('href').trim().split('/');
  160. id = id[id.length-1];
  161. arr.push({
  162. id: id,
  163. name: jQuery(this).parent().parent().parent().children('div[class="tech_title_cell"]').children('b').text().trim(),
  164. tech: jQuery(this).text().trim()
  165. });
  166. });
  167. arr = sort(arr);
  168. //alert(MultDimArrToStr(arr));
  169. arr = distinct(arr);
  170. //alert(MultDimArrToStr(arr));
  171. setVal('labSFTechDoneArray', MultDimArrToStr(arr));
  172. //console.log(arr);
  173. }
  174. //для добавления в выпадающий список отметок о текущих исследованиях
  175. if (/\w*virtonomic\w+\.\w+\/\w+\/window\/unit\/view\/\d+\/project_create/.test(window.location)) {
  176. var arr = StrToMultDimArr( getVal('labStartFilterArray') );
  177. var techArr = StrToMultDimArr( getVal('labSFTechDoneArray') );
  178. var str;
  179. var cnt;
  180. console.log(arr);
  181. console.log(techArr);
  182. if (arr){
  183. //select name = unit_type
  184. $('select[name="unit_type"]').children().each(function() {
  185. str = jQuery(this).text().trim();
  186. cnt = countInDimArray(str, arr);
  187. idx = inMultDimArray(str, techArr, 'name');
  188. if(idx != -1){
  189. str = str + ' (' + techArr[idx]['tech'] + ')';
  190. }
  191. if(cnt > 0){
  192. str = str + ' +' + cnt;
  193. jQuery(this).css("padding-left","20px");
  194. }
  195. if(cnt > 1){
  196. jQuery(this).css("color","orangered");
  197. }
  198. if(cnt > 0 || idx != -1){
  199. jQuery(this).text(str);
  200. }
  201. });
  202. }
  203. }
  204. //для сбора списка текущих исследований из списка подразделений
  205. if (/\w*virtonomic\w+\.\w+\/\w+\/main\/company\/view\/\d+\/unit_list$/.test(window.location)) {
  206. //Ниже идёт непосредственно код скрипта
  207. //setVal('test','val');
  208. //alert(getVal('test'));
  209. //alert(getVal('labStartFilterArray'));
  210. var arr;
  211. //alert(arr);
  212. var currDate = (new Date()).getDate() + '';
  213. var lastSaveDate = getVal('labStartFilterDate');
  214. if (currDate == lastSaveDate){
  215. // arr = StrToMultDimArr( getVal('labStartFilterArray') );
  216. }else{
  217. setVal('labStartFilterDate', currDate);
  218. //alert('set date = ' + currDate);
  219. }
  220. if (!$.isArray(arr)){
  221. arr = new Array();
  222. //alert('reset');
  223. }
  224. //alert(arr.toString());
  225. var executed = 0;
  226. // $('td[class="u-c i-lab"]').parent().find('td[class="u-e"]').each(function () {
  227. $('td[class="info i-lab"]').parent().find('td[class="spec"]').each(function () {
  228. var str = jQuery(this).children().text();
  229. var tech = jQuery(this).children().children('b').eq(1).text();
  230. //var url = jQuery(this).parent().children('td[class="u-c i-lab"]').children('a').attr('href');
  231. var url = jQuery(this).parent().children('td[class="info i-lab"]').children('a').attr('href');
  232. var id = url.split('/');
  233. id = id[id.length-1];
  234. //alert(id);
  235. var substr = str.split(' ');
  236. substr[0] = '';
  237. substr[1] = '';
  238. str = substr.join(' ');
  239. //alert(tech);
  240. arr.push({
  241. id: id,
  242. name: str.trim(),
  243. tech: tech.trim()
  244. });
  245. executed = 1;
  246. /*var object2 = {
  247. id: id,
  248. name: str.trim()
  249. };*/
  250. /* merge object2 into arr, recursively */
  251. //$.extend(true, arr, object2);
  252. });
  253. if(1 == executed){
  254. arr = sort(arr);
  255. arr = distinct(arr);
  256. setVal('labStartFilterArray', MultDimArrToStr(arr));
  257. //alert(MultDimArrToStr(arr));
  258. //alert('saved');
  259. //console.log(arr);
  260. }
  261. }
  262. }
  263.  
  264. // load jQuery and execute the main function
  265. addJQuery(main);
  266. })(window);