Sidebar.js 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563
  1. (function()
  2. {
  3. /**
  4. * Download from following URL as TSV and convert using https://jgraph.github.io/drawio-tools/tools/convert.html:
  5. * https://docs.google.com/spreadsheets/d/1sAL1zn-UtmJtKPH4cLApGjRX-TRSJa5dYdfZ9NKYfRs
  6. * Maps package and stencil names to additional tags.
  7. */
  8. Sidebar.prototype.tagIndex = '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';
  9. /**
  10. * To update this, go to https://test.draw.io/?dev=1&test=1&drawdev=1&demo=1&createindex=1 and
  11. * copy the output of searchFileData from the browser console to the variable below.
  12. */
  13. Sidebar.prototype.searchIndexData = '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';
  14. /**
  15. * Overrides gear image URL.
  16. */
  17. Sidebar.prototype.gearImage = GRAPH_IMAGE_PATH + '/clipart/Gear_128x128.png';
  18. /**
  19. * Aliases for IDs in the libs parameter.
  20. */
  21. Sidebar.prototype.libAliases = {'aws2': 'aws3', 'gcp' : 'gcp2'};
  22. /**
  23. *
  24. */
  25. Sidebar.prototype.defaultEntries = 'general;uml;er;bpmn;flowchart;basic;arrows2';
  26. /**
  27. * Library definitions
  28. */
  29. Sidebar.prototype.signs = ['Animals', 'Food', 'Healthcare', 'Nature', 'People', 'Safety', 'Science', 'Sports', 'Tech', 'Transportation', 'Travel'];
  30. Sidebar.prototype.ibm = ['Analytics', 'Applications', 'Blockchain', 'Data', 'DevOps', 'Infrastructure', 'Management', 'Miscellaneous', 'Security', 'Social', 'Users', 'VPC', 'Boxes', 'Connectors'];
  31. Sidebar.prototype.allied_telesis = ['Buildings', 'Computer and Terminals', 'Media Converters', 'Security', 'Storage', 'Switch', 'Wireless'];
  32. Sidebar.prototype.gcp = ['Cards', 'Big Data', 'Compute', 'Developer Tools', 'Extras', 'Identity and Security', 'Machine Learning', 'Management Tools', 'Networking', 'Storage Databases'];
  33. Sidebar.prototype.gcp2 = ['Paths', 'Zones', 'Service Cards', 'Compute', 'API Management', 'Security', 'Data Analytics', 'Data Transfer', 'Cloud AI', 'Internet of Things', 'Databases', 'Storage', 'Management Tools', 'Networking', 'Developer Tools', 'Expanded Product Cards', 'User Device Cards', 'Product Cards', 'General Icons', 'Icons AI and Machine Learning', 'Icons Compute', 'Icons Serverless', 'Icons Data Analytics', 'Icons Operations', 'Icons Networking', 'Icons CI CD', 'Icons Integration Services', 'Icons API Management', 'Icons Internet of Things', 'Icons Databases', 'Icons Storage', 'Icons Security', 'Icons Migration', 'Icons Hybrid and Multi Cloud', 'Icons Open Source Icons'];
  34. Sidebar.prototype.gcpicons = ['AI and Machine Learning', 'API Management', 'Compute', 'Data Analytics', 'Databases', 'Developer Tools', 'Expanded Product Card Icons', 'Generic', 'Hybrid and Multi Cloud', 'Security', 'Internet of Things', 'Management Tools', 'Migration', 'Networking', 'Open Source Icons', 'Storage'];
  35. Sidebar.prototype.rack = ['General', 'APC', 'Cisco', 'Dell', 'F5', 'HP', 'HPE Aruba Gateways Controllers', 'HPE Aruba Security', 'HPE Aruba Switches', 'IBM', 'Oracle'];
  36. Sidebar.prototype.pids = ['Agitators', 'Apparatus Elements', 'Centrifuges', 'Compressors', 'Compressors ISO', 'Crushers Grinding',
  37. 'Driers', 'Engines', 'Feeders', 'Filters', 'Fittings', 'Flow Sensors', 'Heat Exchangers', 'Instruments', 'Misc',
  38. 'Mixers', 'Piping', 'Pumps', 'Pumps DIN', 'Pumps ISO', 'Separators', 'Shaping Machines', 'Valves', 'Vessels'];
  39. Sidebar.prototype.cisco = ['Buildings', 'Computers and Peripherals', 'Controllers and Modules', 'Directors', 'Hubs and Gateways', 'Misc',
  40. 'Modems and Phones', 'People', 'Routers', 'Security', 'Servers', 'Storage', 'Switches', 'Wireless'];
  41. Sidebar.prototype.cisco19 = ['LAN Switching', 'Routing WAN', 'Network Management', 'Data Center', 'Wireless LAN', 'Collaboration', 'Security Clouds Connectors', 'Endpoint Client Device Icons', 'DNA SD Access', 'SD WAN Viptela', 'ETA Stealthwatch', 'SAFE'];
  42. Sidebar.prototype.cisco_safe = ['Architecture', 'Business Icons', 'Capability', 'Design', 'IoT Things Icons', 'People Places Things Icons', 'Security Icons', 'Technology Icons', 'Threat'];
  43. Sidebar.prototype.sap = ['Annotations', 'Colored Connectors', 'Foundations', 'Integration Suite', 'App Dev Automation', 'Data Analytics', 'AI', 'Generic Icons', 'Component Groups', 'Components', 'Default Connectors', 'Default Shapes', 'Numbers', 'Products', 'Build Workzone', 'Semantic Accent', 'Texts'];
  44. Sidebar.prototype.sysml = ['Model Elements', 'Blocks', 'Ports and Flows', 'Constraint Blocks', 'Activities', 'Interactions', 'State Machines',
  45. 'Use Cases', 'Allocations', 'Requirements', 'Profiles', 'Stereotypes'];
  46. Sidebar.prototype.eip = ['Message Construction', 'Message Routing', 'Message Transformation', 'Messaging Channels', 'Messaging Endpoints',
  47. 'Messaging Systems', 'System Management'];
  48. Sidebar.prototype.gmdl = ['Bottom Navigation', 'Bottom Sheets', 'Buttons', 'Cards', 'Chips', 'Dialogs', 'Dividers', 'Grid Lists', 'Icons', 'Lists', 'Menus', 'Misc', 'Pickers',
  49. 'Selection Controls', 'Sliders', 'Steppers', 'Tabs', 'Text Fields'];
  50. Sidebar.prototype.aws2 = ['Analytics', 'Application Services', 'Compute', 'Database', 'Developer Tools', 'Enterprise Applications', 'Game Development', 'General', 'Internet of Things',
  51. 'Management Tools', 'Mobile Services', 'Networking', 'On-Demand Workforce', 'SDKs', 'Security and Identity', 'Storage and Content Delivery', 'Groups'];
  52. Sidebar.prototype.aws3 = ['Analytics', 'Application Services', 'Artificial Intelligence', 'Business Productivity', 'Compute', 'Contact Center', 'Database', 'Desktop and App Streaming', 'Developer Tools',
  53. 'Game Development', 'General', 'Groups', 'Internet of Things',
  54. 'Management Tools', 'Messaging', 'Migration', 'Mobile Services', 'Networking and Content Delivery', 'On Demand Workforce', 'SDKs', 'Security Identity and Compliance', 'Storage'];
  55. Sidebar.prototype.aws4b = ['Arrows', 'General Resources', 'Illustrations', 'Groups Light', 'Groups Dark', 'Analytics', 'Application Integration', 'AR VR', 'Cost Management', 'Business Productivity', 'Compute', 'Customer Engagement',
  56. 'Database', 'Desktop App Streaming', 'Developer Tools', 'Game Development', 'Internet of Things', 'IoT Things', 'IoT Resources', 'Machine Learning', 'Management Tools',
  57. 'Media Services', 'Migration', 'Mobile Services', 'Network Content Delivery', 'Security Identity Compliance', 'Storage'];
  58. Sidebar.prototype.aws4 = ['Arrows', 'General Resources', 'Illustrations', 'Groups', 'Analytics', 'Application Integration', 'AR VR', 'Cloud Financial Management', 'Blockchain',
  59. 'Business Applications', 'Compute', 'Contact Center', 'Containers', 'Customer Enablement', 'Customer Engagement',
  60. 'Database', 'Developer Tools', 'End User Computing', 'Front End Web Mobile', 'Game Tech', 'Internet of Things', 'IoT Things', 'IoT Resources', 'Machine Learning', 'Management Governance',
  61. 'Media Services', 'Migration Transfer', 'Network Content Delivery', 'Quantum Technologies', 'Robotics', 'Satellite', 'Serverless', 'Security Identity Compliance', 'Storage'];
  62. Sidebar.prototype.office = ['Clouds', 'Communications', 'Concepts', 'Databases', 'Devices', 'Security', 'Servers', 'Services', 'Sites', 'Users'];
  63. Sidebar.prototype.veeam = ['Data Center', 'Misc', 'Software', 'Storage', 'UsersStatus', 'VASComponents', 'Backup Replication', 'Products', 'VMs and Tape', '2D', '3D'];
  64. Sidebar.prototype.veeam2 = ['Auxiliary', 'Data Center', 'Features', 'General', 'Products and Components', 'Software', 'States', 'Storage', '3D'];
  65. Sidebar.prototype.archimate3 = ['Application', 'Business', 'Generic', 'Implementation and Migration', 'Motivation', 'Relationships', 'Strategy', 'Technology'];
  66. Sidebar.prototype.electrical = ['LogicGates', 'Resistors', 'Capacitors', 'Inductors', 'SwitchesRelays', 'Diodes', 'Sources', 'Transistors', 'Misc', 'Audio', 'PlcLadder', 'Abstract', 'Optical', 'VacuumTubes', 'Waveforms', 'Instruments', 'RotMech', 'Transmission'];
  67. /**
  68. * Description of custom libraries, see https://www.drawio.com/doc/faq/configure-diagram-editor
  69. */
  70. Sidebar.prototype.customEntries = null;
  71. /**
  72. * Specifies if custom libraries should appear after built-in libraries.
  73. * Default is false.
  74. */
  75. Sidebar.prototype.appendCustomLibraries = false;
  76. /**
  77. * Array of strings for the built-in libraries to be enabled in the more shapes dialog. Null means all,
  78. * empty array means none, possible keys are listed for the libs parameter at
  79. *
  80. * https://www.drawio.com/doc/faq/supported-url-parameters
  81. */
  82. Sidebar.prototype.enabledLibraries = null;
  83. /**
  84. * Maximum number of custom libraries to preload into the search index.
  85. */
  86. Sidebar.prototype.maxPreloadCount = 20;
  87. /**
  88. *
  89. */
  90. Sidebar.prototype.configuration = [{id: 'general', libs: ['general', 'misc', 'advanced']},
  91. {id: 'uml'}, {id: 'uml25'}, {id: 'search'}, {id: 'er'},
  92. {id: 'azure2', prefix: 'azure2', libs: ['AI Machine Learning', 'Analytics', 'App Services', 'Azure Ecosystem', 'Azure Stack', 'Azure VMware Solution', 'Blockchain', 'Compute', 'Containers', 'CXP', 'Databases', 'DevOps', 'General', 'Hybrid and Multicloud', 'Identity', 'Integration', 'Internet of Things', 'Intune', 'IoT', 'Management Governance', 'Menu', 'Migrate', 'Mixed Reality', 'Mobile', 'Monitor', 'Networking', 'Other', 'Preview', 'Security', 'Storage', 'Web']},
  93. {id: 'ios', prefix: 'ios', libs: [''/*prefix is library*/, '7icons', '7ui']},
  94. {id: 'android', prefix: 'android', libs: [''/*prefix is library*/]}, {id: 'aws3d'},
  95. {id: 'flowchart'}, {id: 'basic'}, {id: 'infographic'}, {id: 'arrows'}, {id: 'arrows2'}, {id: 'lean_mapping'}, {id: 'citrix'}, {id: 'azure'}, {id: 'network'}, {id: 'vvd'},
  96. {id: 'sitemap'}, {id:'c4'}, {id: 'dfd'}, {id: 'threatModeling'}, {id : 'kubernetes'}, {id : 'cisco19', prefix: 'cisco19', libs: Sidebar.prototype.cisco19},
  97. {id: 'mscae', prefix: 'mscae', libs: ['Companies', 'EnterpriseFlat', 'IntuneFlat', 'OMSFlat', 'System CenterFlat', 'AI and ML Service', 'Analytics Service', 'Compute Service', 'Compute Service VM', 'Container Service', 'Databases Service', 'DevOps Service', 'General Service', 'Identity Service', 'Integration Service', 'Internet of Things Service', 'Intune Service', 'Management and Governance Service', 'Management and Governance Service Media', 'Migrate Service', 'Mixed Reality Service', 'Mobile Service', 'Networking Service', 'Other Category Service', 'Security Service', 'Storage Service', 'Web Service']},
  98. {id: 'active_directory'},
  99. {id: 'bpmn2', prefix: 'bpmn2', libs: ['General', 'Tasks', 'Choreographies', 'Events', 'Gateways']},
  100. {id: 'clipart', prefix: null, libs: ['computer', 'finance', 'clipart', 'networking', 'people', 'telco']},
  101. {id: 'ibm', prefix: 'ibm', libs: Sidebar.prototype.ibm},
  102. {id: 'allied_telesis', prefix: 'allied_telesis', libs: Sidebar.prototype.allied_telesis},
  103. {id: 'cumulus', libs: ['cumulus']},
  104. {id: 'eip', prefix: 'eip', libs: Sidebar.prototype.eip},
  105. {id: 'mockups', prefix: 'mockup', libs: ['Buttons', 'Containers', 'Forms', 'Graphics', 'Markup', 'Misc', 'Navigation', 'Text']},
  106. {id: 'pid2', prefix: 'pid2', libs: ['Agitators', 'Apparatus Elements', 'Centrifuges', 'Compressors', 'Compressors ISO', 'Crushers Grinding',
  107. 'Driers', 'Engines', 'Feeders', 'Filters', 'Fittings', 'Flow Sensors', 'Heat Exchangers', 'Instruments', 'Misc',
  108. 'Mixers', 'Piping', 'Pumps', 'Pumps DIN', 'Pumps ISO', 'Separators', 'Shaping Machines', 'Valves', 'Vessels']},
  109. {id: 'salesforce', prefix: 'salesforce', libs: ['Components', 'Product', 'Platform', 'Industry']},
  110. {id: 'signs', prefix: 'signs', libs: Sidebar.prototype.signs},
  111. {id: 'gcp', prefix: 'gcp', libs: Sidebar.prototype.gcp},
  112. {id: 'gcp2', prefix: 'gcp2', libs: Sidebar.prototype.gcp2},
  113. {id: 'gcpicons', prefix: 'gcpicons', libs: Sidebar.prototype.gcpicons},
  114. {id: 'rack', prefix: 'rack', libs: Sidebar.prototype.rack},
  115. {id: 'electrical', prefix: 'electrical', libs: Sidebar.prototype.electrical},
  116. {id: 'aws2', prefix: 'aws2', libs: Sidebar.prototype.aws2},
  117. {id: 'aws3', prefix: 'aws3', libs: Sidebar.prototype.aws3},
  118. {id: 'aws4b', prefix: 'aws4b', libs: Sidebar.prototype.aws4b},
  119. {id: 'sap', prefix: 'sap', libs: Sidebar.prototype.sap},
  120. {id: 'aws4', prefix: 'aws4', libs: Sidebar.prototype.aws4},
  121. {id: 'pid', prefix: 'pid', libs: Sidebar.prototype.pids},
  122. {id: 'cisco', prefix: 'cisco', libs: Sidebar.prototype.cisco},
  123. {id: 'cisco_safe', prefix: 'cisco_safe', libs: Sidebar.prototype.cisco_safe},
  124. {id: 'office', prefix: 'office', libs: Sidebar.prototype.office},
  125. {id: 'veeam', prefix: 'veeam', libs: Sidebar.prototype.veeam},
  126. {id: 'veeam2', prefix: 'veeam2', libs: Sidebar.prototype.veeam2},
  127. {id: 'cabinets', libs: ['cabinets']},
  128. {id: 'floorplan', libs: ['floorplan']},
  129. {id: 'bootstrap', libs: ['bootstrap']},
  130. {id: 'atlassian', libs: ['atlassian']},
  131. {id: 'fluid_power', libs: ['fluid_power']},
  132. {id: 'gmdl', prefix: 'gmdl', libs: Sidebar.prototype.gmdl},
  133. {id: 'archimate3', prefix: 'archimate3', libs: Sidebar.prototype.archimate3},
  134. {id: 'archimate', libs: ['archimate']},
  135. {id: 'webicons', libs: ['webicons', 'weblogos']},
  136. {id: 'sysml', prefix: 'sysml', libs: Sidebar.prototype.sysml}];
  137. /**
  138. * Removes disabled libraries from search results.
  139. */
  140. var sidebarAddEntry = Sidebar.prototype.addEntry;
  141. Sidebar.prototype.addEntry = function(tags, fn)
  142. {
  143. if (this.currentSearchEntryLibrary != null && this.enabledLibraries != null &&
  144. mxUtils.indexOf(this.enabledLibraries, this.currentSearchEntryLibrary.id) < 0)
  145. {
  146. return fn;
  147. }
  148. else
  149. {
  150. return sidebarAddEntry.apply(this, arguments);
  151. }
  152. };
  153. /**
  154. * Refreshes scratchpad.
  155. */
  156. var sidebarRefresh = Sidebar.prototype.refresh;
  157. Sidebar.prototype.refresh = function()
  158. {
  159. var ui = this.editorUi;
  160. sidebarRefresh.apply(this, arguments);
  161. if (ui.scratchpad != null)
  162. {
  163. ui.loadLibrary(new StorageLibrary(ui,
  164. ui.scratchpad.getData(),
  165. '.scratchpad'));
  166. }
  167. };
  168. /**
  169. * Toggle palette.
  170. */
  171. Sidebar.prototype.togglePalettes = function(prefix, ids)
  172. {
  173. this.showPalettes(prefix, ids);
  174. };
  175. /**
  176. * Toggle palette.
  177. */
  178. Sidebar.prototype.togglePalette = function(id)
  179. {
  180. this.showPalette(id);
  181. };
  182. /**
  183. * Shows or hides palettes.
  184. */
  185. Sidebar.prototype.showPalettes = function(prefix, ids, visible)
  186. {
  187. for (var i = 0; i < ids.length; i++)
  188. {
  189. this.showPalette(prefix + ids[i], visible);
  190. }
  191. };
  192. /**
  193. * Shows or hides a palette.
  194. */
  195. Sidebar.prototype.showPalette = function(id, visible)
  196. {
  197. var elts = this.palettes[id];
  198. if (elts != null)
  199. {
  200. var vis = (visible != null) ? ((visible) ? 'block' : 'none') :
  201. (elts[0].style.display == 'none') ? 'block' : 'none';
  202. for (var i = 0; i < elts.length; i++)
  203. {
  204. elts[i].style.display = vis;
  205. }
  206. }
  207. return elts;
  208. };
  209. /**
  210. *
  211. */
  212. Sidebar.prototype.getConfigurationById = function(id)
  213. {
  214. for (var i = 0; i < this.configuration.length; i++)
  215. {
  216. if (this.configuration[i].id == id)
  217. {
  218. return this.configuration[i];
  219. }
  220. }
  221. if (this.customEntries != null)
  222. {
  223. for (var i = 0; i < this.customEntries.length; i++)
  224. {
  225. var section = this.customEntries[i] || {};
  226. for (var j = 0; section.entries != null && j < section.entries.length; j++)
  227. {
  228. var entry = section.entries[j];
  229. if (entry.id == id)
  230. {
  231. return {id: entry.id, libs: entry.libs};
  232. }
  233. }
  234. }
  235. }
  236. return null;
  237. };
  238. /**
  239. *
  240. */
  241. Sidebar.prototype.isEntryVisible = function(key)
  242. {
  243. if (key == '.scratchpad')
  244. {
  245. return this.editorUi.scratchpad != null;
  246. }
  247. else
  248. {
  249. var config = this.getConfigurationById(key);
  250. if (config != null)
  251. {
  252. var id = (config.libs != null) ? ((config.prefix || '') + config.libs[0]) : key;
  253. var elts = this.palettes[id];
  254. if (elts != null)
  255. {
  256. return elts[0].style.display != 'none';
  257. }
  258. }
  259. if (this.customEntries != null)
  260. {
  261. for (var i = 0; i < this.customEntries.length; i++)
  262. {
  263. var section = this.customEntries[i] || {};
  264. for (var j = 0; section.entries != null && j < section.entries.length; j++)
  265. {
  266. var entry = section.entries[j];
  267. if (entry.id == key)
  268. {
  269. if (entry.libs != null && entry.libs.length > 0)
  270. {
  271. var elts = this.palettes[entry.id + '.0'];
  272. if (elts != null)
  273. {
  274. return elts[0].style.display != 'none';
  275. }
  276. }
  277. break;
  278. }
  279. }
  280. }
  281. }
  282. return false;
  283. }
  284. };
  285. /**
  286. *
  287. */
  288. Sidebar.prototype.showEntries = function(entries, remember, force)
  289. {
  290. var all = [];
  291. if (remember)
  292. {
  293. mxSettings.setLibraries(entries);
  294. mxSettings.save();
  295. }
  296. if (entries != null && (force || entries.length > 0))
  297. {
  298. all.push(entries);
  299. }
  300. else
  301. {
  302. var done = false;
  303. if (urlParams['libs'] != null && urlParams['libs'].length > 0)
  304. {
  305. all.push(decodeURIComponent(urlParams['libs']));
  306. done = this.editorUi.getServiceName() == 'draw.io';
  307. }
  308. // Libs parameter overrides configuration for online app so that
  309. // links can be created to show just the specifies libraries
  310. if (!done)
  311. {
  312. if (mxSettings != null && mxSettings.settings != null)
  313. {
  314. all.push(mxSettings.getLibraries());
  315. }
  316. else
  317. {
  318. all.push(this.defaultEntries);
  319. }
  320. }
  321. }
  322. // Merges array of semicolon separated strings into a single array
  323. var temp = all.join(';').split(';');
  324. // Resolves aliases and creates lookup
  325. var visible = {};
  326. for (var i = 0; i < temp.length; i++)
  327. {
  328. visible[this.libAliases[temp[i]] || temp[i]] = true;
  329. }
  330. for (var i = 0; i < this.configuration.length; i++)
  331. {
  332. // Search has separate switch in Extras menu
  333. if (this.configuration[i].id != 'search')
  334. {
  335. this.showPalettes(this.configuration[i].prefix || '',
  336. this.configuration[i].libs || [this.configuration[i].id],
  337. visible[this.configuration[i].id] == true);
  338. }
  339. }
  340. if (this.customEntries != null)
  341. {
  342. for (var i = 0; i < this.customEntries.length; i++)
  343. {
  344. var section = this.customEntries[i] || {};
  345. for (var j = 0; section.entries != null && j < section.entries.length; j++)
  346. {
  347. var entry = section.entries[j];
  348. if (entry.libs != null && entry.libs.length > 0)
  349. {
  350. var libs = [];
  351. for (var k = 0; k < entry.libs.length; k++)
  352. {
  353. libs.push(entry.id + '.' + k);
  354. }
  355. this.showPalettes('', libs, visible[entry.id]);
  356. }
  357. }
  358. }
  359. }
  360. };
  361. /**
  362. * Overrides the sidebar init.
  363. */
  364. Sidebar.prototype.init = function()
  365. {
  366. this.updateEntries();
  367. // Uses search.xml index file instead (faster load times)
  368. this.addStencilsToIndex = false;
  369. // Contains additional tags for shapes
  370. this.shapetags = {};
  371. // Adds tags from compressed text file for improved searches
  372. if (this.tagIndex != null)
  373. {
  374. this.addTagIndex(Graph.decompress(this.tagIndex));
  375. this.tagIndex = null;
  376. }
  377. this.initPalettes();
  378. };
  379. /**
  380. * Defines all entries for the sidebar. This is used in the MoreShapes dialog. Create screenshots using the savesidebar URL parameter and
  381. * http://www.alderg.com/merge.html for creating a vertical stack of PNG images if multiple sidebars are part of an entry.
  382. */
  383. Sidebar.prototype.updateEntries = function()
  384. {
  385. var stdEntries = [{title: mxResources.get('general'), id: 'general', image: IMAGE_PATH + '/sidebar-general.png'},
  386. {title: mxResources.get('basic'), id: 'basic', image: IMAGE_PATH + '/sidebar-basic.png'},
  387. {title: mxResources.get('arrows'), id: 'arrows2', image: IMAGE_PATH + '/sidebar-arrows2.png'},
  388. {title: mxResources.get('clipart'), id: 'clipart', image: IMAGE_PATH + '/sidebar-clipart.png'},
  389. {title: mxResources.get('flowchart'), id: 'flowchart', image: IMAGE_PATH + '/sidebar-flowchart.png'}];
  390. if (Editor.currentTheme == 'simple' ||
  391. Editor.currentTheme == 'sketch' ||
  392. Editor.currentTheme == 'min')
  393. {
  394. stdEntries = [{title: mxResources.get('searchShapes'), id: 'search'},
  395. {title: mxResources.get('scratchpad'), id: '.scratchpad'}].
  396. concat(stdEntries);
  397. }
  398. // Get current year as yyyy
  399. var year = new Date().getFullYear();
  400. this.entries = [{title: mxResources.get('standard'), entries: stdEntries},
  401. {title: mxResources.get('software'),
  402. entries: [{title: 'Active Directory', id: 'active_directory', image: IMAGE_PATH + '/sidebar-active_directory.png'},
  403. {title: mxResources.get('android'), id: 'android', image: IMAGE_PATH + '/sidebar-android.png'},
  404. {title: 'Atlassian', id: 'atlassian', image: IMAGE_PATH + '/sidebar-atlassian.png'},
  405. {title: mxResources.get('bootstrap'), id: 'bootstrap', image: IMAGE_PATH + '/sidebar-bootstrap.png'},
  406. {title: 'C4', id: 'c4', image: IMAGE_PATH + '/sidebar-c4.png'},
  407. {title: 'Data Flow Diagram', id: 'dfd', image: IMAGE_PATH + '/sidebar-dfd.png'},
  408. {title: mxResources.get('entityRelation'), id: 'er', image: IMAGE_PATH + '/sidebar-er.png'},
  409. {title: mxResources.get('ios'), id: 'ios', image: IMAGE_PATH + '/sidebar-ios.png'},
  410. {title: mxResources.get('mockups'), id: 'mockups', image: IMAGE_PATH + '/sidebar-mockups.png'},
  411. {title: 'Sitemap', id: 'sitemap', image: IMAGE_PATH + '/sidebar-sitemap.png'},
  412. {title: 'Salesforce', id: 'salesforce', image: IMAGE_PATH + '/sidebar-salesforce.png'},
  413. {title: mxResources.get('uml') + ' 2.5', id: 'uml25', image: IMAGE_PATH + '/sidebar-uml25.png'},
  414. {title: mxResources.get('uml'), id: 'uml', image: IMAGE_PATH + '/sidebar-uml.png'}]},
  415. {title: mxResources.get('networking'),
  416. entries: [{title: 'Allied Telesis', id: 'allied_telesis', image: IMAGE_PATH + '/sidebar-allied_telesis.png'},
  417. {title: 'AWS17', id: 'aws3', image: IMAGE_PATH + '/sidebar-aws3.png'},
  418. {title: 'AWS18', id: 'aws4b', image: IMAGE_PATH + '/sidebar-aws4b.png'},
  419. {title: 'AWS ' + year, id: 'aws4', image: IMAGE_PATH + '/sidebar-aws4.png'},
  420. // TODO: Add isometric containers
  421. {title: mxResources.get('aws3d'), id: 'aws3d', image: IMAGE_PATH + '/sidebar-aws3d.png'},
  422. {title: mxResources.get('azure'), id: 'azure2', image: IMAGE_PATH + '/sidebar-azure.png'},
  423. {title: 'Cloud & Enterprise', id: 'mscae', image: IMAGE_PATH + '/sidebar-mscae.png'},
  424. {title: mxResources.get('cisco'), id: 'cisco', image: IMAGE_PATH + '/sidebar-cisco.png'},
  425. {title: 'Cisco19', id: 'cisco19', image: IMAGE_PATH + '/sidebar-cisco19.png'},
  426. {title: 'Cisco Safe', id: 'cisco_safe', image: IMAGE_PATH + '/sidebar-cisco_safe.png'},
  427. {title: 'Cumulus', id: 'cumulus', image: IMAGE_PATH + '/sidebar-cumulus.png'},
  428. {title: 'Citrix', id: 'citrix', image: IMAGE_PATH + '/sidebar-citrix.png'},
  429. {title: 'Google Cloud Platform', id: 'gcp2', image: IMAGE_PATH + '/sidebar-gcp2.png'},
  430. {title: 'GCP Icons', id: 'gcpicons', image: IMAGE_PATH + '/sidebar-gcpicons.png'},
  431. {title: 'IBM', id: 'ibm', image: IMAGE_PATH + '/sidebar-ibm.png'},
  432. {title: 'Kubernetes', id: 'kubernetes', image: IMAGE_PATH + '/sidebar-kubernetes.png'},
  433. {title: 'Network', id: 'network', image: IMAGE_PATH + '/sidebar-network.png'},
  434. {title: 'Office', id: 'office', image: IMAGE_PATH + '/sidebar-office.png'},
  435. {title: mxResources.get('rack'), id: 'rack', image: IMAGE_PATH + '/sidebar-rack.png'},
  436. {title: 'SAP', id: 'sap', image: IMAGE_PATH + '/sidebar-sap.png'},
  437. {title: 'Veeam', id: 'veeam2', image: IMAGE_PATH + '/sidebar-veeam.png'},
  438. {title: 'VMware', id: 'vvd', image: IMAGE_PATH + '/sidebar-vvd.png'}]},
  439. {title: mxResources.get('business'),
  440. entries: [{title: 'ArchiMate 3.2', id: 'archimate3', image: IMAGE_PATH + '/sidebar-archimate3.png'},
  441. {title: mxResources.get('archiMate21'), id: 'archimate', image: IMAGE_PATH + '/sidebar-archimate.png'},
  442. {title: mxResources.get('bpmn') + ' 2.0', id: 'bpmn2', image: IMAGE_PATH + '/sidebar-bpmn.png'},
  443. {title: mxResources.get('sysml'), id: 'sysml', image: IMAGE_PATH + '/sidebar-sysml.png'},
  444. {title: 'Value Stream Mapping', id: 'lean_mapping', image: IMAGE_PATH + '/sidebar-leanmapping.png'}]},
  445. {title: mxResources.get('other'),
  446. entries: [{title: mxResources.get('cabinets'), id: 'cabinets', image: IMAGE_PATH + '/sidebar-cabinets.png'},
  447. {title: 'Infographic', id: 'infographic', image: IMAGE_PATH + '/sidebar-infographic.png'},
  448. {title: mxResources.get('eip'), id: 'eip', image: IMAGE_PATH + '/sidebar-eip.png'},
  449. {title: mxResources.get('electrical'), id: 'electrical', image: IMAGE_PATH + '/sidebar-electrical.png'},
  450. {title: mxResources.get('floorplans'), id: 'floorplan', image: IMAGE_PATH + '/sidebar-floorplans.png'},
  451. {title: 'Fluid Power (ISO 1219)', id: 'fluid_power', image: IMAGE_PATH + '/sidebar-fluid_power.png'},
  452. {title: mxResources.get('gmdl'), id: 'gmdl', image: IMAGE_PATH + '/sidebar-gmdl.png'},
  453. {title: mxResources.get('procEng'), id: 'pid', image: IMAGE_PATH + '/sidebar-pid.png'},
  454. {title: 'Threat Modeling', id: 'threatModeling', image: IMAGE_PATH + '/sidebar-threatmodeling.png'},
  455. {title: 'Web Icons', id: 'webicons', image: IMAGE_PATH + '/sidebar-webIcons.png'},
  456. {title: mxResources.get('signs'), id: 'signs', image: IMAGE_PATH + '/sidebar-signs.png'}]}];
  457. };
  458. /**
  459. * Overridden to add image export via servlet
  460. */
  461. if (urlParams['savesidebar'] == '1')
  462. {
  463. Sidebar.prototype.addFoldingHandler = function(title, content, funct)
  464. {
  465. var initialized = false;
  466. // Avoids mixed content warning in IE6-8
  467. if (!mxClient.IS_IE || document.documentMode >= 8)
  468. {
  469. title.style.backgroundImage = (content.style.display == 'none') ?
  470. 'url(\'' + this.collapsedImage + '\')' : 'url(\'' + this.expandedImage + '\')';
  471. }
  472. title.style.backgroundRepeat = 'no-repeat';
  473. title.style.backgroundPosition = '0% 50%';
  474. var btn = document.createElement('button');
  475. btn.style.marginLeft = '4px';
  476. mxUtils.write(btn, 'Save');
  477. mxEvent.addListener(title, 'click', mxUtils.bind(this, function(evt)
  478. {
  479. if (mxEvent.getSource(evt).nodeName == 'BUTTON')
  480. {
  481. var svgs = content.getElementsByTagName('svg');
  482. var w = 6 * 68 + 2 * 12;
  483. var h = Math.ceil(svgs.length / 6) * 68 + 24 + 12;
  484. var root = Graph.createSvgNode(0, 0, w, h, '#ffffff');
  485. // Adds title
  486. var canvas = new mxSvgCanvas2D(root);
  487. canvas.setFontFamily(mxConstants.DEFAULT_FONTFAMILY);
  488. canvas.setFontStyle(mxConstants.FONT_BOLD);
  489. canvas.setFontColor('rgb(80, 80, 80)');
  490. canvas.setFontSize(14);
  491. // Extracts title text
  492. var spans = title.getElementsByTagName('span');
  493. if (spans.length > 0)
  494. {
  495. canvas.text(6, 0, 0, 0, mxUtils.getTextContent(spans[0]));
  496. }
  497. for (var i = 0; i < svgs.length; i++)
  498. {
  499. var svg = svgs[i];
  500. var clone = svg.cloneNode(true);
  501. clone.removeAttribute('style');
  502. clone.setAttribute('width', this.thumbWidth);
  503. clone.setAttribute('height', this.thumbHeight);
  504. clone.setAttribute('x', 12 + mxUtils.mod(i, 6) * 68);
  505. clone.setAttribute('y', 24 + Math.floor(i / 6) * 68);
  506. root.appendChild(clone);
  507. }
  508. this.editorUi.editor.convertImages(root, mxUtils.bind(this, function(body)
  509. {
  510. var canvas = document.createElement('canvas');
  511. canvas.width = w;
  512. canvas.height = h;
  513. var img = document.createElement('img');
  514. img.onload = mxUtils.bind(this, function()
  515. {
  516. var ctx = canvas.getContext('2d');
  517. ctx.drawImage(img, 0, 0)
  518. this.editorUi.saveCanvas(canvas, null, 'png');
  519. });
  520. var xml = Graph.xmlDeclaration + '\n' + Graph.svgDoctype + '\n' + mxUtils.getXml(root);
  521. img.src = Editor.createSvgDataUri(xml);
  522. }));
  523. return;
  524. }
  525. if (content.style.display == 'none')
  526. {
  527. if (!initialized)
  528. {
  529. initialized = true;
  530. if (funct != null)
  531. {
  532. if (btn.parentNode != null)
  533. {
  534. btn.parentNode.removeChild(btn);
  535. }
  536. // Wait cursor does not show up on Mac
  537. title.style.cursor = 'wait';
  538. var prev = title.innerHTML;
  539. title.innerHTML = mxResources.get('loading') + '...';
  540. window.setTimeout(function()
  541. {
  542. funct(content);
  543. title.style.cursor = '';
  544. title.innerHTML = prev;
  545. title.appendChild(btn);
  546. }, 0);
  547. }
  548. else
  549. {
  550. title.appendChild(btn);
  551. }
  552. }
  553. else
  554. {
  555. title.appendChild(btn);
  556. }
  557. title.style.backgroundImage = 'url(\'' + this.expandedImage + '\')';
  558. content.style.display = 'block';
  559. }
  560. else
  561. {
  562. title.style.backgroundImage = 'url(\'' + this.collapsedImage + '\')';
  563. content.style.display = 'none';
  564. if (btn.parentNode != null)
  565. {
  566. btn.parentNode.removeChild(btn);
  567. }
  568. }
  569. mxEvent.consume(evt);
  570. }));
  571. };
  572. };
  573. /**
  574. * Overridden to use shapetags to improve search results.
  575. */
  576. Sidebar.prototype.extractShapeStyle = function(style)
  577. {
  578. if (style != null && style.substring(0, 6) == 'shape=')
  579. {
  580. var semi = style.indexOf(';');
  581. if (semi < 0)
  582. {
  583. semi = style.length;
  584. }
  585. return style.substring(6, semi);
  586. }
  587. return null;
  588. };
  589. /**
  590. * Overridden to use shapetags to improve search results.
  591. */
  592. var sidebarGetTagsForStencil = Sidebar.prototype.getTagsForStencil;
  593. Sidebar.prototype.getTagsForStencil = function(pkg, stc, moreTags)
  594. {
  595. var tags = sidebarGetTagsForStencil.apply(this, arguments);
  596. // Adds tags from tags file
  597. if (this.shapetags != null)
  598. {
  599. pkg = pkg.toLowerCase();
  600. stc = stc.toLowerCase();
  601. if (this.shapetags[pkg] != null)
  602. {
  603. tags.push(this.shapetags[pkg]);
  604. }
  605. stc = pkg + '.' + stc;
  606. if (this.shapetags[stc] != null)
  607. {
  608. tags.push(this.shapetags[stc]);
  609. }
  610. }
  611. return tags;
  612. };
  613. /**
  614. * Overrides the sidebar init.
  615. */
  616. Sidebar.prototype.addTagIndex = function(text)
  617. {
  618. var lines = text.split('\n');
  619. for (var i = 0; i < lines.length; i++)
  620. {
  621. if (lines[i] != null)
  622. {
  623. var tags = lines[i].split('\t');
  624. if (tags.length > 1)
  625. {
  626. var key = tags[0].toLowerCase().replace(' ', '_');
  627. var value = mxUtils.trim(tags.slice(1, tags.length).join(' ').toLowerCase());
  628. if (value.length > 0)
  629. {
  630. this.shapetags[key] = value;
  631. }
  632. }
  633. }
  634. }
  635. };
  636. /**
  637. *
  638. */
  639. Sidebar.prototype.getUniqueLibraries = function(libs)
  640. {
  641. var lookup = {};
  642. var result = [];
  643. for (var i = 0; i < libs.length; i++)
  644. {
  645. var key = JSON.stringify(libs[i]);
  646. if (lookup[key] == null)
  647. {
  648. lookup[key] = true;
  649. result.push(libs[i]);
  650. }
  651. }
  652. return result;
  653. };
  654. /**
  655. *
  656. */
  657. Sidebar.prototype.openLibraries = function(libs)
  658. {
  659. libs = this.getUniqueLibraries(libs);
  660. var elts = null;
  661. for (var i = 0; i < libs.length; i++)
  662. {
  663. var config = this.getConfigurationById(libs[i].id);
  664. if (config != null)
  665. {
  666. var temp = this.openLibrary(config,
  667. libs[i].lib || libs[i].id);
  668. if (temp != null && elts == null)
  669. {
  670. elts = temp;
  671. }
  672. }
  673. }
  674. if (elts != null)
  675. {
  676. window.setTimeout(function()
  677. {
  678. elts[0].scrollIntoView({behavior: 'smooth'});
  679. }, 0);
  680. }
  681. };
  682. /**
  683. * Opens the given library.
  684. */
  685. Sidebar.prototype.openLibrary = function(config, lib)
  686. {
  687. this.showPalettes(config.prefix || '', config.libs || [config.id], true);
  688. var elts = this.showPalette(lib, true);
  689. if (elts != null && elts.length > 1 && elts[1].firstChild != null &&
  690. (elts[1].firstChild.firstChild == null ||
  691. elts[1].firstChild.style.display == 'none'))
  692. {
  693. elts[0].click();
  694. }
  695. return elts;
  696. };
  697. /**
  698. * Adds shape search UI.
  699. */
  700. Sidebar.prototype.showPopupMenuForEntry = function(elt, libs, evt)
  701. {
  702. if (libs != null && libs.length > 0)
  703. {
  704. var offset = mxUtils.getOffset(elt);
  705. this.editorUi.showPopupMenu(mxUtils.bind(this, function(menu, parent)
  706. {
  707. menu.addItem(mxResources.get('openLibrary'), null, mxUtils.bind(this, function()
  708. {
  709. this.openLibraries(libs);
  710. }));
  711. }), offset.x, offset.y + elt.offsetHeight, evt);
  712. mxEvent.consume(evt);
  713. }
  714. };
  715. /**
  716. * Overrides the sidebar init.
  717. */
  718. Sidebar.prototype.addSearchIndex = function(shapes)
  719. {
  720. if (shapes != null)
  721. {
  722. for (var i = 0; i < shapes.length; i++)
  723. {
  724. if (shapes[i].style != null)
  725. {
  726. var style = shapes[i].style;
  727. var shapeStyle = this.extractShapeStyle(style);
  728. if (shapeStyle != null)
  729. {
  730. var lastDot = shapeStyle.lastIndexOf('.');
  731. if (lastDot > 0)
  732. {
  733. var pkg = shapeStyle.substring(0, lastDot);
  734. var stc = shapeStyle.substring(lastDot + 1, shapeStyle.length);
  735. var tags = this.getTagsForStencil(pkg, stc, shapes[i].tags);
  736. // TODO: Use shapetags for programmatic stencils
  737. if (tags != null)
  738. {
  739. // Converts stencil name to lowercase
  740. var semi = style.indexOf(';');
  741. style = 'shape=' + pkg + '.' + stc.toLowerCase() + ';' +
  742. ((semi < 0) ? '' : style.substring(semi + 1));
  743. this.setCurrentSearchEntryLibrary(shapes[i].id, shapes[i].lib);
  744. this.createVertexTemplateEntry(style, parseInt(shapes[i].w),
  745. parseInt(shapes[i].h), '', stc.replace(/_/g, ' '),
  746. null, null, this.filterTags(tags.join(' ')));
  747. if (this.currentSearchEntryLibrary != null)
  748. {
  749. this.addLibForStyle(this.getKeyStyle(style),
  750. this.currentSearchEntryLibrary);
  751. }
  752. this.setCurrentSearchEntryLibrary();
  753. }
  754. }
  755. }
  756. }
  757. }
  758. }
  759. };
  760. /**
  761. * Overrides the sidebar init.
  762. */
  763. Sidebar.prototype.initPalettes = function()
  764. {
  765. var imgDir = GRAPH_IMAGE_PATH;
  766. var dir = STENCIL_PATH;
  767. var signs = this.signs;
  768. var rack = this.rack;
  769. var pids = this.pids;
  770. var cisco = this.cisco;
  771. var sysml = this.sysml;
  772. if (urlParams['createindex'] == '1')
  773. {
  774. this.createdSearchIndex = [];
  775. }
  776. this.addSearchPalette(true);
  777. if (!this.appendCustomLibraries)
  778. {
  779. this.addCustomEntries();
  780. }
  781. this.addGeneralPalette(this.customEntries == null);
  782. this.addMiscPalette(false);
  783. this.addAdvancedPalette(false);
  784. this.addBasicPalette();
  785. this.addStencilPalette('arrows', mxResources.get('arrows'), dir + '/arrows.xml',
  786. ';html=1;' + mxConstants.STYLE_VERTICAL_LABEL_POSITION + '=bottom;' + mxConstants.STYLE_VERTICAL_ALIGN + '=top;' + mxConstants.STYLE_STROKEWIDTH + '=2;strokeColor=#000000;',
  787. null, null, null, null, null, 'arrows');
  788. this.addArrows2Palette();
  789. this.setCurrentSearchEntryLibrary('clipart', 'computer');
  790. this.addImagePalette('computer', 'Clipart / Computer', imgDir
  791. + '/lib/clip_art/computers/', '_128x128.png', ['Antivirus',
  792. 'Data_Filtering', 'Database', 'Database_Add', 'Database_Minus',
  793. 'Database_Move_Stack', 'Database_Remove', 'Fujitsu_Tablet',
  794. 'Harddrive', 'IBM_Tablet', 'iMac', 'iPad', 'Laptop', 'MacBook',
  795. 'Mainframe', 'Monitor', 'Monitor_Tower',
  796. 'Monitor_Tower_Behind', 'Netbook', 'Network', 'Network_2',
  797. 'Printer', 'Printer_Commercial', 'Secure_System', 'Server',
  798. 'Server_Rack', 'Server_Rack_Empty', 'Server_Rack_Partial',
  799. 'Server_Tower', 'Software', 'Stylus', 'Touch', 'USB_Hub',
  800. 'Virtual_Application', 'Virtual_Machine', 'Virus',
  801. 'Workstation' ], [ 'Antivirus', 'Data Filtering', 'Database',
  802. 'Database Add', 'Database Minus', 'Database Move Stack',
  803. 'Database Remove', 'Fujitsu Tablet', 'Harddrive', 'IBMTablet',
  804. 'iMac', 'iPad', 'Laptop', 'MacBook', 'Mainframe', 'Monitor',
  805. 'Monitor Tower', 'Monitor Tower Behind', 'Netbook', 'Network',
  806. 'Network 2', 'Printer', 'Printer Commercial', 'Secure System',
  807. 'Server', 'Server Rack', 'Server Rack Empty', 'Server Rack Partial',
  808. 'Server Tower', 'Software', 'Stylus', 'Touch', 'USB Hub',
  809. 'Virtual Application', 'Virtual Machine', 'Virus', 'Workstation']);
  810. this.setCurrentSearchEntryLibrary('clipart', 'finance');
  811. this.addImagePalette('finance', 'Clipart / Finance', imgDir
  812. + '/lib/clip_art/finance/', '_128x128.png', [ 'Arrow_Down',
  813. 'Arrow_Up', 'Coins', 'Credit_Card', 'Dollar', 'Graph',
  814. 'Pie_Chart', 'Piggy_Bank', 'Safe', 'Shopping_Cart',
  815. 'Stock_Down', 'Stock_Up'], ['Arrow_Down', 'Arrow Up',
  816. 'Coins', 'Credit Card', 'Dollar', 'Graph', 'Pie Chart',
  817. 'Piggy Bank', 'Safe', 'Shopping Basket', 'Stock Down', 'Stock Up']);
  818. this.setCurrentSearchEntryLibrary('clipart', 'clipart');
  819. this.addImagePalette('clipart', 'Clipart / Various', imgDir
  820. + '/lib/clip_art/general/', '_128x128.png', [ 'Battery_0',
  821. 'Battery_100', 'Battery_50', 'Battery_75', 'Battery_allstates',
  822. 'Bluetooth', 'Earth_globe', 'Empty_Folder', 'Full_Folder',
  823. 'Gear', 'Keys', 'Lock', 'Mouse_Pointer', 'Plug', 'Ships_Wheel',
  824. 'Star', 'Tire' ], [ 'Battery 0%', 'Battery 100%', 'Battery 50%',
  825. 'Battery 75%', 'Battery', 'Bluetooth', 'Globe',
  826. 'Empty Folder', 'Full Folder', 'Gear', 'Keys', 'Lock', 'Mousepointer',
  827. 'Plug', 'Ships Wheel', 'Star', 'Tire']);
  828. this.setCurrentSearchEntryLibrary('clipart', 'networking');
  829. this.addImagePalette('networking', 'Clipart / Networking', imgDir
  830. + '/lib/clip_art/networking/', '_128x128.png', ['Bridge',
  831. 'Certificate', 'Certificate_Off', 'Cloud', 'Cloud_Computer',
  832. 'Cloud_Computer_Private', 'Cloud_Rack', 'Cloud_Rack_Private',
  833. 'Cloud_Server', 'Cloud_Server_Private', 'Cloud_Storage',
  834. 'Concentrator', 'Email', 'Firewall_02', 'Firewall',
  835. 'Firewall-page1', 'Ip_Camera', 'Modem',
  836. 'power_distribution_unit', 'Print_Server',
  837. 'Print_Server_Wireless', 'Repeater', 'Router', 'Router_Icon',
  838. 'Switch', 'UPS', 'Wireless_Router', 'Wireless_Router_N'],
  839. ['Bridge', 'Certificate', 'Certificate Off', 'Cloud', 'Cloud Computer',
  840. 'Cloud Computer Private', 'Cloud Rack', 'Cloud Rack Private',
  841. 'Cloud Server', 'Cloud Server Private', 'Cloud Storage',
  842. 'Concentrator', 'Email', 'Firewall 1', 'Firewall 2',
  843. 'Firewall', 'Camera', 'Modem',
  844. 'Power Distribution Unit', 'Print Server',
  845. 'Print Server Wireless', 'Repeater', 'Router', 'Router Icon',
  846. 'Switch', 'UPS', 'Wireless Router', 'Wireless Router N'],
  847. {'Wireless_Router': 'wireless router switch wap wifi access point wlan',
  848. 'Wireless_Router_N': 'wireless router switch wap wifi access point wlan',
  849. 'Router': 'router switch',
  850. 'Router_Icon': 'router switch'});
  851. this.setCurrentSearchEntryLibrary('clipart', 'people');
  852. this.addImagePalette('people', 'Clipart / People', imgDir
  853. + '/lib/clip_art/people/', '_128x128.png', ['Suit_Man',
  854. 'Suit_Man_Black', 'Suit_Man_Blue', 'Suit_Man_Green',
  855. 'Suit_Man_Green_Black', 'Suit_Woman', 'Suit_Woman_Black',
  856. 'Suit_Woman_Blue', 'Suit_Woman_Green',
  857. 'Suit_Woman_Green_Black', 'Construction_Worker_Man',
  858. 'Construction_Worker_Man_Black', 'Construction_Worker_Woman',
  859. 'Construction_Worker_Woman_Black', 'Doctor_Man',
  860. 'Doctor_Man_Black', 'Doctor_Woman', 'Doctor_Woman_Black',
  861. 'Farmer_Man', 'Farmer_Man_Black', 'Farmer_Woman',
  862. 'Farmer_Woman_Black', 'Nurse_Man', 'Nurse_Man_Black',
  863. 'Nurse_Woman',
  864. 'Nurse_Woman_Black',
  865. 'Military_Officer', 'Military_Officer_Black',
  866. 'Military_Officer_Woman', 'Military_Officer_Woman_Black',
  867. 'Pilot_Man', 'Pilot_Man_Black', 'Pilot_Woman',
  868. 'Pilot_Woman_Black', 'Scientist_Man', 'Scientist_Man_Black',
  869. 'Scientist_Woman', 'Scientist_Woman_Black', 'Security_Man',
  870. 'Security_Man_Black', 'Security_Woman', 'Security_Woman_Black',
  871. 'Tech_Man', 'Tech_Man_Black',
  872. 'Telesales_Man', 'Telesales_Man_Black', 'Telesales_Woman',
  873. 'Telesales_Woman_Black', 'Waiter', 'Waiter_Black',
  874. 'Waiter_Woman', 'Waiter_Woman_Black', 'Worker_Black',
  875. 'Worker_Man', 'Worker_Woman', 'Worker_Woman_Black']);
  876. this.setCurrentSearchEntryLibrary('clipart', 'telco');
  877. this.addImagePalette('telco', 'Clipart / Telecommunication', imgDir
  878. + '/lib/clip_art/telecommunication/', '_128x128.png', [
  879. 'BlackBerry', 'Cellphone', 'HTC_smartphone', 'iPhone',
  880. 'Palm_Treo', 'Signal_tower_off', 'Signal_tower_on' ],
  881. ['BlackBerry', 'Cellphone', 'HTC smartphone', 'iPhone',
  882. 'Palm Treo', 'Signaltower off', 'Signaltower on']);
  883. this.setCurrentSearchEntryLibrary();
  884. this.addFlowchartPalette();
  885. this.addActiveDirectoryPalette();
  886. this.addAndroidPalette();
  887. this.addAtlassianPalette();
  888. this.addBootstrapPalette();
  889. this.addDFDPalette();
  890. this.addErPalette();
  891. this.addIos7Palette();
  892. this.addIosPalette();
  893. this.addKubernetesPalette();
  894. this.addMockupPalette();
  895. this.addSitemapPalette();
  896. this.addSalesforcePalette();
  897. this.addUml25Palette();
  898. this.addUmlPalette(false);
  899. this.addAlliedTelesisPalette();
  900. this.addAWS3Palette();
  901. this.addAWS4bPalette();
  902. this.addAWS4Palette();
  903. this.addAWS3DPalette();
  904. this.addAzurePalette();
  905. this.addAzure2Palette();
  906. this.addMSCAEPalette();
  907. this.addC4Palette();
  908. this.addCiscoPalette(cisco, dir);
  909. this.addCisco19Palette();
  910. this.addCiscoSafePalette();
  911. this.addCumulusPalette();
  912. this.addCitrixPalette();
  913. this.addGCP2Palette();
  914. this.addGCPIconsPalette();
  915. this.addIBMPalette();
  916. this.addNetworkPalette();
  917. this.addSAPPalette();
  918. this.addOfficePalette();
  919. this.addRackPalette(rack, dir);
  920. this.addVeeamPalette();
  921. this.addVeeam2Palette();
  922. this.addVVDPalette();
  923. this.addArchimate3Palette();
  924. this.addArchiMatePalette();
  925. this.addBpmn2Palette();
  926. this.addSysMLPalette(sysml, dir);
  927. this.addLeanMappingPalette();
  928. this.addCabinetsPalette();
  929. this.addInfographicPalette();
  930. this.addEipPalette();
  931. this.addElectricalPalette();
  932. this.addFloorplanPalette();
  933. this.addFluidPowerPalette();
  934. this.addGMDLPalette();
  935. this.addPidPalette(pids, dir);
  936. this.addThreatModelingPalette();
  937. this.addWebIconsPalette();
  938. this.addWebLogosPalette();
  939. this.addSignsPalette(signs, dir);
  940. if (this.appendCustomLibraries)
  941. {
  942. this.addCustomEntries();
  943. }
  944. // LATER: Check if conflicts with restore libs after loading file
  945. this.showEntries();
  946. if (this.createdSearchIndex != null)
  947. {
  948. console.log('searchFileData', Graph.compress(JSON.stringify(this.createdSearchIndex)));
  949. }
  950. };
  951. /**
  952. * Adds custom entries to the sidebar.
  953. */
  954. Sidebar.prototype.addCustomEntries = function()
  955. {
  956. if (this.customEntries != null)
  957. {
  958. var preloadCount = 0;
  959. for (var i = 0; i < this.customEntries.length; i++)
  960. {
  961. var section = this.customEntries[i] || {};
  962. for (var j = 0; section.entries != null && j < section.entries.length; j++)
  963. {
  964. var entry = section.entries[j];
  965. for (var k = 0; k < entry.libs.length; k++)
  966. {
  967. (mxUtils.bind(this, function(lib)
  968. {
  969. var data = null;
  970. var error = null;
  971. var content = null;
  972. var title = null;
  973. var showError = mxUtils.bind(this, function(err, c)
  974. {
  975. var div = document.createElement('span');
  976. div.style.paddingBottom = '6px';
  977. div.style.paddingTop = '6px';
  978. div.style.fontSize = '11px';
  979. mxUtils.write(div, err);
  980. c.innerHTML = '<img align="top" src="' + mxGraph.prototype.warningImage.src + '"/> ';
  981. c.appendChild(div);
  982. });
  983. var barrier = mxUtils.bind(this, function()
  984. {
  985. if (content != null && title != null)
  986. {
  987. if (error != null)
  988. {
  989. content.style.display = 'block';
  990. title.innerText = '';
  991. mxUtils.write(title, this.editorUi.getResource(lib.title));
  992. showError(error, content);
  993. }
  994. else if (data != null)
  995. {
  996. this.editorUi.addLibraryEntries(data, content);
  997. content.style.display = 'block';
  998. title.innerText = '';
  999. mxUtils.write(title, this.editorUi.getResource(lib.title));
  1000. }
  1001. else
  1002. {
  1003. content.style.display = 'none';
  1004. title.innerText = '';
  1005. mxUtils.write(title, mxResources.get('loading') + '...');
  1006. }
  1007. }
  1008. });
  1009. if (lib.data == null && lib.url != null && (!lib.preload && preloadCount >= this.maxPreloadCount))
  1010. {
  1011. this.addPalette(entry.id + '.' + k, this.editorUi.getResource(lib.title),
  1012. false, mxUtils.bind(this, function(content, title)
  1013. {
  1014. var dataLoaded = mxUtils.bind(this, function(images)
  1015. {
  1016. this.setCurrentSearchEntryLibrary(entry.id, entry.id + '.' + k);
  1017. this.addEntries(images);
  1018. this.setCurrentSearchEntryLibrary();
  1019. this.editorUi.addLibraryEntries(images, content);
  1020. });
  1021. content.style.display = 'none';
  1022. title.innerText = '';
  1023. mxUtils.write(title, mxResources.get('loading') + '...');
  1024. var url = lib.url;
  1025. if (!this.editorUi.editor.isCorsEnabledForUrl(url))
  1026. {
  1027. url = PROXY_URL + '?url=' + encodeURIComponent(url);
  1028. }
  1029. this.editorUi.editor.loadUrl(url, mxUtils.bind(this, function(data)
  1030. {
  1031. content.style.display = 'block';
  1032. title.innerText = '';
  1033. mxUtils.write(title, this.editorUi.getResource(lib.title));
  1034. try
  1035. {
  1036. var doc = mxUtils.parseXml(data);
  1037. if (doc.documentElement.nodeName == 'mxlibrary')
  1038. {
  1039. var images = JSON.parse(mxUtils.getTextContent(doc.documentElement));
  1040. dataLoaded(images);
  1041. }
  1042. else
  1043. {
  1044. showError(mxResources.get('notALibraryFile'), content);
  1045. }
  1046. }
  1047. catch (e)
  1048. {
  1049. showError(mxResources.get('error') + ': ' + e.message, content);
  1050. }
  1051. }));
  1052. }));
  1053. }
  1054. else
  1055. {
  1056. this.addPalette(entry.id + '.' + k, this.editorUi.getResource(lib.title),
  1057. false, mxUtils.bind(this, function(c, t)
  1058. {
  1059. content = c;
  1060. title = t;
  1061. barrier();
  1062. }));
  1063. if (lib.data != null)
  1064. {
  1065. this.setCurrentSearchEntryLibrary(entry.id, entry.id + '.' + k);
  1066. this.addEntries(lib.data);
  1067. this.setCurrentSearchEntryLibrary();
  1068. data = lib.data;
  1069. barrier();
  1070. }
  1071. else if (lib.url != null)
  1072. {
  1073. preloadCount++;
  1074. var url = lib.url;
  1075. if (!this.editorUi.editor.isCorsEnabledForUrl(url))
  1076. {
  1077. url = PROXY_URL + '?url=' + encodeURIComponent(url);
  1078. }
  1079. this.editorUi.editor.loadUrl(url, mxUtils.bind(this, function(temp)
  1080. {
  1081. try
  1082. {
  1083. var doc = mxUtils.parseXml(temp);
  1084. if (doc.documentElement.nodeName == 'mxlibrary')
  1085. {
  1086. data = JSON.parse(mxUtils.getTextContent(doc.documentElement));
  1087. this.addEntries(data);
  1088. barrier();
  1089. }
  1090. else
  1091. {
  1092. error = mxResources.get('notALibraryFile');
  1093. barrier();
  1094. }
  1095. }
  1096. catch (e)
  1097. {
  1098. error = mxResources.get('error') + ': ' + e.message;
  1099. barrier();
  1100. }
  1101. }), mxUtils.bind(this, function(e)
  1102. {
  1103. error = (e != null && e.message != null) ? e.message : e;
  1104. barrier();
  1105. }));
  1106. }
  1107. else
  1108. {
  1109. error = mxResources.get('invalidInput');
  1110. barrier();
  1111. }
  1112. }
  1113. }))(entry.libs[k]);
  1114. }
  1115. }
  1116. }
  1117. }
  1118. };
  1119. /**
  1120. * Overridden to manually create search index for stencil files which are not pre-loaded
  1121. * and no entries are created programmatically.
  1122. */
  1123. if (urlParams['createindex'] == '1')
  1124. {
  1125. var sidebarAddStencilPalette = Sidebar.prototype.addStencilPalette;
  1126. Sidebar.prototype.addStencilPalette = function(id, title, stencilFile, style, ignore, onInit, scale, tags, customFns, groupId)
  1127. {
  1128. sidebarAddStencilPalette.apply(this, arguments);
  1129. scale = (scale != null) ? scale : 1;
  1130. // Used for creating index
  1131. mxStencilRegistry.loadStencilSet(stencilFile, mxUtils.bind(this, function(packageName, stencilName, displayName, w, h)
  1132. {
  1133. if (this.createdSearchIndex != null && ignore == null || mxUtils.indexOf(ignore, stencilName) < 0)
  1134. {
  1135. var entry = {style: 'shape=' + packageName + stencilName + style,
  1136. w: Math.round(w * scale), h: Math.round(h * scale)};
  1137. var tmpTags = (tags != null) ? tags[stencilName] : null;
  1138. if (tmpTags != null)
  1139. {
  1140. entry.tags = tmpTags;
  1141. }
  1142. if (groupId != null)
  1143. {
  1144. entry.id = groupId;
  1145. entry.lib = id;
  1146. }
  1147. this.createdSearchIndex.push(entry);
  1148. }
  1149. }), true);
  1150. };
  1151. }
  1152. /**
  1153. * Extracs icons from the search result.
  1154. */
  1155. Sidebar.prototype.extractIconsFromResponse = function(res, results)
  1156. {
  1157. for (var i = 0; i < res.icons.length; i++)
  1158. {
  1159. var sizes = res.icons[i].raster_sizes;
  1160. var index = sizes.length - 1;
  1161. while (index > 0 && sizes[index].size > 128)
  1162. {
  1163. index--;
  1164. }
  1165. var size = sizes[index].size;
  1166. var url = sizes[index].formats[0].preview_url;
  1167. if (size != null && url != null)
  1168. {
  1169. (mxUtils.bind(this, function(s, u)
  1170. {
  1171. results.push(mxUtils.bind(this, function()
  1172. {
  1173. return this.createVertexTemplate('shape=image;html=1;verticalAlign=top;' +
  1174. 'verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;imageAspect=0;' +
  1175. 'aspect=fixed;image=' + u, s, s, '');
  1176. }));
  1177. }))(size, url);
  1178. }
  1179. }
  1180. };
  1181. /**
  1182. * Returns true if the search index was loaded.
  1183. */
  1184. Sidebar.prototype.isSearchIndexLoaded = function()
  1185. {
  1186. return this.searchIndexData == null;
  1187. }
  1188. /**
  1189. * Lazy-loading for search index.
  1190. */
  1191. Sidebar.prototype.updateSearchIndex = function()
  1192. {
  1193. if (this.searchIndexData != null)
  1194. {
  1195. this.addSearchIndex(JSON.parse(Graph.decompress(this.searchIndexData)));
  1196. this.searchIndexData = null;
  1197. }
  1198. };
  1199. /**
  1200. * Adds server icon results to local search results
  1201. */
  1202. var sidebarSearchEntries = Sidebar.prototype.searchEntries;
  1203. Sidebar.prototype.searchEntries = function(searchTerms, count, page, success, error, searchClosedLibraries)
  1204. {
  1205. var succ = success;
  1206. this.updateSearchIndex();
  1207. if (ICONSEARCH_PATH != null && searchClosedLibraries)
  1208. {
  1209. success = mxUtils.bind(this, function(results, len, more, terms)
  1210. {
  1211. if (!this.editorUi.isOffline() && results.length <= count / 4)
  1212. {
  1213. var pg = page - Math.ceil((len - count / 4) / count);
  1214. mxUtils.get(ICONSEARCH_PATH + '?q=' + encodeURIComponent(searchTerms) +
  1215. '&p=' + pg + '&c=' + count, mxUtils.bind(this, function(req)
  1216. {
  1217. try
  1218. {
  1219. // Ignore response if nothing or error returned
  1220. if (req.getStatus() >= 200 && req.getStatus() <= 299 &&
  1221. req.getText() != null && req.getText().length > 0)
  1222. {
  1223. try
  1224. {
  1225. var res = JSON.parse(req.getText());
  1226. if (res == null || res.icons == null)
  1227. {
  1228. succ(results, len, false, terms);
  1229. this.editorUi.handleError(res);
  1230. }
  1231. else
  1232. {
  1233. this.extractIconsFromResponse(res, results);
  1234. succ(results, (page - 1) * count + results.length, res.icons.length == count, terms);
  1235. }
  1236. }
  1237. catch (e)
  1238. {
  1239. succ(results, len, false, terms);
  1240. this.editorUi.handleError(e);
  1241. }
  1242. }
  1243. else
  1244. {
  1245. succ(results, len, false, terms);
  1246. }
  1247. }
  1248. catch (e)
  1249. {
  1250. succ(results, len, false, terms);
  1251. this.editorUi.handleError(e);
  1252. }
  1253. },
  1254. function()
  1255. {
  1256. succ(results, len, false, terms);
  1257. }));
  1258. }
  1259. else
  1260. {
  1261. succ(results, len, more || !this.editorUi.isOffline(), terms);
  1262. }
  1263. });
  1264. }
  1265. sidebarSearchEntries.apply(this, arguments);
  1266. };
  1267. // Fixes sidebar tooltips (previews)
  1268. var sidebarGetTooltipOffset = Sidebar.prototype.getTooltipOffset;
  1269. Sidebar.prototype.getTooltipOffset = function(elt, bounds)
  1270. {
  1271. if (Editor.currentTheme == 'simple' ||
  1272. Editor.currentTheme == 'sketch' ||
  1273. Editor.currentTheme == 'min')
  1274. {
  1275. if (mxUtils.isAncestorNode(this.editorUi.sketchPickerMenuElt, elt))
  1276. {
  1277. var off = mxUtils.getOffset(elt);
  1278. if (Editor.currentTheme == 'simple')
  1279. {
  1280. off.x += (elt.offsetWidth - bounds.width) / 2 - 14;
  1281. off.y = elt.parentNode.offsetHeight - 2;
  1282. }
  1283. else
  1284. {
  1285. off.x = elt.parentNode.offsetLeft + elt.parentNode.offsetWidth + 2;
  1286. off.y += (elt.offsetHeight - bounds.height) / 2;
  1287. }
  1288. return new mxPoint(Math.max(0, off.x), Math.max(0, off.y));
  1289. }
  1290. else if (this.editorUi.sidebarWindow != null)
  1291. {
  1292. var off = mxUtils.getOffset(this.editorUi.sidebarWindow.window.div);
  1293. off.x += this.editorUi.sidebarWindow.window.div.offsetWidth + 2;
  1294. off.y += elt.offsetTop + (elt.offsetHeight - bounds.height) / 2;
  1295. if (elt.offsetParent != null)
  1296. {
  1297. off.y -= elt.offsetParent.scrollTop;
  1298. }
  1299. return new mxPoint(Math.max(0, off.x), Math.max(0, off.y));
  1300. }
  1301. }
  1302. return sidebarGetTooltipOffset.apply(this, arguments);
  1303. };
  1304. /**
  1305. * Adds a click handler for inserting the cell as target for dangling edge.
  1306. */
  1307. var sidebarItemClicked = Sidebar.prototype.itemClicked;
  1308. Sidebar.prototype.itemClicked = function(cells, ds, evt)
  1309. {
  1310. var graph = this.editorUi.editor.graph;
  1311. var handled = false;
  1312. if (cells != null && graph.getSelectionCount() == 1 && graph.getModel().isVertex(cells[0]))
  1313. {
  1314. var target = graph.cloneCell(cells[0]);
  1315. // Inserts cell as target of selected edge if not connected
  1316. if (graph.getModel().isEdge(graph.getSelectionCell()) && graph.getModel().getTerminal(graph.getSelectionCell(), false) == null &&
  1317. graph.getModel().isVertex(target))
  1318. {
  1319. graph.getModel().beginUpdate();
  1320. try
  1321. {
  1322. var edgeState = graph.view.getState(graph.getSelectionCell());
  1323. if (edgeState != null)
  1324. {
  1325. var tr = graph.view.translate;
  1326. var s = graph.view.scale;
  1327. var pt = edgeState.absolutePoints[edgeState.absolutePoints.length - 1];
  1328. target.geometry.x = pt.x / s - tr.x - target.geometry.width / 2;
  1329. target.geometry.y = pt.y / s - tr.y - target.geometry.height / 2;
  1330. }
  1331. graph.addCell(target);
  1332. graph.getModel().setTerminal(graph.getSelectionCell(), target, false);
  1333. if (evt == null || !mxEvent.isShiftDown(evt))
  1334. {
  1335. graph.fireEvent(new mxEventObject('cellsInserted', 'cells', [target]));
  1336. }
  1337. }
  1338. catch (e)
  1339. {
  1340. this.editorUi.handleError(e);
  1341. }
  1342. finally
  1343. {
  1344. graph.getModel().endUpdate();
  1345. }
  1346. graph.scrollCellToVisible(target);
  1347. graph.setSelectionCell(target);
  1348. handled = true;
  1349. }
  1350. }
  1351. if (!handled)
  1352. {
  1353. sidebarItemClicked.apply(this, arguments);
  1354. }
  1355. };
  1356. })();