diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index 73f83f692..c3791c4bf 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -52,7 +52,13 @@ class UploadsController < ApplicationController flash[:notice] = @service.warnings.join(".\n \n") end - respond_with(@upload) + respond_with(@upload) do |format| + format.json do + return render json: {success: true, location: post_path(@upload.post_id), post_id: @upload.post_id} unless @upload.is_errored? + return render json: {success: false, reason: 'duplicate', location: post_path(@upload.duplicate_post_id), post_id: @upload.duplicate_post_id}, status: 412 if @upload.is_duplicate? + return render json: {success: false, reason: 'invalid', message: @upload.sanitized_status}, status: 412 if @upload.is_errored? + end + end end private diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index bc1b3e499..c9fbeef34 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -45,4 +45,5 @@ export { default as Upload } from '../src/javascripts/uploads.js'; export { default as Utility } from '../src/javascripts/utility.js'; export { default as Ugoira } from '../src/javascripts/ugoira.js'; export { default as Takedown } from '../src/javascripts/takedowns.js'; -export { default as Thumbnails } from '../src/javascripts/thumbnails.js'; \ No newline at end of file +export { default as Thumbnails } from '../src/javascripts/thumbnails.js'; +export { default as Uploader } from '../src/javascripts/uploader.js'; diff --git a/app/javascript/src/javascripts/uploader.js b/app/javascript/src/javascripts/uploader.js new file mode 100644 index 000000000..42fcb3cc9 --- /dev/null +++ b/app/javascript/src/javascripts/uploader.js @@ -0,0 +1,12 @@ +import Uploader from './uploader.vue'; +import Vue from 'vue'; + +export default { + init() { + const app = new Vue({ + render: (h) => h(Uploader) + }); + + app.$mount('#uploader'); + } +} diff --git a/app/javascript/src/javascripts/uploader.vue b/app/javascript/src/javascripts/uploader.vue new file mode 100644 index 000000000..94230df73 --- /dev/null +++ b/app/javascript/src/javascripts/uploader.vue @@ -0,0 +1,898 @@ + + + + + diff --git a/app/javascript/src/javascripts/uploader_checkbox.vue b/app/javascript/src/javascripts/uploader_checkbox.vue new file mode 100644 index 000000000..4554a8022 --- /dev/null +++ b/app/javascript/src/javascripts/uploader_checkbox.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/javascript/src/javascripts/uploader_preview.vue b/app/javascript/src/javascripts/uploader_preview.vue new file mode 100644 index 000000000..7a51b5bc7 --- /dev/null +++ b/app/javascript/src/javascripts/uploader_preview.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/javascript/src/javascripts/uploader_related.vue b/app/javascript/src/javascripts/uploader_related.vue new file mode 100644 index 000000000..c37163e44 --- /dev/null +++ b/app/javascript/src/javascripts/uploader_related.vue @@ -0,0 +1,89 @@ + + + diff --git a/app/javascript/src/javascripts/uploader_source.vue b/app/javascript/src/javascripts/uploader_source.vue new file mode 100644 index 000000000..6a95cbdcc --- /dev/null +++ b/app/javascript/src/javascripts/uploader_source.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index 91d60d371..c256b0685 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -156,6 +156,21 @@ class UserPresenter user.user_name_change_requests.map { |req| template.link_to req.original_name, req }.join(", ").html_safe end + def favorite_tags_with_types + tag_names = user&.favorite_tags.to_s.split + tag_names = TagAlias.to_aliased(tag_names) + Tag.where(name: tag_names).map {|x| [x.name, x.post_count, x.category]} + end + + def recent_tags_with_types + versions = PostArchive.where(updater_id: user.id).where("updated_at > ?", 1.hour.ago).order(id: :desc).limit(150) + tags = versions.flat_map(&:added_tags) + tags = tags.reject { |tag| Tag.is_metatag?(tag) } + tags = tags.group_by(&:itself).transform_values(&:size).sort_by { |tag, count| [-count, tag] }.map(&:first) + tags = tags.take(50) + Tag.where(name: tags).map {|x| [x.name, x.post_count, x.category]} + end + def custom_css user.custom_style.to_s.split(/\r\n|\r|\n/).map do |line| if line =~ /\A@import/ diff --git a/app/views/uploads/new.html.erb b/app/views/uploads/new.html.erb index 444d76acb..935717f45 100644 --- a/app/views/uploads/new.html.erb +++ b/app/views/uploads/new.html.erb @@ -1,8 +1,3 @@ -<%= render partial: "uploads/upload_partials/css" %> -<%= render partial: "uploads/upload_partials/tag_preview" %> -<%= render partial: "uploads/upload_partials/source" %> -<%= render partial: "uploads/upload_partials/related" %> -<%= render partial: "uploads/upload_partials/uploader" %>

