labStartProjectFilter

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

目前为 2017-05-31 提交的版本,查看 最新版本

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