From 1a61c482b04db2502306ec5f82f3aac5822721cf Mon Sep 17 00:00:00 2001 From: Oleg Hasjanov Date: Fri, 1 Mar 2024 14:26:17 +0200 Subject: [PATCH] fixed issues from feedback --- .../common/footer/component.html.erb | 1 - .../common/header/component.html.erb | 8 +- .../header/component_deprecated.html.erb | 4 +- .../modals/pay_invoice/component.html.erb | 103 ++---------------- .../modals/pay_invoice/component.rb | 14 +++ .../outstanding_invoices/component.rb | 6 +- .../pages/invoices/paid_invoices/component.rb | 2 +- .../component.html.erb | 4 +- .../pages/offers/offers_table/component.rb | 4 +- .../billing_profiles_controller.rb | 4 +- .../concerns/recaptcha_validatable.rb | 6 +- app/controllers/english_offers_controller.rb | 35 ++++-- app/controllers/invoices_controller.rb | 21 +++- .../notifications/mark_as_read_controller.rb | 10 +- app/controllers/offers_controller.rb | 26 +++-- app/controllers/wishlist_items_controller.rb | 4 +- app/helpers/turbo_streams/toast_helper.rb | 4 +- app/javascript/application.js | 5 + .../controllers/autotax_counter_controller.js | 7 +- .../controllers/countdown_controller.js | 2 - .../controllers/form/check_all_controller.js | 12 ++ app/javascript/controllers/index.js | 6 + .../invoice_autotax_counter_controller.js | 51 +++++++++ .../controllers/modals/modal_controller.js | 10 -- .../controllers/profile_webpush_controller.js | 2 - .../push_notification_controller.js | 2 - .../controllers/table/tab_controller.js | 2 - app/models/wishlist_item.rb | 2 +- .../controllers/check_controller.js | 7 +- .../controllers/countdown_controller.js | 2 - .../push_notification_controller.js | 2 - app/views/admin/auctions/_auction.html.erb | 2 +- app/views/admin/auctions/index.html.erb | 5 +- app/views/admin/invoices/show.html.erb | 3 +- .../invoices/_invoice_information.html.erb | 97 +++++++++++++++++ app/views/layouts/application.html.erb | 2 +- app/views/wishlist_items/_editable.html.erb | 4 +- config/locales/auctions.en.yml | 1 + config/locales/auctions.et.yml | 1 + config/locales/en.yml | 4 +- config/locales/english_offers.ee.yml | 4 +- config/locales/english_offers.en.yml | 4 +- config/locales/et.yml | 4 +- config/locales/invoices.en.yml | 3 + config/locales/invoices.et.yml | 3 + config/locales/notifications.en.yml | 5 +- config/locales/notifications.et.yml | 3 +- config/locales/offers.en.yml | 2 +- config/locales/offers.et.yml | 2 +- config/locales/wishlist_items.en.yml | 4 + config/locales/wishlist_items.et.yml | 8 +- 51 files changed, 339 insertions(+), 190 deletions(-) create mode 100644 app/javascript/controllers/form/check_all_controller.js create mode 100644 app/javascript/controllers/invoice_autotax_counter_controller.js create mode 100644 app/views/invoices/_invoice_information.html.erb diff --git a/app/components/common/footer/component.html.erb b/app/components/common/footer/component.html.erb index 2d58f86df..1906d022b 100644 --- a/app/components/common/footer/component.html.erb +++ b/app/components/common/footer/component.html.erb @@ -39,7 +39,6 @@
- . <%= t('common.footer.domain_regulation')%>
<%= t('common.footer.faq')%> diff --git a/app/components/common/header/component.html.erb b/app/components/common/header/component.html.erb index 52525fe0e..93f080569 100644 --- a/app/components/common/header/component.html.erb +++ b/app/components/common/header/component.html.erb @@ -12,7 +12,7 @@ diff --git a/app/components/common/header/component_deprecated.html.erb b/app/components/common/header/component_deprecated.html.erb index c0407cf2a..4d5780d47 100644 --- a/app/components/common/header/component_deprecated.html.erb +++ b/app/components/common/header/component_deprecated.html.erb @@ -12,7 +12,7 @@ diff --git a/app/components/modals/pay_invoice/component.html.erb b/app/components/modals/pay_invoice/component.html.erb index 8263f14ed..52304f730 100644 --- a/app/components/modals/pay_invoice/component.html.erb +++ b/app/components/modals/pay_invoice/component.html.erb @@ -23,102 +23,17 @@
-
-
-
+ <%= turbo_frame_tag "invoice_information" do %> + <%= render partial: 'invoices/invoice_information', locals: { invoice: @invoice } %> + <% end %> - <%= form_with model: @invoice, url: invoice_path(@invoice.uuid), data: { controller: 'form--debounce', action: 'change->form--debounce#search', form__debounce_target: 'form' } do |f| %> - <%= component 'common/form/label', form: f, attribute: :billing_profile_id, title: t('billing_profiles_name') %> - <%= component 'common/form/dropdown_input', form: f, attribute: :billing_profile_id, - enum: options_for_select(BillingProfile.where(user_id: invoice.user_id).pluck(:name, :id), current_billing_profile), - first_options: { include_blank: false } %> - <% end %> -
-
- - <%= invoice_issuer%> -
-
-
-
- - <%= issuer_for %> -
-
- - <%= invoice_issuer_address %> -
-
- - <%= invoice_issuer_reg_no %> -
-
- - <%= invoice_issuer_vat_number %> -
-
-
-
- -
- <% header_collection = [{ column: nil, caption: '#', options: { class: "" } }, - { column: nil, caption: t('invoices.item'), options: { class: "" } }, - { column: nil, caption: nil, options: { class: "" } }, - { column: nil, caption: t('invoices.price'), options: { class: "" } }, - ] %> - <%= component 'common/table', header_collection:, options: { class: '' } do %> - - <% @invoice.items.each_with_index do |item, index| %> - - <%= index + 1 %> - - <%= I18n.t('invoice_items.name', - domain_name: item.invoice.result.auction.domain_name, - auction_end: item.invoice.result.auction.ends_at.to_date) %> - - - <%= item.price %> - - <% end %> - - - - - <%= t('invoices.vat_amount') %> - <%= number_to_percentage(@invoice.vat_rate * 100, precision: 0) %> - <%= t('offers.price_in_currency', price: @invoice.vat) %> - - - - <%= t('invoices.total') %> - - <%= t('offers.price_in_currency', price: @invoice.total + (@invoice.enable_deposit? ? @invoice.deposit : 0.0)) %> - - - <% if @invoice.enable_deposit? %> - - - <%= t('invoices.deposit') %> - - <%= t('offers.price_in_currency', price: @invoice.deposit) %> - - - - <%= t('invoices.amount_due') %> - - <%= t('offers.price_in_currency', price: @invoice.total) %> - - <% end %> - <% end %> -
- -
- - + + + diff --git a/app/components/modals/pay_invoice/component.rb b/app/components/modals/pay_invoice/component.rb index fc479e00a..443445d4a 100644 --- a/app/components/modals/pay_invoice/component.rb +++ b/app/components/modals/pay_invoice/component.rb @@ -32,6 +32,20 @@ def invoice_issuer_reg_no def invoice_issuer_vat_number Setting.find_by(code: 'invoice_issuer_vat_number').retrieve end + + def billing_profile_dropdown_properties + { + attribute: :billing_profile_id, + enum: billing_profiles = BillingProfile.where(user_id: invoice.user_id).collect do |b| + [b.name, b.id, { 'data-vat-rate' => b.vat_rate }] + end, + first_options: {}, + second_options: { + class: billing_profiles.size == 1 ? 'disabled' : '', + data: { action: 'change->invoice-autotax-counterr#updateTax', invoice_autotax_counter_target: 'dropdown'} + } + } + end end end end \ No newline at end of file diff --git a/app/components/pages/invoices/outstanding_invoices/component.rb b/app/components/pages/invoices/outstanding_invoices/component.rb index 47f189b25..111e54487 100644 --- a/app/components/pages/invoices/outstanding_invoices/component.rb +++ b/app/components/pages/invoices/outstanding_invoices/component.rb @@ -22,7 +22,7 @@ def issued_invoice_table_headers [{ column: nil, caption: t('invoices.item'), options: { class: '' } }, { column: nil, caption: t('invoices.due_date'), options: { class: '' } }, { column: nil, caption: t('invoices.total'), options: { class: '' } }, - { column: nil, caption: 'Tegevused', + { column: nil, caption: t('actions_name'), options: { class: 'u-text-center-l' } }] end @@ -30,7 +30,7 @@ def overdue_invoice_table_headers [{ column: nil, caption: t('invoices.item'), options: { class: '' } }, { column: nil, caption: t('invoices.due_date'), options: { class: '' } }, { column: nil, caption: t('invoices.total'), options: { class: '' } }, - { column: nil, caption: 'Tegevused', + { column: nil, caption: t('actions_name'), options: { class: 'u-text-center-l' } }] end @@ -38,7 +38,7 @@ def cancel_invoice_table_headers [{ column: nil, caption: t('invoices.item'), options: { class: '' } }, { column: nil, caption: t('invoices.due_date'), options: { class: '' } }, { column: nil, caption: t('invoices.total'), options: { class: '' } }, - { column: nil, caption: 'Tegevused', + { column: nil, caption: t('actions_name'), options: { class: 'u-text-center-l' } }] end end diff --git a/app/components/pages/invoices/paid_invoices/component.rb b/app/components/pages/invoices/paid_invoices/component.rb index 0b80e30b9..799311924 100644 --- a/app/components/pages/invoices/paid_invoices/component.rb +++ b/app/components/pages/invoices/paid_invoices/component.rb @@ -15,7 +15,7 @@ def paid_invoices_headers [{ column: nil, caption: t('invoices.item'), options: { class: '' } }, { column: nil, caption: t('invoices.due_date'), options: { class: '' } }, { column: nil, caption: t('invoices.total'), options: { class: '' } }, - { column: nil, caption: 'Tegevused', options: { class: 'u-text-center-l' } }] + { column: nil, caption: t('actions_name'), options: { class: 'u-text-center-l' } }] end def deposit_paid_headers diff --git a/app/components/pages/offers/english_auction_offer_table/component.html.erb b/app/components/pages/offers/english_auction_offer_table/component.html.erb index 15590507b..17a3bbfc0 100644 --- a/app/components/pages/offers/english_auction_offer_table/component.html.erb +++ b/app/components/pages/offers/english_auction_offer_table/component.html.erb @@ -1,12 +1,12 @@
-
+

<%= t('offers.overview') %>

<%= component 'common/table', header_collection: overview_table_headers, options: { class: 'table--black' } do %> <%= tag.tbody do %> <%= @offer.auction.domain_name %> - <%= auction.ends_at %> + <%= @offer.auction.ends_at %> <%= t('offers.price_in_currency', price: @offer.price) %> <%= t('offers.price_in_currency', price: @offer.total) %> diff --git a/app/components/pages/offers/offers_table/component.rb b/app/components/pages/offers/offers_table/component.rb index 7ad8dcd50..427337c4f 100644 --- a/app/components/pages/offers/offers_table/component.rb +++ b/app/components/pages/offers/offers_table/component.rb @@ -12,8 +12,8 @@ def initialize(offers:) def header_collection [{ column: 'auctions.domain_name', caption: t('auctions.domain_name'), options: { class: 'sorting' } }, - { column: 'auctions.platform', caption: 'Tüüp', options: { class: 'sorting' } }, - { column: nil, caption: t('.your_last_offer'), options: { class: '' } }, + { column: 'auctions.platform', caption: t('auctions.type'), options: { class: 'sorting' } }, + { column: nil, caption: t('offers.show.your_last_offer'), options: { class: '' } }, { column: nil, caption: t('offers.total'), options: { class: '' } }, { column: 'auctions.ends_at', caption: t('auctions.ends_at'), options: { class: 'sorting' } }, diff --git a/app/controllers/billing_profiles_controller.rb b/app/controllers/billing_profiles_controller.rb index 99773e6f0..b6b300073 100644 --- a/app/controllers/billing_profiles_controller.rb +++ b/app/controllers/billing_profiles_controller.rb @@ -29,6 +29,8 @@ def create @billing_profile = BillingProfile.new(create_params) authorize! :manage, @billing_profile + flash.clear + respond_to do |format| if create_predicate redirect_uri = "#{session[:return_to]}?billing_profile_id=#{@billing_profile.id}" || billing_profile_path(@billing_profile.uuid) @@ -45,7 +47,7 @@ def create format.html { redirect_to redirect_uri } format.json { render :show, status: :created, location: @billing_profile } else - flash[:alert] = @billing_profile.errors.full_messages.to_sentence + flash.now[:alert] = @billing_profile.errors.full_messages.to_sentence format.turbo_stream do render turbo_stream: [ diff --git a/app/controllers/concerns/recaptcha_validatable.rb b/app/controllers/concerns/recaptcha_validatable.rb index ed21597ea..c4585d463 100644 --- a/app/controllers/concerns/recaptcha_validatable.rb +++ b/app/controllers/concerns/recaptcha_validatable.rb @@ -3,7 +3,7 @@ module RecaptchaValidatable included do before_action :set_captcha_required - before_action :check_recaptcha, only: %i[create update] + before_action :check_recaptcha, only: %i[create update], unless: -> { Rails.env.development? || Rails.env.test? } end module ClassMethods @@ -17,9 +17,7 @@ def recaptcha_action(action) end def set_captcha_required - # return if Rails.env.development? - - @captcha_required = current_user.requires_captcha? + @captcha_required = Rails.env.development? ? false : current_user.requires_captcha? @recaptcha2_site_key = AuctionCenter::Application.config.customization.dig(:recaptcha, :recaptcha2_site_key) @recaptcha3_site_key = AuctionCenter::Application.config.customization.dig(:recaptcha, :recaptcha3_site_key) end diff --git a/app/controllers/english_offers_controller.rb b/app/controllers/english_offers_controller.rb index 9872f5dd4..96e8b1407 100644 --- a/app/controllers/english_offers_controller.rb +++ b/app/controllers/english_offers_controller.rb @@ -20,7 +20,12 @@ class EnglishOffersController < ApplicationController # GET /auctions/aa450f1a-45e2-4f22-b2c3-f5f46b5f906b/offers/new def new offer = @auction.offer_from_user(current_user.id) - redirect_to edit_english_offer_path(offer.uuid) if offer + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, root_path), notice: t('offers.already_exists') and return + else + redirect_to root_path, status: :see_other, notice: t('offers.already_exists') and return + end if offer BillingProfile.create_default_for_user(current_user.id) @offer = Offer.new(auction_id: @auction.id, user_id: current_user.id) @@ -31,7 +36,12 @@ def create unless check_first_bid_for_english_auction(create_params, @auction) formatted_starting_price = format('%.2f', @auction.starting_price) flash[:alert] = t('english_offers.create.bid_must_be', minimum: formatted_starting_price) - redirect_to new_auction_english_offer_path(auction_uuid: @auction.uuid) and return + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, root_path) + else + redirect_to root_path, status: :see_other + end end @offer = Offer.new(create_params) @@ -91,6 +101,7 @@ def update redirect_to root_path end else + @show_checkbox_recaptcha = true unless @success flash.now[:alert] = t('english_offers.form.captcha_verification') redirect_to root_path, status: :see_other @@ -126,7 +137,6 @@ def update_auction_values(auction, message_text) auction.update_ends_at(@offer) flash[:notice] = message_text - # redirect_to edit_english_offer_path(@offer.uuid) redirect_to root_path end @@ -135,9 +145,13 @@ def prevent_check_for_invalid_bid return unless bid_is_bad?(auction: auction, update_params: update_params) - flash[:alert] = - "#{t('english_offers.show.bid_failed', price: format('%.2f', auction.highest_price.to_f).tr('.', ','))}" - redirect_to edit_english_offer_path(auction.users_offer_uuid) and return + flash[:alert] = "#{t('english_offers.show.bid_failed', price: format('%.2f', auction.highest_price.to_f).tr('.', ','))}" + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, root_path) + else + redirect_to root_path, status: :see_other + end end def bid_is_bad?(auction:, update_params:) @@ -195,8 +209,13 @@ def set_offer def authorize_phone_confirmation return unless current_user.requires_phone_number_confirmation? - redirect_to new_user_phone_confirmation_path(current_user.uuid), - notice: t('phone_confirmations.confirmation_required') + flash[:notice] = t('phone_confirmations.confirmation_required') + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, new_user_phone_confirmation_path(current_user.uuid)) + else + redirect_to new_user_phone_confirmation_path(current_user.uuid), status: :see_other + end end def authorize_offer_for_user diff --git a/app/controllers/invoices_controller.rb b/app/controllers/invoices_controller.rb index 23a4216cb..437e64495 100644 --- a/app/controllers/invoices_controller.rb +++ b/app/controllers/invoices_controller.rb @@ -10,10 +10,27 @@ def edit; end def update respond_to do |format| if update_predicate - format.html { redirect_to invoice_path(@invoice.uuid), notice: t(:updated) } + format.turbo_stream do + render turbo_stream: [ + turbo_stream.update('invoice_information', partial: 'invoices/invoice_information', locals: { invoice: @invoice }), + turbo_stream.toast(t(:updated), position: "right", background: 'linear-gradient(to right, #11998e, #38ef7d)') + ] + end + + format.html { redirect_to invoices_path, notice: t(:updated) } format.json { render :show, status: :ok, location: @invoice } else - format.html { redirect_to invoice_path(@invoice.uuid), notice: t(:something_went_wrong) } + error_str = if @invoice.errors.empty? + @invoice.payable? ? t(:something_went_wrong) : t('invoices.invoice_already_paid') + else + @invoice.errors.full_messages.join('; ') + end + + format.turbo_stream do + render turbo_stream: turbo_stream.toast(error_str, position: "right", background: 'linear-gradient(to right, #93291E, #ED213A)') + end + + format.html { redirect_to invoices_path, status: :see_other, alert: error_str } format.json { render json: @invoice.errors, status: :unprocessable_entity } end end diff --git a/app/controllers/notifications/mark_as_read_controller.rb b/app/controllers/notifications/mark_as_read_controller.rb index f67e0fbe2..3fb531687 100644 --- a/app/controllers/notifications/mark_as_read_controller.rb +++ b/app/controllers/notifications/mark_as_read_controller.rb @@ -2,15 +2,7 @@ class Notifications::MarkAsReadController < ApplicationController def update current_user&.notifications&.unread&.map(&:mark_as_read!) - flash[:notice] = 'All notifications marked as read' + flash[:notice] = t('notifications.all_marked_as_read') redirect_to notifications_path, status: :see_other - - # respond_to do |format| - # format.turbo_stream do - # render turbo_stream: [ - # turbo_stream.update('bell-broadcast', partial: 'notifications/bell', locals: { any_unread: false }), - # ] - # end - # end end end diff --git a/app/controllers/offers_controller.rb b/app/controllers/offers_controller.rb index 14476e5f4..53c5d8f89 100644 --- a/app/controllers/offers_controller.rb +++ b/app/controllers/offers_controller.rb @@ -16,7 +16,12 @@ class OffersController < ApplicationController # GET /auctions/aa450f1a-45e2-4f22-b2c3-f5f46b5f906b/offers/new def new offer = @auction.offer_from_user(current_user.id) - redirect_to edit_offer_path(offer.uuid), notice: t('offers.already_exists') if offer + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, root_path), notice: t('offers.already_exists') and return + else + redirect_to root_path, status: :see_other, notice: t('offers.already_exists') and return + end if offer BillingProfile.create_default_for_user(current_user.id) @offer = Offer.new(auction_id: @auction.id, user_id: current_user.id) @@ -32,10 +37,10 @@ def create respond_to do |format| if existing_offer format.html do - redirect_to offer_path(existing_offer.uuid), notice: t('offers.already_exists') + redirect_to root_path, notice: t('offers.already_exists') end elsif create_predicate - format.html { redirect_to offer_path(@offer.uuid), notice: t('.created') } + format.html { redirect_to root_path, notice: t('.created') } format.json { render :show, status: :created, location: @offer } else @show_checkbox_recaptcha = true unless @success @@ -61,17 +66,17 @@ def show # GET /offers/aa450f1a-45e2-4f22-b2c3-f5f46b5f906b/edit def edit auction = @offer.auction - redirect_to auction_path(auction.uuid) and return if update_not_allowed(auction) + redirect_to root_path and return if update_not_allowed(auction) end # PUT /offers/aa450f1a-45e2-4f22-b2c3-f5f46b5f906b def update auction = @offer.auction - redirect_to auction_path(auction.uuid) and return if update_not_allowed(auction) + redirect_to root_path and return if update_not_allowed(auction) respond_to do |format| if update_predicate - format.html { redirect_to offer_path(@offer.uuid), notice: t(:updated), status: :see_other } + format.html { redirect_to root_path, notice: t(:updated), status: :see_other } format.json { render :show, status: :ok, location: @offer } else @show_checkbox_recaptcha = true unless @success @@ -145,8 +150,13 @@ def set_offer def authorize_phone_confirmation return unless current_user.requires_phone_number_confirmation? - redirect_to new_user_phone_confirmation_path(current_user.uuid), - notice: t('phone_confirmations.confirmation_required') + flash[:notice] = t('phone_confirmations.confirmation_required') + + if turbo_frame_request? + render turbo_stream: turbo_stream.action(:redirect, new_user_phone_confirmation_path(current_user.uuid)) + else + redirect_to new_user_phone_confirmation_path(current_user.uuid), status: :see_other + end end def authorize_offer_for_user diff --git a/app/controllers/wishlist_items_controller.rb b/app/controllers/wishlist_items_controller.rb index 4a9894b94..b4c68e055 100644 --- a/app/controllers/wishlist_items_controller.rb +++ b/app/controllers/wishlist_items_controller.rb @@ -28,7 +28,7 @@ def create format.json { render json: @wishlist_item, status: :created } else format.json { render json: @wishlist_item.errors.full_messages, status: :unprocessable_entity } - format.html { redirect_to wishlist_items_path, notice: @wishlist_item.errors.full_messages.join(', ') } + format.html { redirect_to wishlist_items_path, alert: @wishlist_item.errors.full_messages.join(', ') } end end end @@ -49,7 +49,7 @@ def destroy format.json { render json: @wishlist_item, status: :created } else format.json { render json: @wishlist_item.errors.full_messages, status: :unprocessable_entity } - format.html { redirect_to wishlist_items_path, notice: @wishlist_item.errors.full_messages.join(', ') } + format.html { redirect_to wishlist_items_path, alert: @wishlist_item.errors.full_messages.join(', ') } end end end diff --git a/app/helpers/turbo_streams/toast_helper.rb b/app/helpers/turbo_streams/toast_helper.rb index f116b8e6a..8a9b556f4 100644 --- a/app/helpers/turbo_streams/toast_helper.rb +++ b/app/helpers/turbo_streams/toast_helper.rb @@ -1,6 +1,6 @@ module TurboStreams::ToastHelper - def toast(message, position: "left") - turbo_stream_action_tag :toast, message: message, position: position + def toast(message, position: "left", **options) + turbo_stream_action_tag :toast, message: message, position: position, **options end end diff --git a/app/javascript/application.js b/app/javascript/application.js index e2ed77604..c0cbbe470 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -3,3 +3,8 @@ import "./turbo_streams" import "@hotwired/turbo-rails" import "./controllers" +import { StreamActions } from "@hotwired/turbo" + +Turbo.StreamActions.redirect = function () { + Turbo.visit(this.target); +}; diff --git a/app/javascript/controllers/autotax_counter_controller.js b/app/javascript/controllers/autotax_counter_controller.js index ea67467a5..317fb0776 100644 --- a/app/javascript/controllers/autotax_counter_controller.js +++ b/app/javascript/controllers/autotax_counter_controller.js @@ -5,11 +5,12 @@ export default class extends Controller { static values = { tax: String, template: String, - defaulttemplate: String + defaulttemplate: String, + priceElement: { default: 'input[name="offer[price]"]', type: String } } connect() { - this.updateTax(); // обновляем значение tax при инициализации + this.updateTax(); } count(event) { @@ -30,8 +31,8 @@ export default class extends Controller { updateTax(event) { let selectElement = this.element.querySelector('select'); this.taxValue = selectElement.options[selectElement.selectedIndex].dataset.vatRate || 0.0; + const priceElement = this.element.querySelector(this.priceElementValue); - const priceElement = this.element.querySelector('[name="offer[price]"]'); this.count({target: priceElement}); } } diff --git a/app/javascript/controllers/countdown_controller.js b/app/javascript/controllers/countdown_controller.js index 9648bed74..046505a1a 100644 --- a/app/javascript/controllers/countdown_controller.js +++ b/app/javascript/controllers/countdown_controller.js @@ -11,8 +11,6 @@ export default class extends Controller { if (this.dateValue) { this.endTime = new Date(this.dateValue).getTime(); - // console.log(this.dateValue); - this.update(); this.timer = setInterval(() => { this.update(); diff --git a/app/javascript/controllers/form/check_all_controller.js b/app/javascript/controllers/form/check_all_controller.js new file mode 100644 index 000000000..d56e7bc70 --- /dev/null +++ b/app/javascript/controllers/form/check_all_controller.js @@ -0,0 +1,12 @@ +// app/javascript/controllers/check_controller.js +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["checkboxes"] + + checkAll() { + this.checkboxesTargets.forEach((checkbox) => { + checkbox.checked = !checkbox.checked; + }) + } +} diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index 06de57809..b80083b8e 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -31,6 +31,9 @@ application.register("form--checkbox-autosubmit", Form__CheckboxAutosubmitContro import Form__AutosaveController from "./form/autosave_controller"; application.register("form--autosave", Form__AutosaveController); +import Form__CheckAllController from "./form/check_all_controller"; +application.register("form--check-all", Form__CheckAllController); + import Table__OrdeableController from "./table/ordeable_controller"; application.register("table--ordeable", Table__OrdeableController); @@ -40,6 +43,9 @@ application.register("table--tab", Table__TabController); import AutotaxCounter from "./autotax_counter_controller"; application.register("autotax-counter", AutotaxCounter); +import InvoiceAutotaxCounter from "./invoice_autotax_counter_controller"; +application.register("invoice-autotax-counter", InvoiceAutotaxCounter); + import EnglishOffer from "./english_offers_controller"; application.register("english-offer", EnglishOffer); diff --git a/app/javascript/controllers/invoice_autotax_counter_controller.js b/app/javascript/controllers/invoice_autotax_counter_controller.js new file mode 100644 index 000000000..ecaffc5cd --- /dev/null +++ b/app/javascript/controllers/invoice_autotax_counter_controller.js @@ -0,0 +1,51 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + static targets = ["result", "dropdown", "totalprice", "tax", "taxDescription"] + static values = { + template: String, + taxTemplate: String, + dirtyprice: Number, + invoiceUpdateUrl: String + } + + connect() { + this.updateTax(); + } + + count(taxValue) { + const tax = parseFloat(taxValue); + + // .replace('{tax}', (tax * 100.0).toFixed(2)) + + let dirtypriceValue = parseFloat(this.dirtypriceValue); + let taxAmount = dirtypriceValue * tax; + + this.taxDescriptionTarget.innerHTML = this.taxTemplateValue.replace('{tax}', (tax * 100).toFixed(2)); + this.taxTarget.innerHTML = taxAmount.toFixed(2); + this.totalpriceTarget.innerHTML = this.templateValue.replace('{price}', (dirtypriceValue + taxAmount).toFixed(2)); + + // const value = parseFloat(event.target.value) + // const result = this.resultTarget + + // if (!isNaN(value) && value > 0) { + // const tax = parseFloat(this.taxValue) || 0.0; + // const taxAmount = value * tax; + // const totalAmount = value + taxAmount; + + // result.innerHTML = this.templateValue.replace('{price}', totalAmount.toFixed(2)).replace('{tax}', (tax * 100.0).toFixed(2)); + // } else { + // result.innerHTML = this.defaulttemplateValue; + // } + } + + updateTax(event) { + // let selectElement = this.element.querySelector('select'); + // this.taxValue = selectElement.options[selectElement.selectedIndex].dataset.vatRate || 0.0; + // const priceElement = this.element.querySelector(this.priceElementValue); + + // this.count({target: priceElement}); + let taxValue = this.dropdownTarget.options[this.dropdownTarget.selectedIndex].dataset.vatRate || 0.0; + this.count(taxValue); + } +} diff --git a/app/javascript/controllers/modals/modal_controller.js b/app/javascript/controllers/modals/modal_controller.js index 139dfbfb9..efc1220ac 100644 --- a/app/javascript/controllers/modals/modal_controller.js +++ b/app/javascript/controllers/modals/modal_controller.js @@ -3,30 +3,20 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = ["modal"] - connect() { - console.log('Modal connected'); - } - open(event) { event.preventDefault(); this.modalTarget.showModal(); this.modalTarget.addEventListener('click', (e) => this.backdropClick(e)); - - console.log('Modal opened'); } close(event) { event.preventDefault(); this.modalTarget.close(); - console.log('Modal close'); - } backdropClick(event) { event.target === this.modalTarget && this.close(event); - console.log('Modal close'); - } } diff --git a/app/javascript/controllers/profile_webpush_controller.js b/app/javascript/controllers/profile_webpush_controller.js index 18ce99efc..ceb60d54d 100644 --- a/app/javascript/controllers/profile_webpush_controller.js +++ b/app/javascript/controllers/profile_webpush_controller.js @@ -24,8 +24,6 @@ export default class extends Controller { } setupPushNotifications() { - console.log('webpush action!'); - const applicationServerKey = this.urlBase64ToUint8Array(this.vapidPublicValue); navigator.serviceWorker.register("/service-worker.js", {scope: "./" }).then((registration) => { diff --git a/app/javascript/controllers/push_notification_controller.js b/app/javascript/controllers/push_notification_controller.js index f86907f97..0df6ac1f7 100644 --- a/app/javascript/controllers/push_notification_controller.js +++ b/app/javascript/controllers/push_notification_controller.js @@ -45,8 +45,6 @@ export default class extends Controller { setupPushNotifications() { const applicationServerKey = this.urlBase64ToUint8Array(this.vapidPublicValue); - console.log(this.vapidPublicValue); - navigator.serviceWorker.register("/service-worker.js", {scope: "./" }).then((registration) => { console.log('Service Worker registered successfully:', registration); diff --git a/app/javascript/controllers/table/tab_controller.js b/app/javascript/controllers/table/tab_controller.js index ea7e36792..595bb606a 100644 --- a/app/javascript/controllers/table/tab_controller.js +++ b/app/javascript/controllers/table/tab_controller.js @@ -9,8 +9,6 @@ export default class extends Controller { } connect() { - console.log(this.payablebtnTargets); - if (this.payablebtnTargets.length > 0) { this.payablebtnTargets[0].style.display = "block" this.payablebtnTargets[1].style.display = "none" diff --git a/app/models/wishlist_item.rb b/app/models/wishlist_item.rb index 245e96e0d..113449b08 100644 --- a/app/models/wishlist_item.rb +++ b/app/models/wishlist_item.rb @@ -76,7 +76,7 @@ def valid_domain_extension domain_extension = Setting.find_by(code: 'wishlist_supported_domain_extensions').retrieve return if domain_extension.empty? || domain_extension.include?(domain_name.split('.', 2).last) - errors.add(:domain_name, :invalid) if errors[:domain_name].blank? + errors.add(:domain_name, I18n.t('wishlist_items.invalid_domain_zone')) if errors[:domain_name].blank? end def restrictions_for_active_auctions diff --git a/app/packs/entrypoints/controllers/check_controller.js b/app/packs/entrypoints/controllers/check_controller.js index d7007e63c..604c46871 100644 --- a/app/packs/entrypoints/controllers/check_controller.js +++ b/app/packs/entrypoints/controllers/check_controller.js @@ -2,11 +2,16 @@ import { Controller } from "@hotwired/stimulus" export default class extends Controller { - initialize() { + connect() { const checker = document.getElementById('check_all'); + + console.log('check_controller.js'); + checker.addEventListener('click', (source) => { var checkboxes = document.querySelectorAll('[id^="auction_elements_auction_ids"]'); + console.log(checkboxes); + for (var i = 0; i < checkboxes.length; i++) { checkboxes[i].checked = !checkboxes[i].checked; } diff --git a/app/packs/entrypoints/controllers/countdown_controller.js b/app/packs/entrypoints/controllers/countdown_controller.js index db7b96810..c1253664b 100644 --- a/app/packs/entrypoints/controllers/countdown_controller.js +++ b/app/packs/entrypoints/controllers/countdown_controller.js @@ -11,8 +11,6 @@ export default class extends Controller { if (this.dateValue) { this.endTime = new Date(this.dateValue).getTime(); - // console.log(this.dateValue); - this.update(); this.timer = setInterval(() => { this.update(); diff --git a/app/packs/entrypoints/controllers/push_notification_controller.js b/app/packs/entrypoints/controllers/push_notification_controller.js index 4a6e08fe7..679fc1432 100644 --- a/app/packs/entrypoints/controllers/push_notification_controller.js +++ b/app/packs/entrypoints/controllers/push_notification_controller.js @@ -42,8 +42,6 @@ export default class extends Controller { setupPushNotifications() { const applicationServerKey = this.urlBase64ToUint8Array(this.vapidPublicValue); - console.log(this.vapidPublicValue); - navigator.serviceWorker.register("/service-worker.js", {scope: "./" }).then((registration) => { console.log('Service Worker registered successfully:', registration); diff --git a/app/views/admin/auctions/_auction.html.erb b/app/views/admin/auctions/_auction.html.erb index 2ec30eba8..b50e5de0e 100644 --- a/app/views/admin/auctions/_auction.html.erb +++ b/app/views/admin/auctions/_auction.html.erb @@ -6,7 +6,7 @@ <%# TODO: Refactor this nested elements and move to the components %> <%= form.label "auction_ids_#{auction.id}", class: 'o-checkbox' do %> - <%= form.check_box :auction_ids, { multiple: true, data: { form__bundle_checkbox_target: 'checkboxes' } }, auction.id, nil %> + <%= form.check_box :auction_ids, { multiple: true, data: { form__bundle_checkbox_target: 'checkboxes', form__check_all_target: 'checkboxes' } }, auction.id, nil %>
<% end %> diff --git a/app/views/admin/auctions/index.html.erb b/app/views/admin/auctions/index.html.erb index f442242b7..081bf823d 100644 --- a/app/views/admin/auctions/index.html.erb +++ b/app/views/admin/auctions/index.html.erb @@ -1,7 +1,7 @@ <%= component 'common/hero', title: t('.title') %>
-
+

<%= t('.auctions.filter_panel') %>

<%= form_with url: admin_auctions_path, method: :get, data: { controller: 'form--debounce', form__debounce_target: 'form', turbo_action: "advance", @@ -82,7 +82,8 @@
diff --git a/app/views/admin/invoices/show.html.erb b/app/views/admin/invoices/show.html.erb index 2a4b59aad..d3e6a181f 100644 --- a/app/views/admin/invoices/show.html.erb +++ b/app/views/admin/invoices/show.html.erb @@ -1,4 +1,5 @@ -<%= component 'common/hero', title: t('.title') %> +<%= component 'common/hero', title: t('.title', invoice_number: @invoice&.number) %> +
<%= link_to t(:versions_name), admin_invoice_versions_path(@invoice), class: "ui button primary" %> diff --git a/app/views/invoices/_invoice_information.html.erb b/app/views/invoices/_invoice_information.html.erb new file mode 100644 index 000000000..61a4b1ff0 --- /dev/null +++ b/app/views/invoices/_invoice_information.html.erb @@ -0,0 +1,97 @@ +
+
+
+ + <%= form_with model: invoice, url: invoice_path(invoice.uuid), data: { controller: 'form--debounce', action: 'change->form--debounce#search', form__debounce_target: 'form' } do |f| %> + <%= component 'common/form/label', form: f, attribute: :billing_profile_id, title: t('billing_profiles_name') %> + + <%= component 'common/form/dropdown_input', form: f, attribute: :billing_profile_id, + enum: options_for_select(BillingProfile.where(user_id: invoice.user_id).pluck(:name, :id), params[:billing_profile_id].presence || invoice.billing_profile_id), + first_options: { include_blank: false } %> + <% end %> +
+ +
+ + <%= Setting.find_by(code: 'invoice_issuer').retrieve %> +
+ +
+ +
+
+ + <%= @invoice.address %> +
+ +
+ + <%= Setting.find_by(code: 'invoice_issuer_address').retrieve %> +
+
+ + <%= Setting.find_by(code: 'invoice_issuer_reg_no').retrieve %> +
+
+ + <%= Setting.find_by(code: 'invoice_issuer_vat_number').retrieve %> +
+
+
+ +
+ + + + + + + + + + + + + + + <% invoice.items.each_with_index do |item, index| %> + + + + + + <% end %> + + + + + + + + + + + + + + <% if invoice.enable_deposit? %> + + + + + + <% end %> + + + + + + + + +
#<%= t('invoices.item') %><%= t('invoices.price') %>
<%= index + 1 %><%= I18n.t('invoice_items.name', + domain_name: item.invoice.result.auction.domain_name, + auction_end: item.invoice.result.auction.ends_at.to_date) %> + <%= item.price %>
2<%= t('invoices.vat_amount') %> <%= number_to_percentage(invoice.vat_rate * 100, precision: 0) %><%= t('offers.price_in_currency', price: invoice.vat) %>
3<%= t('invoices.total') %><%= t('offers.price_in_currency', price: invoice.total + (invoice.enable_deposit? ? invoice.deposit : 0.0)) %>
4<%= t('invoices.deposit') %><%= t('offers.price_in_currency', price: invoice.deposit) %>
<%= t('invoices.show.total_amount') %><%= t('offers.price_in_currency', price: invoice.total) %>
+ +
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 495a826d1..8043d9ce3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -49,7 +49,7 @@ <%= turbo_frame_tag :flash do %> <%= turbo_stream_from current_user, :flash %> -
+
<%= render partial: 'common/flash', locals: { flash: flash } %>
<% end %> diff --git a/app/views/wishlist_items/_editable.html.erb b/app/views/wishlist_items/_editable.html.erb index e4ffa37fd..12a6bb761 100644 --- a/app/views/wishlist_items/_editable.html.erb +++ b/app/views/wishlist_items/_editable.html.erb @@ -20,7 +20,7 @@ <%= component 'common/form/number_field', form: f, attribute: :price, options: { min: 5, step: "0.01", placeholder: item.price } %> <%# TODO: NEED TO MOVE TO COMPONENT %> - <%= f.button class: "c-btn c-btn--ghost c-btn--icon", data: { turbo_frame: 'wishlist_table' } do %> + <%= f.button data: { turbo_frame: 'wishlist_table' }, style: "background: none; border: none; padding: 0; margin: 0; text-align: left; color: inherit; font: inherit; cursor: pointer;" do %> @@ -32,7 +32,7 @@
- <%= component 'common/action_button', type: 'close', href: '#', options: { data: { turbo_frame: 'wishlist_table' } } %> + <%= component 'common/action_button', type: 'close', href: '#', options: { data: { turbo_frame: 'wishlist_table' }, style: 'border: none;' } %>
diff --git a/config/locales/auctions.en.yml b/config/locales/auctions.en.yml index 47254aea0..50e836429 100644 --- a/config/locales/auctions.en.yml +++ b/config/locales/auctions.en.yml @@ -32,6 +32,7 @@ en: blind_auction: Blind auction english_auction: English auction all: All + type: Type still_in_progress: "Still in progress" diff --git a/config/locales/auctions.et.yml b/config/locales/auctions.et.yml index f6db130d1..a29f9e0da 100644 --- a/config/locales/auctions.et.yml +++ b/config/locales/auctions.et.yml @@ -31,6 +31,7 @@ et: blind_auction: Pime oksjon english_auction: Inglise oksjon all: Kõik + type: Tüüp still_in_progress: "Töötlemisel" diff --git a/config/locales/en.yml b/config/locales/en.yml index f4896149f..020ca6d54 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -55,6 +55,7 @@ en: errors_name: "Errors" statistics_name: "Statistics" paid_deposits_name: "Paid deposits" + actions_name: "Actions" unsubscribe_mailer_text: "I do not wish to receive daily summary about currently auctioned domains any more" @@ -167,7 +168,8 @@ en: errors: format: "%{message}" messages: - taken: "%{attribute} on juba võetud" + taken: "%{attribute} is already taken" + invalid: "%{attribute} is invalid" activerecord: errors: models: diff --git a/config/locales/english_offers.ee.yml b/config/locales/english_offers.ee.yml index 32da3f9a8..063ebf90a 100644 --- a/config/locales/english_offers.ee.yml +++ b/config/locales/english_offers.ee.yml @@ -7,12 +7,14 @@ et: price_is_without_vat: "Pakkumus ei sisalda käibemaksu." price_with_wat: Kokku %{price} (+ %{tax}% käibemaks) price_with_wat_template: Kokku {price} (+ {tax}% käibemaks) + price_in_currency_template: "{price} €" + tax_template: "Käibemaks {tax}%" already_exists: "Oled sellele oksjonile pakkumuse juba esitanud." errors: "seda pakkumust ei saa salvestada" total: "Hind käibemaksuga" must_be_active: "Oksjon on lõppenud" must_be_active_err: "on lõppenud" - must_be_higher_than: "peab olema suurem kui %{minimum}" + must_be_higher_than: "Hind peab olema suurem kui %{minimum}" reminder: | NB: Tegemist on pimeoksjoniga, kus pakkumised ei ole nähtavad. Domeeninimele võib olla ka teisi pakkujaid. diff --git a/config/locales/english_offers.en.yml b/config/locales/english_offers.en.yml index 1ad89e709..cb2d537b5 100644 --- a/config/locales/english_offers.en.yml +++ b/config/locales/english_offers.en.yml @@ -8,10 +8,12 @@ en: price_is_without_vat: "The offer does not include VAT." price_with_wat: Total %{price} (+ %{tax}% VAT) price_with_wat_template: Total {price} (+ {tax}% VAT) + price_in_currency_template: "{price} €" + tax_template: "VAT {tax}%" already_exists: "You already have an offer for this auction." must_be_active: "This auction has ended" must_be_active_err: "has ended" - must_be_higher_than: "must be higher than %{minimum}" + must_be_higher_than: "Price must be higher than %{minimum}" reminder: | NB: This is a blind auction where bids are not public. There might be other bids. diff --git a/config/locales/et.yml b/config/locales/et.yml index 82e4250b6..d106f55c1 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -27,7 +27,7 @@ et: billing: "Arveldamine" new_billing_profile: "Uus arve aadress" - profile: "Kasutaja konto" + profile: "Kasutajakonto" sign_in: "Sisene" sign_out: "Logi välja" forgot_your_password: "Unustasid salasõna?" @@ -53,6 +53,7 @@ et: bans_name: "Keelud" errors_name: "Vead" paid_deposits_name: "Deposiidi maksed" + actions_name: "Tegevused" unsubscribe_mailer_text: "Ei soovi enam saada oksjonil olevate domeenide nimekirja meilile" @@ -133,6 +134,7 @@ et: format: "%{message}" messages: taken: "%{attribute} on juba võetud" + invalid: "%{attribute} on vigane" activerecord: errors: models: diff --git a/config/locales/invoices.en.yml b/config/locales/invoices.en.yml index 43c778dbb..78e202775 100644 --- a/config/locales/invoices.en.yml +++ b/config/locales/invoices.en.yml @@ -3,6 +3,8 @@ en: billing_profile_must_belong_to_user: "must belong to the same user as invoice" is_being_generated: "We are generating the invoice, please check back in a few minutes." + invoice_already_paid: "Invoice is already paid." + issue_date: "Issue date" issuer: "Issuer" issued_for: "Issued for" @@ -58,6 +60,7 @@ en: pay: "Pay" redeem: Paying for cancelled invoice will redeem the violation but will not grant priority right to register that domain send_e_invoice: "Send E-Invoice" + total_amount: "Total amount due" edit: title: "Edit your invoice" diff --git a/config/locales/invoices.et.yml b/config/locales/invoices.et.yml index bb8c1e216..f09fbb0c2 100644 --- a/config/locales/invoices.et.yml +++ b/config/locales/invoices.et.yml @@ -3,6 +3,8 @@ et: billing_profile_must_belong_to_user: "must belong to the same user as invoice" is_being_generated: "We are generating the invoice, please check back in a few minutes." + invoice_already_paid: "Arve on juba makstud." + issue_date: "Arve kuupäev" issuer: "Väljastaja" issued_for: "Arve saaja" @@ -59,6 +61,7 @@ et: pay: "Maksa" redeem: Tühistatud arve tasumine eemaldab vastava arvega seotud rikkumise, kuid ei anna vastava domeeni registreerimiseks eelisõigust. send_e_invoice: "Saada E-Arve" + total_amount: "Kokku vaja tasuda" edit: title: "Muuda arvet" diff --git a/config/locales/notifications.en.yml b/config/locales/notifications.en.yml index cdc5829c1..5043ee75e 100644 --- a/config/locales/notifications.en.yml +++ b/config/locales/notifications.en.yml @@ -2,5 +2,6 @@ en: notifications: read_all: 'Read all notifications' show_all: 'Show all notifications' - unreaded_notifications: 'Unreaded notifications' - readed_notifications: 'Readed notifications' \ No newline at end of file + unreaded_notifications: 'Unread notifications' + readed_notifications: 'Read notifications' + all_marked_as_read: 'All notifications marked as read' \ No newline at end of file diff --git a/config/locales/notifications.et.yml b/config/locales/notifications.et.yml index c2e66b659..21b9942b3 100644 --- a/config/locales/notifications.et.yml +++ b/config/locales/notifications.et.yml @@ -3,4 +3,5 @@ et: read_all: 'Loe kõik teated' show_all: 'Näita kõiki teateid' unreaded_notifications: 'Lugemata teated' - readed_notifications: 'Loetud teated' \ No newline at end of file + readed_notifications: 'Loetud teated' + all_marked_as_read: 'Kõik teated märgitud loetuks' \ No newline at end of file diff --git a/config/locales/offers.en.yml b/config/locales/offers.en.yml index 7ea08447b..d4120db1d 100644 --- a/config/locales/offers.en.yml +++ b/config/locales/offers.en.yml @@ -9,7 +9,7 @@ en: price_with_wat: Total %{price} (+ %{tax}% VAT) already_exists: "You already have an offer for this auction." must_be_active: "must be active" - must_be_higher_than: "must be higher than %{minimum}" + must_be_higher_than: "Price must be higher than %{minimum}" reminder: | NB: This is a blind auction where bids are not public. There might be other bids. diff --git a/config/locales/offers.et.yml b/config/locales/offers.et.yml index 75b83af70..f76dd7a3a 100644 --- a/config/locales/offers.et.yml +++ b/config/locales/offers.et.yml @@ -10,7 +10,7 @@ et: errors: "seda pakkumust ei saa salvestada" total: "Hind käibemaksuga" must_be_active: "peab olema aktiivne" - must_be_higher_than: "peab olema suurem kui %{minimum}" + must_be_higher_than: "Hind peab olema suurem kui %{minimum}" reminder: | NB: Tegemist on pimeoksjoniga, kus pakkumised ei ole nähtavad. Domeeninimele võib olla ka teisi pakkujaid. diff --git a/config/locales/wishlist_items.en.yml b/config/locales/wishlist_items.en.yml index d943588ec..c8fd88b68 100644 --- a/config/locales/wishlist_items.en.yml +++ b/config/locales/wishlist_items.en.yml @@ -2,6 +2,10 @@ en: wishlist_items: too_many_items: "Wishlist has too many items" in_progress: "Auction already in game" + invalid_domain_zone: "Invalid domain zone" + + editable: + confirm_delete: "Are you sure you want to remove this domain from your wishlist?" index: new_item: "Add domain to wishlist" diff --git a/config/locales/wishlist_items.et.yml b/config/locales/wishlist_items.et.yml index 3924632ff..27c7ca372 100644 --- a/config/locales/wishlist_items.et.yml +++ b/config/locales/wishlist_items.et.yml @@ -2,19 +2,23 @@ et: wishlist_items: too_many_items: "Soovide nimekiri suuruse piirang on ületatud" in_progress: "Oksjon juba mängus" + invalid_domain_zone: "Vigane domeeni tsoon" + + editable: + confirm_delete: "Kas oled kindel, et soovid domeeninime eemaldada oma soovide nimekirjast?" index: new_item: "Lisa uus domeeninimi" limit_html: "Nimekirja saad lisada kuni %{limit} domeeninime." list_title: "Lisa domeeninimi oma soovide nimekirja." list_description: | - Täpitähed on olulised - päev.ee ei ole sama mis paev.ee + Täpitähed on olulised - päev.ee ei ole sama mis paev.ee. my_bid: "Minu pakkumus" my_bid_tooltip: "Sellele summale teeb süsteem teie nimel automaatselt pakkumise kohe kui vastav domeen läheb oksjonile. Saate oma pakkumist kuni oksjoni lõpuni vabalt muuta." notification_title: "Oota teadet" notification_description: | - Saadame epostiga teate, kui soovitud domeeninimi läheb oksjonile. + Saadame e-postiga teate, kui soovitud domeeninimi läheb oksjonile. Võib minna väga kaua aega enne kui domeeninimi jõuab oksjonile seepärast kirjed nimekirjas ei aegu. change_starting_price: Muuda