Before uploading, read @@ -14,6 +9,7 @@ Unsure what to tag your post with? <%= link_to "Tagging Checklist", help_pages_path(id: "tagging_checklist") %>

+
<%# if current_user.is_member_or_lower? && (current_user.upload_limit <= 5 || current_user.post_upload_throttle <= 5) %> @@ -32,655 +28,12 @@ <%# end %> -
- - - - - - diff --git a/app/views/uploads/upload_partials/_css.html.erb b/app/views/uploads/upload_partials/_css.html.erb deleted file mode 100644 index 192bc35a3..000000000 --- a/app/views/uploads/upload_partials/_css.html.erb +++ /dev/null @@ -1,178 +0,0 @@ - \ No newline at end of file diff --git a/app/views/uploads/upload_partials/_related.html.erb b/app/views/uploads/upload_partials/_related.html.erb deleted file mode 100644 index 78fde19bf..000000000 --- a/app/views/uploads/upload_partials/_related.html.erb +++ /dev/null @@ -1,12 +0,0 @@ - \ No newline at end of file diff --git a/app/views/uploads/upload_partials/_source.html.erb b/app/views/uploads/upload_partials/_source.html.erb deleted file mode 100644 index 22e18bdeb..000000000 --- a/app/views/uploads/upload_partials/_source.html.erb +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/app/views/uploads/upload_partials/_tag_preview.html.erb b/app/views/uploads/upload_partials/_tag_preview.html.erb deleted file mode 100644 index 751074215..000000000 --- a/app/views/uploads/upload_partials/_tag_preview.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/app/views/uploads/upload_partials/_uploader.html.erb b/app/views/uploads/upload_partials/_uploader.html.erb deleted file mode 100644 index 0d59d4e1c..000000000 --- a/app/views/uploads/upload_partials/_uploader.html.erb +++ /dev/null @@ -1,228 +0,0 @@ - - diff --git a/config/webpack/environment.js b/config/webpack/environment.js index c3e1a3bd6..2263e9122 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -1,5 +1,6 @@ const { environment } = require('@rails/webpacker') const erb = require('./loaders/erb') +const VueLoaderPlugin = require('vue-loader/lib/plugin') const webpack = require('webpack'); environment.loaders.append('scss.erb', { @@ -14,6 +15,12 @@ environment.loaders.append('scss.erb', { ] }); +environment.loaders.append('vue', { + test: /\.vue$/, + use: 'vue-loader' +}); +environment.plugins.append('VueLoaderPlugin', new VueLoaderPlugin()); + environment.loaders.append('erb', erb); environment.config.output.library = ["Danbooru"]; diff --git a/package.json b/package.json index b8f54fdaf..4f735e3d7 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "qtip2": "^3.0.3", "rails-erb-loader": "^5.4.2", "script-loader": "^0.7.2", - "webpack-cli": "^3.0.8", - "vue": "^2.6.10" + "vue": "^2.6.10", + "vue-loader": "^15.7.0", + "vue-template-compiler": "^2.6.10", + "webpack-cli": "^3.0.8" }, "devDependencies": { "eslint": "^5.3.0", diff --git a/yarn.lock b/yarn.lock index c9f177915..c75712dbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,21 @@ webpack "^3.11.0" webpack-manifest-plugin "^1.3.2" +"@vue/component-compiler-utils@^2.5.1": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b" + integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.14" + postcss-selector-parser "^5.0.0" + prettier "1.16.3" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -877,6 +892,11 @@ block-stream@*: dependencies: inherits "~2.0.0" +bluebird@^3.1.1: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1183,6 +1203,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -1453,6 +1482,13 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -1640,6 +1676,11 @@ cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + cssnano@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" @@ -1711,6 +1752,11 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + debug-loader@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/debug-loader/-/debug-loader-0.0.1.tgz#44dc37e09e3c39e6af334681960f70a534a9d056" @@ -2901,6 +2947,11 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.4" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" @@ -2917,6 +2968,11 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +he@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3787,6 +3843,14 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -3875,6 +3939,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5134,6 +5205,15 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2, postcss-selector indexes-of "^1.0.1" uniq "^1.0.1" +postcss-selector-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" @@ -5188,6 +5268,15 @@ postcss@^6.0, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.11, postcss@^6.0.14, source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.14: + version "7.0.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" + integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -5196,6 +5285,11 @@ prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" +prettier@1.16.3: + version "1.16.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" + integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6312,6 +6406,13 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -6682,6 +6783,43 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +vue-hot-reload-api@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" + integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g== + +vue-loader@^15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.7.0.tgz#27275aa5a3ef4958c5379c006dd1436ad04b25b3" + integrity sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA== + dependencies: + "@vue/component-compiler-utils" "^2.5.1" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz#323b4f3495f04faa3503337a82f5d6507799c9cc" + integrity sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + vue@^2.6.10: version "2.6.10" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637"