From 102bf9355a2af2525107857de8e88d603302ef0b Mon Sep 17 00:00:00 2001 From: Jerzy Kozera Date: Fri, 12 Feb 2016 21:08:04 +0100 Subject: [PATCH] User-defined Stack Overflow tags (closes #4) (with autocomplete of 1000+ tags, embedded .json list for now) --- app/sotags.json | 1224 +++++++++++++++++++++++++++++++++++ bower.json | 2 +- scripts/build_app.bat | 1 + src/cljs/zest/settings.cljs | 151 +++-- 4 files changed, 1322 insertions(+), 56 deletions(-) create mode 100644 app/sotags.json diff --git a/app/sotags.json b/app/sotags.json new file mode 100644 index 0000000..ecf3f6e --- /dev/null +++ b/app/sotags.json @@ -0,0 +1,1224 @@ +["2d", +"3d", +"64bit", +"access-vba", +"action", +"actionbarsherlock", +"actionscript", +"actionscript-3", +"active-directory", +"activemq", +"activerecord", +"activex", +"adb", +"admob", +"adobe", +"ado.net", +"aes", +"afnetworking", +"air", +"ajax", +"akka", +"algorithm", +"alignment", +"amazon-ec2", +"amazon-s3", +"amazon-web-services", +"anchor", +"android", +"android-actionbar", +"android-activity", +"android-animation", +"android-asynctask", +"android-camera", +"android-edittext", +"android-emulator", +"android-fragments", +"android-gradle", +"android-intent", +"android-layout", +"android-linearlayout", +"android-listview", +"android-manifest", +"android-ndk", +"android-service", +"android-sqlite", +"android-studio", +"android-viewpager", +"android-webview", +"android-widget", +"angularjs", +"angularjs-directive", +"angularjs-ng-repeat", +"angularjs-scope", +"angular-ui-router", +"animation", +"annotations", +"ant", +"apache", +"apache2", +"apache-camel", +"apache-pig", +"apache-poi", +"apache-spark", +"api", +"apk", +"append", +"apple-push-notifications", +"applescript", +"applet", +"app-store", +"architecture", +"arduino", +"arguments", +"arm", +"arraylist", +"arrays", +"artificial-intelligence", +"ascii", +"asp-classic", +"asp.net", +"asp.net-ajax", +"asp.net-membership", +"asp.net-mvc", +"asp.net-mvc-2", +"asp.net-mvc-3", +"asp.net-mvc-4", +"asp.net-mvc-5", +"asp.net-mvc-routing", +"asp.net-web-api", +"asp.net-web-api2", +"assembly", +"associations", +"async-await", +"asynchronous", +"attributes", +"audio", +"authentication", +"authorization", +"autocomplete", +"autolayout", +"automated-tests", +"automatic-ref-counting", +"automation", +"avfoundation", +"awk", +"awt", +"azure", +"backbone.js", +"background", +"background-image", +"backup", +"base64", +"bash", +"batch-file", +"beautifulsoup", +"binary", +"binding", +"bit-manipulation", +"bitmap", +"blackberry", +"blob", +"bluetooth", +"boolean", +"boost", +"border", +"branch", +"broadcastreceiver", +"browser", +"buffer", +"build", +"bundle", +"button", +"byte", +"bytearray", +"c", +"c%23", +"c%23-3.0", +"c%23-4.0", +"c%2b%2b", +"c%2b%2b11", +"c%2b%2b-cli", +"caching", +"cakephp", +"cakephp-2.0", +"calendar", +"call", +"callback", +"camera", +"canvas", +"capybara", +"case", +"cassandra", +"casting", +"celery", +"centos", +"certificate", +"cgi", +"char", +"character", +"character-encoding", +"charts", +"chat", +"checkbox", +"chef", +"ckeditor", +"clang", +"class", +"classpath", +"click", +"client", +"client-server", +"clojure", +"closures", +"cloud", +"cmake", +"cmd", +"cocoa", +"cocoa-touch", +"cocos2d-iphone", +"cocos2d-x", +"codeigniter", +"coding-style", +"coffeescript", +"coldfusion", +"collections", +"colors", +"com", +"combobox", +"command", +"command-line", +"comments", +"common-lisp", +"compare", +"comparison", +"compilation", +"compiler-construction", +"compiler-errors", +"components", +"composer-php", +"compression", +"computer-vision", +"concatenation", +"concurrency", +"conditional", +"configuration", +"connection", +"console", +"console-application", +"const", +"constraints", +"constructor", +"containers", +"content-management-system", +"contextmenu", +"continuous-integration", +"control", +"controller", +"converter", +"cookies", +"coordinates", +"copy", +"cordova", +"core-animation", +"core-data", +"core-graphics", +"cors", +"couchdb", +"count", +"crash", +"cron", +"cross-browser", +"cross-domain", +"cross-platform", +"cryptography", +"crystal-reports", +"css", +"css3", +"css-float", +"css-position", +"css-selectors", +"css-transitions", +"csv", +"cucumber", +"cuda", +"curl", +"cursor", +"custom-controls", +"cxf", +"cygwin", +"cypher", +"d3.js", +"dart", +"database", +"database-connection", +"database-design", +"data-binding", +"data.frame", +"dataframes", +"datagrid", +"datagridview", +"dataset", +"data-structures", +"datatable", +"data.table", +"datatables", +"date", +"datepicker", +"datetime", +"db2", +"debian", +"debugging", +"decimal", +"delegates", +"delphi", +"dependencies", +"dependency-injection", +"deployment", +"deserialization", +"design", +"design-patterns", +"devexpress", +"devise", +"dialog", +"dictionary", +"directory", +"directx", +"django", +"django-admin", +"django-forms", +"django-models", +"django-rest-framework", +"django-templates", +"django-views", +"dll", +"dns", +"docker", +"doctrine", +"doctrine2", +"documentation", +"dojo", +"dom", +"domain-driven-design", +"double", +"download", +"drag-and-drop", +"drawing", +"driver", +"drop-down-menu", +"drupal", +"drupal-6", +"drupal-7", +"duplicates", +"dynamic", +"dynamics-crm-2011", +"echo", +"eclipse", +"eclipselink", +"eclipse-plugin", +"eclipse-rcp", +"e-commerce", +"editor", +"ef-code-first", +"ejb", +"elasticsearch", +"elisp", +"eloquent", +"emacs", +"email", +"embedded", +"ember-data", +"ember.js", +"encoding", +"encryption", +"entity", +"entity-framework", +"entity-framework-4", +"entity-framework-5", +"entity-framework-6", +"enums", +"environment-variables", +"erlang", +"error-handling", +"escaping", +"event-handling", +"events", +"excel", +"excel-2010", +"excel-formula", +"excel-vba", +"exception", +"exception-handling", +"exec", +"export", +"express", +"expression", +"extjs", +"extjs4", +"f%23", +"facebook", +"facebook-graph-api", +"facebook-javascript-sdk", +"facebook-like", +"fancybox", +"ffmpeg", +"field", +"file", +"file-io", +"filesystems", +"file-upload", +"filter", +"filtering", +"find", +"firebase", +"firefox", +"firefox-addon", +"flash", +"flask", +"flex", +"flex4", +"floating-point", +"fluent-nhibernate", +"focus", +"folder", +"fonts", +"foreach", +"foreign-keys", +"fork", +"for-loop", +"format", +"formatting", +"forms", +"fortran", +"fragment", +"frameworks", +"ftp", +"fullcalendar", +"full-text-search", +"function", +"functional-programming", +"g%2b%2b", +"gae-datastore", +"garbage-collection", +"gcc", +"gdb", +"gem", +"generics", +"geolocation", +"geometry", +"get", +"ggplot2", +"git", +"github", +"glassfish", +"global-variables", +"glsl", +"gmail", +"gnuplot", +"go", +"google-analytics", +"google-api", +"google-app-engine", +"google-apps-script", +"google-chrome", +"google-chrome-extension", +"google-cloud-messaging", +"google-drive-sdk", +"google-maps", +"google-maps-api-3", +"google-play", +"google-play-services", +"google-plus", +"google-spreadsheet", +"google-visualization", +"gorm", +"gps", +"gradle", +"grails", +"graph", +"graphics", +"grep", +"grid", +"gridview", +"groovy", +"group-by", +"gruntjs", +"gson", +"gtk", +"gulp", +"gwt", +"gzip", +"hadoop", +"handlebars.js", +"hash", +"hashmap", +"haskell", +"hbase", +"hdfs", +"header", +"heap", +"height", +"heroku", +"hex", +"hibernate", +"hide", +"highcharts", +"hive", +"hook", +"hosting", +"hover", +"hql", +".htaccess", +"html", +"html5", +"html5-canvas", +"html5-video", +"html-lists", +"html-parsing", +"html-table", +"http", +"http-headers", +"http-post", +"httprequest", +"https", +"http-status-code-404", +"httpwebrequest", +"hyperlink", +"icons", +"ide", +"iframe", +"if-statement", +"iis", +"iis-7", +"iis-7.5", +"image", +"imagemagick", +"image-processing", +"imageview", +"import", +"in-app-purchase", +"include", +"indexing", +"inheritance", +"initialization", +"input", +"insert", +"install", +"installation", +"installer", +"int", +"integer", +"intellij-idea", +"interface", +"interface-builder", +"internationalization", +"internet-explorer", +"internet-explorer-7", +"internet-explorer-8", +"internet-explorer-9", +"interop", +"io", +"ionic", +"ionic-framework", +"ios", +"ios4", +"ios5", +"ios6", +"ios7", +"ios8", +"ios9", +"ios-simulator", +"ip", +"ipad", +"iphone", +"ipython", +"iteration", +"iterator", +"itext", +"itextsharp", +"itunesconnect", +"jackson", +"jade", +"jar", +"jasmine", +"jasper-reports", +"java", +"java-8", +"java-ee", +"javafx", +"javafx-2", +"java-me", +"javascript", +"javascript-events", +"java.util.scanner", +"jaxb", +"jax-rs", +"jax-ws", +"jboss", +"jbutton", +"jdbc", +"jenkins", +"jersey", +"jetty", +"jframe", +"jmeter", +"jms", +"jni", +"join", +"joomla", +"jpa", +"jpanel", +"jqgrid", +"jquery", +"jquery-animate", +"jquery-mobile", +"jquery-plugins", +"jquery-selectors", +"jquery-ui", +"jquery-validate", +"jsf", +"jsf-2", +"json", +"json.net", +"jsonp", +"jsoup", +"jsp", +"jstl", +"jtable", +"junit", +"jvm", +"kendo-grid", +"kendo-ui", +"kernel", +"key", +"keyboard", +"knockout.js", +"label", +"lambda", +"language-agnostic", +"laravel", +"laravel-4", +"laravel-5", +"latex", +"layout", +"ldap", +"left-join", +"less", +"libgdx", +"liferay", +"line", +"linked-list", +"linker", +"linq", +"linq-to-entities", +"linq-to-sql", +"linq-to-xml", +"linux", +"linux-kernel", +"lisp", +"list", +"listbox", +"listener", +"listview", +"load", +"localhost", +"localization", +"local-storage", +"location", +"locking", +"log4j", +"logging", +"logic", +"login", +"loops", +"lua", +"lucene", +"machine-learning", +"macros", +"magento", +"magento-1.7", +"make", +"makefile", +"malloc", +"many-to-many", +"map", +"mapkit", +"mapping", +"mapreduce", +"maps", +"match", +"math", +"matlab", +"matplotlib", +"matrix", +"maven", +"maven-2", +"max", +"media-queries", +"memcached", +"memory", +"memory-leaks", +"memory-management", +"menu", +"mercurial", +"merge", +"metadata", +"meteor", +"methods", +"mfc", +"microsoft-metro", +"migration", +"mingw", +"mkmapview", +"mobile", +"mobile-safari", +"mocking", +"mockito", +"modal-dialog", +"model", +"model-view-controller", +"mod-rewrite", +"module", +"mongodb", +"mongodb-query", +"mongoid", +"mongoose", +"mono", +"monodroid", +"monotouch", +"mouseevent", +"mp3", +"mpi", +"ms-access", +"ms-access-2007", +"ms-access-2010", +"msbuild", +"ms-office", +"ms-word", +"mule", +"multidimensional-array", +"multiprocessing", +"multithreading", +"mvvm", +"mysql", +"mysqli", +"namespaces", +"navigation", +"neo4j", +"nested", +".net", +".net-3.5", +".net-4.0", +"netbeans", +"networking", +"network-programming", +"neural-network", +"nginx", +"nhibernate", +"ninject", +"nlp", +"node.js", +"nosql", +"notepad%2b%2b", +"notifications", +"npm", +"nsarray", +"nsdate", +"nsdictionary", +"nsmutablearray", +"nsstring", +"nuget", +"null", +"nullpointerexception", +"numbers", +"numpy", +"nunit", +"oauth", +"oauth-2.0", +"object", +"objective-c", +"ocaml", +"odata", +"odbc", +"onclick", +"oop", +"opencart", +"opencl", +"opencv", +"openerp", +"opengl", +"opengl-es", +"opengl-es-2.0", +"openshift", +"open-source", +"openssl", +"operating-system", +"operator-overloading", +"operators", +"optimization", +"oracle", +"oracle10g", +"oracle11g", +"order", +"orientation", +"orm", +"osgi", +"osx", +"outlook", +"out-of-memory", +"output", +"overflow", +"override", +"package", +"pagination", +"pandas", +"paperclip", +"parallel-processing", +"parameter-passing", +"parameters", +"parse.com", +"parsing", +"passwords", +"path", +"pattern-matching", +"paypal", +"pdf", +"pdf-generation", +"pdo", +"performance", +"perl", +"permissions", +"persistence", +"phantomjs", +"phonegap-plugins", +"php", +"phpmyadmin", +"phpunit", +"pip", +"pipe", +"pivot", +"playframework", +"playframework-2.0", +"plot", +"plsql", +"plugins", +"png", +"pointers", +"polymer", +"polymorphism", +"popup", +"port", +"position", +"posix", +"post", +"postgresql", +"powershell", +"preg-match", +"preg-replace", +"prepared-statement", +"primefaces", +"printf", +"printing", +"process", +"profiling", +"programming-languages", +"progress-bar", +"prolog", +"promise", +"properties", +"prototype", +"protractor", +"proxy", +"pthreads", +"push", +"push-notification", +"pygame", +"pyqt", +"pyqt4", +"python", +"python-2.7", +"python-3.x", +"qml", +"qt", +"qt4", +"query-optimization", +"queue", +"r", +"rabbitmq", +"radio-button", +"rake", +"random", +"range", +"raspberry-pi", +"razor", +"reactjs", +"recursion", +"redirect", +"redis", +"refactoring", +"reference", +"reflection", +"refresh", +"regex", +"registry", +"relational-database", +"rendering", +"replace", +"report", +"reporting-services", +"repository", +"request", +"requirejs", +"resharper", +"resize", +"resources", +"responsive-design", +"rest", +"return", +"rewrite", +"richfaces", +"rotation", +"routes", +"routing", +"row", +"rsa", +"rspec", +"rss", +"ruby", +"rubygems", +"ruby-on-rails", +"ruby-on-rails-3", +"ruby-on-rails-3.1", +"ruby-on-rails-3.2", +"ruby-on-rails-4", +"runtime", +"runtime-error", +"rust", +"rvm", +"safari", +"sails.js", +"salesforce", +"sas", +"sass", +"save", +"sbt", +"scala", +"scheduled-tasks", +"schema", +"scheme", +"scikit-learn", +"scipy", +"scope", +"scrapy", +"screen", +"scripting", +"scroll", +"scrollbar", +"scrollview", +"sdk", +"sdl", +"search", +"security", +"sed", +"segmentation-fault", +"select", +"selenium", +"selenium-webdriver", +"sencha-touch", +"sencha-touch-2", +"seo", +"serialization", +"serial-port", +"server", +"service", +"servicestack", +"servlets", +"session", +"set", +"settings", +"shader", +"shared-libraries", +"sharedpreferences", +"sharepoint", +"sharepoint-2007", +"sharepoint-2010", +"sharepoint-2013", +"shell", +"shiny", +"signalr", +"signals", +"silverlight", +"silverlight-4.0", +"sinatra", +"single-sign-on", +"singleton", +"sitecore", +"size", +"slider", +"smarty", +"sms", +"smtp", +"soap", +"socket.io", +"sockets", +"solr", +"sonarqube", +"sorting", +"spinner", +"split", +"spring", +"spring-boot", +"spring-data", +"spring-mvc", +"spring-security", +"sprite", +"sprite-kit", +"sql", +"sqlalchemy", +"sqlite", +"sqlite3", +"sql-order-by", +"sql-server", +"sql-server-2005", +"sql-server-2008", +"sql-server-2008-r2", +"sql-server-2012", +"sql-server-ce", +"sql-update", +"ssh", +"ssis", +"ssl", +"ssl-certificate", +"ssrs-2008", +"stack", +"static", +"statistics", +"stl", +"storage", +"stored-procedures", +"storyboard", +"stream", +"streaming", +"string", +"struct", +"structure", +"struts", +"struts2", +"styles", +"subdomain", +"sublimetext2", +"submit", +"subprocess", +"subquery", +"substring", +"sum", +"svg", +"svn", +"swift", +"swift2", +"swing", +"switch-statement", +"swt", +"symfony1", +"symfony2", +"synchronization", +"syntax", +"syntax-error", +"table", +"tableview", +"tabs", +"tags", +"task", +"task-parallel-library", +"tcl", +"tcp", +"tdd", +"teamcity", +"telerik", +"templates", +"terminal", +"testing", +"testng", +"text", +"textarea", +"textbox", +"text-files", +"textures", +"textview", +"tfs", +"tfs2010", +"themes", +"this", +"thread-safety", +"three.js", +"time", +"timeout", +"timer", +"time-series", +"timestamp", +"timezone", +"tinymce", +"titanium", +"tkinter", +"toggle", +"tomcat", +"tomcat7", +"tooltip", +"tortoisesvn", +"touch", +"transactions", +"tree", +"treeview", +"triggers", +"try-catch", +"tsql", +"tuples", +"twig", +"twitter", +"twitter-bootstrap", +"twitter-bootstrap-3", +"type-conversion", +"types", +"typescript", +"typo3", +"ubuntu", +"udp", +"uibutton", +"uicollectionview", +"uiimage", +"uiimageview", +"uikit", +"uilabel", +"uinavigationbar", +"uinavigationcontroller", +"uiscrollview", +"uitabbarcontroller", +"uitableview", +"uitextfield", +"uitextview", +"uiview", +"uiviewcontroller", +"uiwebview", +"uml", +"undefined", +"underscore.js", +"unicode", +"unit-testing", +"unity3d", +"unix", +"upload", +"uri", +"url", +"url-rewriting", +"usb", +"user", +"user-controls", +"user-interface", +"utf-8", +"vagrant", +"validation", +"variables", +"vb6", +"vba", +"vb.net", +"vbscript", +"vector", +"version", +"version-control", +"video", +"video-streaming", +"view", +"views", +"vim", +"virtual-machine", +"visual-c%2b%2b", +"visual-studio", +"visual-studio-2008", +"visual-studio-2010", +"visual-studio-2012", +"visual-studio-2013", +"visual-studio-2015", +"vsto", +"wamp", +"warnings", +"wcf", +"web", +"web-applications", +"webbrowser-control", +"web-config", +"web-crawler", +"webdriver", +"webforms", +"webgl", +"webkit", +"weblogic", +"web-scraping", +"webserver", +"web-services", +"website", +"websocket", +"websphere", +"webview", +"while-loop", +"widget", +"width", +"wifi", +"winapi", +"window", +"windows", +"windows-7", +"windows-8", +"windows-8.1", +"windows-installer", +"windows-mobile", +"windows-phone", +"windows-phone-7", +"windows-phone-8", +"windows-phone-8.1", +"windows-runtime", +"windows-services", +"windows-store-apps", +"windows-xp", +"winforms", +"winrt-xaml", +"wix", +"wolfram-mathematica", +"woocommerce", +"wordpress", +"wordpress-plugin", +"wordpress-theming", +"workflow", +"worklight", +"wpf", +"wpf-controls", +"wsdl", +"wso2", +"wxpython", +"x86", +"xamarin", +"xaml", +"xampp", +"xcode", +"xcode4", +"xcode5", +"xcode6", +"xhtml", +"xml", +"xmlhttprequest", +"xml-parsing", +"xml-serialization", +"xmpp", +"xna", +"xpages", +"xpath", +"xsd", +"xslt", +"yii", +"yii2", +"youtube", +"youtube-api", +"zend-framework", +"zend-framework2", +"zip", +"zoom", +"zurb-foundation"] diff --git a/bower.json b/bower.json index 68f2473..1555555 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,7 @@ "name": "zest", "version": "0.0.0", "dependencies": { - "Materialize": "materialize#~0.97.5" + "Materialize": "https://github.com/zestdocs/materialize.git#v0.97.5.autocomplete" }, "license": "MIT", "private": true, diff --git a/scripts/build_app.bat b/scripts/build_app.bat index a69c38b..9f3e668 100644 --- a/scripts/build_app.bat +++ b/scripts/build_app.bat @@ -29,6 +29,7 @@ copy nodelucene\Release\searcher.exe builds\zest-v0.1.0-alpha2-pre\zest-win32-x6 mkdir builds\zest-v0.1.0-alpha2-pre\zest-win32-x64\resources\app\templates copy app\templates\* builds\zest-v0.1.0-alpha2-pre\zest-win32-x64\resources\app\templates copy app\viewer.* builds\zest-v0.1.0-alpha2-pre\zest-win32-x64\resources\app +copy app\sotags.json builds\zest-v0.1.0-alpha2-pre\zest-win32-x64\resources\app copy "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x64\Microsoft.VC110.CRT\msvcr110.dll" builds\zest-v0.1.0-alpha2-pre\zest-win32-x64 copy "LucenePlusPlus\build\src\core\Release\lucene++.dll" builds\zest-v0.1.0-alpha2-pre\zest-win32-x64 diff --git a/src/cljs/zest/settings.cljs b/src/cljs/zest/settings.cljs index 6fcc301..536ea9a 100644 --- a/src/cljs/zest/settings.cljs +++ b/src/cljs/zest/settings.cljs @@ -136,6 +136,15 @@ "objective-c" "clojure"]) +(defn top-tags [] + (let [fs (.require js/window "fs") + path (.require js/window "path") + filename (.join path zest.core/app-dir + "app" "sotags.json")] + (.parse js/JSON (.readFileSync fs filename "utf8")))) + +(def user-tags (reagent/atom [])) + (defn start-so-download [] (let [WebTorrent (.require js/window "webtorrent") fs (.require js/window "fs") @@ -364,60 +373,92 @@ js/window (.toString line "utf8"))))))))) -(defn so-widget [] - (if @so-archives-available - [:div - [:ul {:class "collection with-header"} - [:li {:class "collection-header"} - "Suggested tags (select ones you want in your index):"] - (doall (for [tag suggested-tags] - (do ^{:key (str "so_tags_" tag)} - [:li {:class "collection-item"} - [:input {:type "checkbox" - :id (str "so_tag_cb_" tag) - :checked (get @so-index-tags tag) - :disabled @so-indexing - :on-change - (fn [] - (if (nil? (get @so-index-tags tag)) - (reset! so-index-tags - (conj @so-index-tags tag)) - (reset! so-index-tags - (disj @so-index-tags tag))))}] - [:label {:for (str "so_tag_cb_" tag) - :class "checkable"} tag]] - )))] - (if @so-indexing - [:p (str - "Indexing: " - (.toFixed (* 100 (/ (or @so-grep-progress 0) - (or @so-archives-total 1))) - 2) - "% filtering, " - (or @so-index-progress 0) - " indexing")] - [:button {:on-click (fn [] - (start-so-grepping)) - :class "btn center-align"} - "Create index"])] - - [:div - [:p "~8GB BitTorrent download required. (provided by archive.org)"] - (if @so-downloading - [:div - [:p (str "Progress: " (if (= 0 @so-download-total) - 0 - (min 99 - ; never show 100% while downloading - (.round js/Math - (* 100 (/ @so-download-progress - @so-download-total))))) - "%")] - [:p (str "Peers: " @so-download-peers - ", DL " @so-dl-speed "kB/s, UL " @so-ul-speed " kB/s")]] - [:a - {:on-click #(start-so-download)} - "Click here to start."])])) +(def so-widget + (reagent/create-class + {:component-did-mount + (fn [] + (.autocomplete + (js/jQuery "#so-tags-autocomplete") + (.map (top-tags) #(js-obj "value" (js/unescape %)))) + (.on + (js/jQuery "#so-tags-autocomplete") + "autocompleted" + (fn [event name] + (reset! so-index-tags + (conj @so-index-tags name)) + (reset! user-tags + (conj @user-tags name))))) + + :reagent-render + (fn [] + (if @so-archives-available + [:div + [:ul {:class "collection with-header"} + [:li {:class "collection-header"} + "Suggested tags (select ones you want in your index):"] + (doall (for [tag (concat suggested-tags @user-tags)] + (do ^{:key (str "so_tags_" tag)} + [:li {:class "collection-item"} + [:input {:type "checkbox" + :id (str "so_tag_cb_" tag) + :checked (get @so-index-tags tag) + :disabled @so-indexing + :on-change + (fn [] + (if (nil? (get @so-index-tags tag)) + (reset! so-index-tags + (conj @so-index-tags tag)) + (reset! so-index-tags + (disj @so-index-tags tag))))}] + [:label {:for (str "so_tag_cb_" tag) + :class "checkable"} tag]] + ))) + [:li {:class "collection-item"} + "Enter custom tag (click or press Enter to add):" + [:br] + [:div {:class "input-field" + :style {"margin-top" 0}} + [:input {:id "so-tags-autocomplete" + :on-key-down + (fn [e] + (if (= (.-key e) "Enter") + (do + (reset! so-index-tags + (conj @so-index-tags (.-value (.-target e)))) + (reset! user-tags + (conj @user-tags (.-value (.-target e)))) + (set! (.-value (.-target e)) ""))))}]]]] + (if @so-indexing + [:p (str + "Indexing: " + (.toFixed (* 100 (/ (or @so-grep-progress 0) + (or @so-archives-total 1))) + 2) + "% filtering, " + (or @so-index-progress 0) + " indexing")] + [:button {:on-click (fn [] + (start-so-grepping)) + :class "btn center-align"} + "Create index"])] + + [:div + [:p "~8GB BitTorrent download required. (provided by archive.org)"] + (if @so-downloading + [:div + [:p (str "Progress: " (if (= 0 @so-download-total) + 0 + (min 99 + ; never show 100% while downloading + (.round js/Math + (* 100 (/ @so-download-progress + @so-download-total))))) + "%")] + [:p (str "Peers: " @so-download-peers + ", DL " @so-dl-speed "kB/s, UL " @so-ul-speed " kB/s")]] + [:a + {:on-click #(start-so-download)} + "Click here to start."])]))})) (defn download-devdocs [slug db-size] (let [request (.require js/window "request") @@ -583,7 +624,7 @@ {:class "secondary-content" :href "#"} [:i {:class "material-icons"} "expand_more"]]] - (if @so-visible (so-widget))]]]] + (if @so-visible [so-widget])]]]] [:div {:class "modal-footer"} [:a {:class "modal-action modal-close btn-flat"}