monopyly 1.6.1__tar.gz → 1.6.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {monopyly-1.6.1 → monopyly-1.6.2}/PKG-INFO +6 -6
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/CHANGELOG.md +8 -0
- monopyly-1.6.2/monopyly/_version.py +34 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/parser.py +1 -1
- monopyly-1.6.2/monopyly/static/js/bind-tag-actions.js +211 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/highlight-discrepant-transactions.js +1 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/tag_tree.html +4 -1
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/tags_page.html +3 -1
- {monopyly-1.6.1 → monopyly-1.6.2}/pyproject.toml +5 -5
- monopyly-1.6.1/monopyly/_version.py +0 -16
- monopyly-1.6.1/monopyly/static/js/bind-tag-actions.js +0 -123
- {monopyly-1.6.1 → monopyly-1.6.2}/.gitignore +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/COPYING +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/LICENSE +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/README.md +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/README.md +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/__init__.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/actions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/blueprint.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/routes.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/auth/tools.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/accounts.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/actions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/banks.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/blueprint.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/filters.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/forms.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/routes.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/banking/transactions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/__init__.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/_forms.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/fields.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/utils.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/forms/validators.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/transactions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/common/utils.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/actions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/blueprint.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/context_processors.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/errors.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/filters.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/internal_transactions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/core/routes.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/accounts.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/actions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/blueprint.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/cards.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/forms.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/routes.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/statements.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/__init__.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/_transactions.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/__init__.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/data.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/credit/transactions/activity/reconciliation.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/__init__.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/models.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/preloads.sql +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/schema.sql +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/database/views.sql +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/scripts/screenshot_application.py +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/chartist-1.5.0.min.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/css/style.css +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/browserconfig.xml +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-114.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-120.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-144.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-150.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-152.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-16.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-160.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-180.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-192.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-310.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-32.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-57.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-60.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-64.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-70.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-72.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-76.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon-96.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon.ico +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/favicon/favicon.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-details.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-account-summaries.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/bank-accounts.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-account-details.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-statement-details.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/credit-transactions.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/homepage-user.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/homepage.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/about/statement-details.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/chase-card.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/discover-card.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/new-card.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/cards/template-card.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-down.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-left.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/arrow-up.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/checkmark.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-orange.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/delete.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/edit.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/link.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/minus-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/minus.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/plus-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/plus.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/refresh.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/save.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/sort-asc.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/sort-desc.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement-pair.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/statement.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/icons/x-thick.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/img/statement.png +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/jquery-3.7.1.min.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/add-subtransaction.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/add-transfer.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/autocomplete-transaction.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/create-balance-chart.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/create-category-chart.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/define-filter.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-account-type-inputs.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-bank-inputs.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/display-new-credit-account-inputs.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-bank-account.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-bank.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/expand-transaction.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/flip-card.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/hide-homepage-block.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/infer-card.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/infer-statement.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/load-more-transactions.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/make-payment.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/ajax.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/autocomplete-input.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/expand-box-row.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/expand-transaction.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/form-suggestions.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-acquisition-form.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-overlays.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/manage-subforms.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/update-database-widget.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/modules/update-display-ajax.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/show-credit-activity-loader.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/show-linked-transaction.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/toggle-navigation.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-account-statement-parameters.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-bank-name.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-card-status.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-statement-parameters.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-statements-display.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/update-transactions-display.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/use-suggested-amount.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/static/js/use-suggested-merchant.js +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/change_password.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/login.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/auth/register.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_form/account_form_page_new.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summaries_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/account_summary.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/accounts_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/bank_info_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_new.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transaction_form_page_update.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transaction_form/transfer_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/condensed_row_content.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/expanded_row_content.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/table.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transaction_field_titles.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/banking/transactions_table/transactions.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/form_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subform.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/subtransaction_subform.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transaction_form/transaction_form_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_bank_transaction.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_credit_transaction.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/linked_transaction_overlay.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/subtransactions.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/table.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_condensed.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transaction_expanded.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/common/transactions_table/transactions.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/credits.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/400.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/401.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/403.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/404.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/405.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/408.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/418.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/425.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/500.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/errors/error.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/index.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/profile.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/core/story.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/account_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/card_form_page_new.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_form/transfer_statement_inquiry.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_back.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_graphic/card_front.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/card_submission_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/cards.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/cards_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/discrepant_records.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_inquiry.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/summary.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_reconciliation/unrecorded_activities.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statement_summary.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statements.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/statements_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_new.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_form/transaction_form_page_update.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transaction_submission_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_page.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/condensed_row_content.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/expanded_row_content.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/table.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transaction_field_titles.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/credit/transactions_table/transactions.html +0 -0
- {monopyly-1.6.1 → monopyly-1.6.2}/monopyly/templates/layout.html +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: monopyly
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.2
|
|
4
4
|
Summary: A homemade personal finance manager.
|
|
5
5
|
Project-URL: Download, https://pypi.org/project/monopyly
|
|
6
6
|
Project-URL: Homepage, http://monopyly.com
|
|
@@ -23,15 +23,15 @@ Classifier: Topic :: Office/Business :: Financial
|
|
|
23
23
|
Classifier: Topic :: Office/Business :: Financial :: Accounting
|
|
24
24
|
Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
|
|
25
25
|
Requires-Python: >=3.10
|
|
26
|
-
Requires-Dist: dry-foundation==1.6.
|
|
26
|
+
Requires-Dist: dry-foundation==1.6.2
|
|
27
27
|
Requires-Dist: flask-wtf==1.2.2
|
|
28
28
|
Requires-Dist: flask==3.1.2
|
|
29
|
-
Requires-Dist: gunicorn==
|
|
30
|
-
Requires-Dist: markdown==3.10
|
|
29
|
+
Requires-Dist: gunicorn==25.0.1
|
|
30
|
+
Requires-Dist: markdown==3.10.1
|
|
31
31
|
Requires-Dist: nltk==3.9.2
|
|
32
32
|
Requires-Dist: python-dateutil==2.9.0
|
|
33
|
-
Requires-Dist: rich==14.2
|
|
34
|
-
Requires-Dist: sqlalchemy==2.0.
|
|
33
|
+
Requires-Dist: rich==14.3.2
|
|
34
|
+
Requires-Dist: sqlalchemy==2.0.46
|
|
35
35
|
Description-Content-Type: text/markdown
|
|
36
36
|
|
|
37
37
|
<div id="header">
|
|
@@ -244,4 +244,12 @@
|
|
|
244
244
|
- Bump dependencies
|
|
245
245
|
|
|
246
246
|
|
|
247
|
+
### 1.6.2
|
|
248
|
+
|
|
249
|
+
- Fix bug in the transaction tag tree template preventing new subtags in the same subtag subtree
|
|
250
|
+
- Refactor JavaScript used to manage the transaction tag tree
|
|
251
|
+
- Add specificity to the reconciliation tool when parsing payment columns (when otherwise unidentified, payment transactions are determined by the presence of the isolated word "payment" in the description field)
|
|
252
|
+
- Bump dependencies
|
|
253
|
+
|
|
254
|
+
|
|
247
255
|
<a name="bottom" id="bottom"></a>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# file generated by setuptools-scm
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
TYPE_CHECKING = False
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from typing import Tuple
|
|
16
|
+
from typing import Union
|
|
17
|
+
|
|
18
|
+
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
20
|
+
else:
|
|
21
|
+
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
23
|
+
|
|
24
|
+
version: str
|
|
25
|
+
__version__: str
|
|
26
|
+
__version_tuple__: VERSION_TUPLE
|
|
27
|
+
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
30
|
+
|
|
31
|
+
__version__ = version = '1.6.2'
|
|
32
|
+
__version_tuple__ = version_tuple = (1, 6, 2)
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = None
|
|
@@ -213,7 +213,7 @@ class _TransactionActivityParser:
|
|
|
213
213
|
def _infer_payment_row(row):
|
|
214
214
|
# Infer whether the row constitutes a payment transaction
|
|
215
215
|
contextual_info = [row[i].lower() for i in contextual_column_indices]
|
|
216
|
-
return any("payment" in element for element in contextual_info)
|
|
216
|
+
return any("payment" in element.split() for element in contextual_info)
|
|
217
217
|
|
|
218
218
|
payment_rows = list(filter(_infer_payment_row, raw_data))
|
|
219
219
|
return self._extrapolate_payments_positive(payment_rows, raw_data)
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Add a transaction tag on the 'Transaction Tags' page.
|
|
3
|
+
*
|
|
4
|
+
* Adds a transaction tag under the tag or category corresponding to the
|
|
5
|
+
* plus icon that is clicked. Clicking the plus icon adds a tag shaped
|
|
6
|
+
* input box that accepts a new tag name. Once the input loses focus,
|
|
7
|
+
* an AJAX request is executed, the database is updated and the tree of
|
|
8
|
+
* transactions is partially refreshed to allow further additions. If no
|
|
9
|
+
* tag name was provided, no request occurs.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { executeAjaxRequest } from './modules/ajax.js';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
(function() {
|
|
16
|
+
// Identify the buttons
|
|
17
|
+
const $createTagButtons = $('#transaction-tags .new-tag.button');
|
|
18
|
+
const $deleteTagButtons = $('#transaction-tags .action.button.delete');
|
|
19
|
+
bindTagButtonBehavior($createTagButtons, $deleteTagButtons);
|
|
20
|
+
|
|
21
|
+
})();
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create the tag manager.
|
|
26
|
+
*
|
|
27
|
+
* @param {JQuery} $createTagButtons - Buttons for adding subtags to one or
|
|
28
|
+
* more tags.
|
|
29
|
+
* @param {JQuery} $deleteTagButtons - Buttons for removing tags.
|
|
30
|
+
*/
|
|
31
|
+
function bindTagButtonBehavior($createTagButtons, $deleteTagButtons) {
|
|
32
|
+
console.log('bind create buttons', $createTagButtons);
|
|
33
|
+
console.log('bind delete buttons', $deleteTagButtons);
|
|
34
|
+
$createTagButtons.on('click', function() {
|
|
35
|
+
const $button = $(this);
|
|
36
|
+
const behavior = new TagCreation($button);
|
|
37
|
+
behavior.perform();
|
|
38
|
+
});
|
|
39
|
+
$deleteTagButtons.on('click', function() {
|
|
40
|
+
const $button = $(this);
|
|
41
|
+
const behavior = new TagDeletion($button);
|
|
42
|
+
behavior.perform();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* A class for managing transaction tags and the behavior of their buttons.
|
|
49
|
+
*/
|
|
50
|
+
class TagButtonBehavior {
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Create the tag manager.
|
|
54
|
+
*
|
|
55
|
+
* @param {JQuery} $button - A button belonging to a tag.
|
|
56
|
+
*/
|
|
57
|
+
constructor($button) {
|
|
58
|
+
this.$container = $button.closest('.tag-container');
|
|
59
|
+
this.$tag = this.$container.children('.tag-area').find('.tag');
|
|
60
|
+
this.$tags = this.$container.children('ul.tags');
|
|
61
|
+
this.$input = this.$tags.children('input.new-tag');
|
|
62
|
+
// Set animation parameters
|
|
63
|
+
this.slideTime = 300;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A class for managing transaction tags creation behavior.
|
|
70
|
+
*/
|
|
71
|
+
class TagCreation extends TagButtonBehavior {
|
|
72
|
+
|
|
73
|
+
#endpoint = ADD_TAG_ENDPOINT;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Create the tag creator.
|
|
77
|
+
*
|
|
78
|
+
* @param {JQuery} $button - A button belonging to a tag.
|
|
79
|
+
*/
|
|
80
|
+
constructor($button) {
|
|
81
|
+
super($button);
|
|
82
|
+
self = this;
|
|
83
|
+
this.$input.on('blur', function() {
|
|
84
|
+
self.#dropInputFocus();
|
|
85
|
+
});
|
|
86
|
+
this.$input.on('keydown', function() {
|
|
87
|
+
if (event.key == 'Escape') {
|
|
88
|
+
self.#clearInput();
|
|
89
|
+
this.blur();
|
|
90
|
+
} else if (event.key == 'Enter') {
|
|
91
|
+
this.blur();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Perform the behavior.
|
|
98
|
+
*/
|
|
99
|
+
perform() {
|
|
100
|
+
this.#showInput();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Show the input box to collect new tag information.
|
|
105
|
+
*/
|
|
106
|
+
#showInput() {
|
|
107
|
+
console.log('showing input', this.$input);
|
|
108
|
+
self = this;
|
|
109
|
+
this.$input.slideDown(this.slideTime, function() {
|
|
110
|
+
self.$input.addClass('visible');
|
|
111
|
+
self.$input.focus();
|
|
112
|
+
console.log('focus', self.$input);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Perform a specific action when the input loses focus.
|
|
118
|
+
*/
|
|
119
|
+
#dropInputFocus() {
|
|
120
|
+
if (this.$input.val()) {
|
|
121
|
+
this.#createTag();
|
|
122
|
+
this.#hideFilledInput();
|
|
123
|
+
} else {
|
|
124
|
+
this.#hideEmptyInput();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create the new tag in the database.
|
|
130
|
+
*/
|
|
131
|
+
#createTag() {
|
|
132
|
+
const rawData = {
|
|
133
|
+
'tag_name': this.$input.val(),
|
|
134
|
+
'parent': this.$tag.text()
|
|
135
|
+
};
|
|
136
|
+
// Execute the AJAX request and place the new tag
|
|
137
|
+
executeAjaxRequest(this.#endpoint, rawData, this.#placeNewTag.bind(this));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Add the new tag to the DOM before the input.
|
|
142
|
+
*/
|
|
143
|
+
#placeNewTag(newTagHTML) {
|
|
144
|
+
const $newTag = $(newTagHTML);
|
|
145
|
+
this.$input.before($newTag);
|
|
146
|
+
// Bind behavior functionality to the newly created/placed tag buttons
|
|
147
|
+
bindTagButtonBehavior(
|
|
148
|
+
$newTag.find('.new-tag.button'), $newTag.find('.action.button.delete')
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Hide the input immediately.
|
|
154
|
+
*/
|
|
155
|
+
#hideFilledInput() {
|
|
156
|
+
this.$input.hide();
|
|
157
|
+
this.$input.removeClass('visible');
|
|
158
|
+
this.#clearInput();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Hide the (empty) input gracefully.
|
|
163
|
+
*/
|
|
164
|
+
#hideEmptyInput() {
|
|
165
|
+
this.$input.removeClass('visible');
|
|
166
|
+
this.$input.slideUp(this.slideTime);
|
|
167
|
+
console.log('hiding empty input', this.$input);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Clear the input.
|
|
172
|
+
*/
|
|
173
|
+
#clearInput() {
|
|
174
|
+
this.$input.val('');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* A class for managing transaction tags deletion behavior.
|
|
182
|
+
*/
|
|
183
|
+
class TagDeletion extends TagButtonBehavior {
|
|
184
|
+
|
|
185
|
+
#endpoint = REMOVE_TAG_ENDPOINT;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Perform the behavior.
|
|
189
|
+
*/
|
|
190
|
+
perform() {
|
|
191
|
+
if (this.#confirmDelete()) {
|
|
192
|
+
this.#removeTag();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Remove the tag from the database.
|
|
198
|
+
*/
|
|
199
|
+
#removeTag() {
|
|
200
|
+
const rawData = {'tag_name': this.$tag.html()};
|
|
201
|
+
// Execute the AJAX request to delete the tag
|
|
202
|
+
executeAjaxRequest(this.#endpoint, rawData);
|
|
203
|
+
// Remove the tag from the display
|
|
204
|
+
this.$container.slideUp(this.slideTime, function() {this.remove()});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
#confirmDelete() {
|
|
208
|
+
return confirm('Are you sure you want to delete this tag?');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
}
|
|
@@ -18,7 +18,10 @@
|
|
|
18
18
|
</li>
|
|
19
19
|
|
|
20
20
|
{% if loop.last %}
|
|
21
|
-
|
|
21
|
+
{# Do not create a new input for a tag when its subtree is updated #}
|
|
22
|
+
{% if new_tree or loop.depth0 != 0 %}
|
|
23
|
+
<input class="new-tag" type="text" />
|
|
24
|
+
{% endif %}
|
|
22
25
|
{% endif %}
|
|
23
26
|
{% else %}
|
|
24
27
|
<input class="new-tag" type="text" />
|
|
@@ -33,7 +33,9 @@
|
|
|
33
33
|
<div id="tags-container" class="tag-container">
|
|
34
34
|
|
|
35
35
|
<ul class="tags">
|
|
36
|
-
{%
|
|
36
|
+
{% with new_tree = True %}
|
|
37
|
+
{% include 'common/tag_tree.html' %}
|
|
38
|
+
{% endwith %}
|
|
37
39
|
</ul>
|
|
38
40
|
|
|
39
41
|
<img class="root new-tag button" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}" />
|
|
@@ -11,15 +11,15 @@ description = 'A homemade personal finance manager.'
|
|
|
11
11
|
license = { text = 'GNU GPLv3' }
|
|
12
12
|
requires-python = '>=3.10'
|
|
13
13
|
dependencies = [
|
|
14
|
-
'dry-foundation==1.6.
|
|
14
|
+
'dry-foundation==1.6.2',
|
|
15
15
|
'Flask==3.1.2',
|
|
16
16
|
'Flask-WTF==1.2.2',
|
|
17
|
-
'gunicorn==
|
|
18
|
-
'Markdown==3.10',
|
|
17
|
+
'gunicorn==25.0.1',
|
|
18
|
+
'Markdown==3.10.1',
|
|
19
19
|
'nltk==3.9.2',
|
|
20
20
|
'python-dateutil==2.9.0',
|
|
21
|
-
'rich==14.2
|
|
22
|
-
'SQLAlchemy==2.0.
|
|
21
|
+
'rich==14.3.2',
|
|
22
|
+
'SQLAlchemy==2.0.46',
|
|
23
23
|
]
|
|
24
24
|
keywords = [
|
|
25
25
|
'Finance',
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# file generated by setuptools_scm
|
|
2
|
-
# don't change, don't track in version control
|
|
3
|
-
TYPE_CHECKING = False
|
|
4
|
-
if TYPE_CHECKING:
|
|
5
|
-
from typing import Tuple, Union
|
|
6
|
-
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
7
|
-
else:
|
|
8
|
-
VERSION_TUPLE = object
|
|
9
|
-
|
|
10
|
-
version: str
|
|
11
|
-
__version__: str
|
|
12
|
-
__version_tuple__: VERSION_TUPLE
|
|
13
|
-
version_tuple: VERSION_TUPLE
|
|
14
|
-
|
|
15
|
-
__version__ = version = '1.6.1'
|
|
16
|
-
__version_tuple__ = version_tuple = (1, 6, 1)
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Add a transaction tag on the 'Transaction Tags' page.
|
|
3
|
-
*
|
|
4
|
-
* Adds a transaction tag under the tag or category corresponding to the
|
|
5
|
-
* plus icon that is clicked. Clicking the plus icon adds a tag shaped
|
|
6
|
-
* input box that accepts a new tag name. Once the input loses focus,
|
|
7
|
-
* an AJAX request is executed, the database is updated and the tree of
|
|
8
|
-
* transactions is partially refreshed to allow further additions. If no
|
|
9
|
-
* tag name was provided, no request occurs.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { executeAjaxRequest } from './modules/ajax.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
(function() {
|
|
16
|
-
|
|
17
|
-
const endpointAddTag = ADD_TAG_ENDPOINT;
|
|
18
|
-
const endpointRemoveTag = REMOVE_TAG_ENDPOINT;
|
|
19
|
-
// Set animation parameters
|
|
20
|
-
const slideTime = 300;
|
|
21
|
-
// Identify the buttons
|
|
22
|
-
const $buttonsAddTag = $('#transaction-tags .new-tag.button');
|
|
23
|
-
const $buttonsDelete = $('#transaction-tags .action.button.delete');
|
|
24
|
-
|
|
25
|
-
bindTagCreator($buttonsAddTag, $buttonsDelete);
|
|
26
|
-
|
|
27
|
-
function bindTagCreator($buttonsAddTag, $buttonsDelete) {
|
|
28
|
-
// Bind add tag buttons
|
|
29
|
-
$buttonsAddTag.on('click', function() {
|
|
30
|
-
const $container = $(this).closest('.tag-container');
|
|
31
|
-
const $tags = $container.children('ul.tags');
|
|
32
|
-
const $input = $tags.children('input.new-tag');
|
|
33
|
-
// Reveal the input
|
|
34
|
-
showInput($input);
|
|
35
|
-
// Perform actions when focus is lost
|
|
36
|
-
$input.on('blur', function() {
|
|
37
|
-
if ($input.val()) {
|
|
38
|
-
addNewTag($input, $container);
|
|
39
|
-
} else {
|
|
40
|
-
hideEmptyInput($input);
|
|
41
|
-
}
|
|
42
|
-
clearInput($input);
|
|
43
|
-
});
|
|
44
|
-
$input.on('keydown', function() {
|
|
45
|
-
if (event.which == 27) {
|
|
46
|
-
clearInput($input);
|
|
47
|
-
hideEmptyInput($input);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
// Bind remove tag buttons
|
|
52
|
-
$buttonsDelete.on('click', function() {
|
|
53
|
-
if (confirmDelete()) {
|
|
54
|
-
const $container = $(this).closest('.tag-container');
|
|
55
|
-
const $tag = $container.find('.tag').first();
|
|
56
|
-
// Remove the tag from the database
|
|
57
|
-
removeTag($tag);
|
|
58
|
-
// Remove the tag from the display
|
|
59
|
-
const $tagContainer = $tag.closest('.tag-area');
|
|
60
|
-
$tagContainer.slideUp(300, function() {
|
|
61
|
-
$(this).remove()
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function addNewTag($input, $container) {
|
|
68
|
-
// Add the input value to the database as a tag
|
|
69
|
-
const parentTag = $container.children('.tag-area').find('.tag').text()
|
|
70
|
-
const rawData = {
|
|
71
|
-
'tag_name': $input.val(),
|
|
72
|
-
'parent': parentTag
|
|
73
|
-
};
|
|
74
|
-
// Execute the AJAX request and display update
|
|
75
|
-
function addTag(response) {
|
|
76
|
-
// Add the AJAX request response to the DOM before the input
|
|
77
|
-
$input.before(response);
|
|
78
|
-
hideFilledInput($input);
|
|
79
|
-
// Bind the buttons for the newly added tag
|
|
80
|
-
const $buttonAddTag = $input.prev().find('.new-tag.button');
|
|
81
|
-
const $buttonRemoveTag = $input.prev().find('.action.button.delete');
|
|
82
|
-
bindTagCreator($buttonAddTag, $buttonRemoveTag);
|
|
83
|
-
}
|
|
84
|
-
executeAjaxRequest(endpointAddTag, rawData, addTag);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function showInput($input) {
|
|
88
|
-
$input.slideDown(slideTime, function() {
|
|
89
|
-
$input.addClass('visible');
|
|
90
|
-
$input.focus();
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function hideFilledInput($input) {
|
|
95
|
-
// Hide the input immediately
|
|
96
|
-
$input.hide();
|
|
97
|
-
$input.removeClass('visible');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
function hideEmptyInput($input) {
|
|
101
|
-
// Hide the input gracefully
|
|
102
|
-
$input.removeClass('visible');
|
|
103
|
-
$input.slideUp(slideTime);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function clearInput($input) {
|
|
107
|
-
// Clear the input
|
|
108
|
-
$input.val('');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function confirmDelete() {
|
|
112
|
-
return confirm('Are you sure you want to delete this tag?');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function removeTag($tag) {
|
|
116
|
-
// Get the name of the tag
|
|
117
|
-
const tagName = $tag.html();
|
|
118
|
-
const rawData = {'tag_name': tagName};
|
|
119
|
-
// Execute the AJAX request
|
|
120
|
-
executeAjaxRequest(endpointRemoveTag, rawData);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
})();
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|