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