1
0
Fork 0

Commits vergleichen

..

1215 Commits

Autor SHA1 Nachricht Datum
5fe63ec70e
test 2023-10-03 20:36:04 +02:00
6bc33ebd64
test 2023-10-03 20:25:00 +02:00
df456abda0
test3 2023-10-03 20:09:53 +02:00
df30ce32ee
test2 2023-10-03 19:54:15 +02:00
4750829e1a
testing 2023-10-03 19:35:16 +02:00
49535d88bb
set default type to business 2023-10-03 18:44:50 +02:00
Angus McLeod
d5aa616ff8 DEV: Add explicit ordering to more specs 2023-09-30 09:46:25 +08:00
Angus McLeod
578c92e90e
Merge pull request #269 from paviliondev/composer-control-feature
Composer control feature
2023-09-21 10:43:24 +10:00
jumagura
3d104406fd REFACTOR: Improve test for category chooser when there is a create_topic_wizard customfield 2023-09-20 03:55:32 -04:00
jumagura
0eb6fb1ae0 REFACTOR: Move before_create_topic event handler to plugin.rb 2023-09-19 20:46:42 -04:00
jumagura
0992e9601c DEV: Make hide category default when custom wizard is selected 2023-09-19 14:17:06 -04:00
jumagura
10609f33e2 FIX: linting error 2023-09-19 14:00:04 -04:00
jumagura
bb81c5700a DEV: Use Discourse Events instead of topic model 2023-09-19 13:57:11 -04:00
jumagura
03ef41f7f0 FIX: Linting error 2023-09-18 18:11:20 -04:00
jumagura
bdd290f4e6 FIX: Linting error 2023-09-18 18:07:27 -04:00
jumagura
2ab15aaf86 FIX: linting error 2023-09-18 18:06:52 -04:00
jumagura
de9dccf233 bump version 2023-09-18 17:46:41 -04:00
jumagura
bb3f0c6252 DEV: Add acceptance tests for category filtering 2023-09-18 17:41:24 -04:00
jumagura
61309fd320 DEV: Add initializer logic to filter categories 2023-09-18 17:40:44 -04:00
jumagura
b365b5dd4f DEV: Add custom_field 2023-09-18 17:40:07 -04:00
jumagura
de03cbd15a DEV: Implement control to hide category from composer dropdown in specified categories 2023-09-18 17:39:50 -04:00
jumagura
29d7818a4a DEV: Add spec for validation 2023-09-18 17:36:21 -04:00
jumagura
f2d1437cff DEV: Implement wizard replacement validation in Topic Creation 2023-09-18 17:35:38 -04:00
Angus McLeod
9ab4ca21c8
Merge pull request #268 from paviliondev/fix_export_size
FIX: avoid page limit on downloads
2023-09-16 16:03:15 +10:00
merefield
16109b01e7 bump patch 2023-09-15 16:19:09 +01:00
merefield
43cd090b17 FIX: avoid page limit on downloads 2023-09-15 16:15:31 +01:00
Angus McLeod
5f99dc226a
Merge pull request #267 from paviliondev/resolve_deprecations
COMPATIBILITY:  resolve deprecations expected in Ember upgrade for Discourse 3.2
2023-09-15 16:55:45 +10:00
merefield
2460685e65 remove unintentional comment 2023-09-15 07:04:17 +01:00
merefield
c6fded7113 fix disabled behaviour of start time button 2023-09-14 21:08:20 +01:00
merefield
713c1bcaa5 fix test 2023-09-14 20:47:05 +01:00
merefield
ffa37e895c fix test and test spelling 2023-09-14 20:35:30 +01:00
merefield
22fac139b6 linting 2023-09-14 20:08:10 +01:00
merefield
61ea75dcad remove debugger statement 2023-09-14 20:03:02 +01:00
merefield
766d3b5fc9 fix erroneous route transitions 2023-09-14 20:02:02 +01:00
merefield
a786b5956b linting 2023-09-14 19:21:10 +01:00
merefield
794b7c9d5c add missing I18n imports 2023-09-14 19:19:20 +01:00
merefield
76c359be3b linting 2023-09-14 19:16:59 +01:00
merefield
6572b32706 move modals to glimmer components 2023-09-14 19:14:44 +01:00
merefield
d71d9976b8 bump patch 2023-09-14 15:05:54 +01:00
merefield
27596a1624 linting 2023-09-14 15:03:15 +01:00
merefield
3c17ef574e linting 2023-09-14 14:59:22 +01:00
merefield
742239b023 add router service to controllers to avoid deprecation 2023-09-14 14:58:34 +01:00
merefield
33a320021f linting 2023-09-14 14:47:52 +01:00
merefield
e6f44b7dfc resolve a batch of router deprecations 2023-09-14 14:42:12 +01:00
merefield
31f917ec80 fix replaceWith calling style deprecation 2023-09-14 14:34:18 +01:00
merefield
6c0d7a671e more this additions 2023-09-14 14:18:47 +01:00
merefield
31b2625a65 add this to avoid deprecation 2023-09-14 14:05:55 +01:00
Robert
bce0acbfd2
Merge pull request #263 from paviliondev/update-compatibility-main
DEV: Pin plugin for Discourse 3.1 stable
2023-09-08 16:31:17 +01:00
Robert
b81bc762c7
Merge branch 'main' into update-compatibility-main 2023-09-08 16:21:00 +01:00
jumagura
785bce228e bump version 2023-09-08 10:02:12 -04:00
Angus McLeod
52efc15576
Merge pull request #265 from paviliondev/temp_ignore_redirect
FEATURE: implement a way to temporarily ignore redirect
2023-09-08 09:53:12 +02:00
merefield
ebc0f706e3 remove redundant assignment 2023-09-08 07:18:31 +01:00
merefield
050a38a9d3 make code testable, add test 2023-09-08 07:13:52 +01:00
merefield
8649ab2286 bump patch 2023-09-06 16:27:40 +01:00
merefield
037132fb1a prettier 2023-09-06 16:26:30 +01:00
merefield
8332818616 FEATURE: implement way to temporarily ignore redirect 2023-09-06 13:29:21 +01:00
jumagura
36d6f9bc6f bump version 2023-09-05 12:52:11 -04:00
jumagura
121d60330a DEV: Pin plugin for Discourse 3.1 stable 2023-09-05 12:49:58 -04:00
jumagura
13a1538eb9 DEV: Update compatibility for main branch 2023-09-05 12:38:25 -04:00
Angus McLeod
fee56c2d43
Merge pull request #261 from paviliondev/fix_submissions_data_export_content
SECURITY: remove sensitive user content from submissions export
2023-08-23 17:50:10 +02:00
merefield
da4fe79aea bump patch 2023-08-23 14:35:58 +01:00
merefield
0a450d58f4 SECURITY: remove sensitive user content from submissions export 2023-08-23 14:33:56 +01:00
Robert
b45e01803d
Merge pull request #260 from paviliondev/fix-hyperlink-modal-deprecation
COMPATIBILITY: Update insert-hyperlink invocation following core change
2023-08-15 07:52:08 +01:00
jumagura
b8cfaa7f23 bump version 2023-08-14 18:19:14 -04:00
jumagura
690f12ee3e COMPATIBILITY: Update insert-hyperlink invocation following core change 2023-08-14 18:17:57 -04:00
Angus McLeod
1f35b80f85
Merge pull request #247 from paviliondev/subscription_client_gem_update
Update subscription client class to support gem version of Subscription Client
2023-07-27 13:30:02 +02:00
merefield
72b1a2aca5 merge in main 2023-07-27 09:52:19 +01:00
Angus McLeod
f5129b7ffe
Merge pull request #257 from paviliondev/remove_category_custom_field_on_wizard_delete
FIX: Remove category custom field on wizard delete (Take Two)
2023-07-19 12:27:33 +01:00
merefield
a342626267 stick to one method for text conversion 2023-07-19 11:14:08 +01:00
merefield
3fe1a7c7e8 remove redundant downcasing 2023-07-19 09:23:48 +01:00
merefield
609df33680 downcase name for category cstm setting 2023-07-18 14:29:39 +01:00
merefield
ec739d0450 bump patch 2023-07-18 14:06:16 +01:00
merefield
c26a89a78a fix test 2023-07-18 14:05:09 +01:00
merefield
ec88af0cc0 FIX: also delete Category Cust Fld for wizrds with names of mult words 2023-07-18 13:53:09 +01:00
Angus McLeod
10d597c495
Merge pull request #256 from paviliondev/fix_timer_default_on_new_wizard
FIX: direct after start time default for new wizard
2023-07-17 12:01:49 +01:00
merefield
cc2eb8c742 linting 2023-07-17 10:55:44 +01:00
merefield
98fe9ce77f bump patch 2023-07-17 10:36:07 +01:00
merefield
55a4797e4f Merge branch 'main' into fix_timer_default_on_new_wizard 2023-07-17 10:35:37 +01:00
Angus McLeod
33da03b63a
Merge pull request #255 from paviliondev/remove_category_custom_field_on_wizard_delete
FIX: ensure related create topic wizard setting is removed when wizard is deleted
2023-07-17 10:32:58 +01:00
merefield
580889a34e move destroy logic into library method & transaction 2023-07-17 10:16:27 +01:00
merefield
8d32aebf05 FIX: direct after start time default for new wizard 2023-07-16 11:33:09 +01:00
merefield
b71f627d73 improve test explanation 2023-07-15 10:00:54 +01:00
merefield
1b93c06188 bump patch 2023-07-15 09:57:54 +01:00
merefield
4449ab7aff Add corresponding code to help pass test 2023-07-15 09:56:32 +01:00
merefield
1662ff166d Add failing test 2023-07-15 09:38:46 +01:00
Angus McLeod
270d7926cc
Merge pull request #253 from paviliondev/dont_rely_on_application_route_override
IMPROVE: Move pending wizard check to page change event
2023-07-14 08:19:45 +02:00
merefield
a13f7be6a3 revert remove redundant line as not redundant 2023-07-13 16:07:36 +01:00
merefield
f94df66613 move current user determination to api & remove redundant line 2023-07-13 16:04:31 +01:00
Robert Barrow
5aefa9c544 restore after directive 2023-07-12 12:53:20 +01:00
Robert Barrow
7861e37224 restore original redirect file 2023-07-12 11:04:59 +01:00
Robert Barrow
6a9f93bccb Add back message bus subscription 2023-07-11 19:49:19 +01:00
Robert Barrow
bf2dcdba86 linting 2023-07-11 17:58:10 +01:00
Robert Barrow
6beccd95f0 linting 2023-07-11 17:55:19 +01:00
Robert Barrow
603886b394 add test 2023-07-11 17:49:08 +01:00
Robert Barrow
7fd4d9bd24 revert unintended changes 2023-07-11 14:32:04 +01:00
merefield
0cec743253 fix for anon 2023-07-11 08:48:20 +01:00
merefield
ccb7095b00 bump patch 2023-07-11 08:24:36 +01:00
merefield
3189c03fbe Merge branch 'main' into dont_rely_on_application_route_override 2023-07-11 08:22:31 +01:00
Angus McLeod
c4521b4b92
Merge pull request #254 from paviliondev/linting_update
COMPATIBILITY: Linting update
2023-07-11 09:06:55 +02:00
merefield
00a66cd1f9 fix failing tests 2023-07-10 21:31:47 +01:00
merefield
c495540157 revert reversion of fix 2023-07-10 15:18:55 +01:00
merefield
b8965de717 revert prior selector change 2023-07-10 15:08:29 +01:00
merefield
6f4e7015f8 linting 2023-07-10 09:35:59 +01:00
merefield
90046f5fe3 simplify selector 2023-07-10 09:33:48 +01:00
merefield
ba20a8a195 prettier 2023-07-10 07:55:54 +01:00
merefield
1f928f0f81 more ES linting 2023-07-10 07:52:32 +01:00
merefield
c67d5075cb ES Linting 2023-07-10 07:46:43 +01:00
merefield
2737210baf import bootbox 2023-07-10 07:32:05 +01:00
merefield
b73cb95e46 bump patch 2023-07-10 07:28:08 +01:00
merefield
a575ffdf76 update yarn.lock 2023-07-10 07:25:42 +01:00
merefield
e51ba49e11 update package.json 2023-07-10 07:23:59 +01:00
merefield
2df920895d FE linting 2023-07-10 07:03:45 +01:00
merefield
39b947d003 bump patch 2023-07-10 06:58:52 +01:00
merefield
10df3208df IMPROVE: Move pending wizard check to page change event 2023-07-07 17:16:51 +01:00
Angus McLeod
d74f5cbd89
Merge pull request #252 from paviliondev/temp_app_route_fix
FIX: temp fix for javascript exception during init
2023-07-07 12:20:37 +02:00
merefield
eadd64bbbc FIX: temp fix for javascript exception during init 2023-07-07 11:11:00 +01:00
merefield
c85be78af5 merge in latest main 2023-07-05 19:59:11 +01:00
Angus McLeod
ebd25f2780
Merge pull request #250 from paviliondev/add_product_slug_env_variable
Add product slug env variable
2023-06-29 11:13:02 +02:00
Angus McLeod
af39c567ea Add product slug env variable 2023-06-29 10:26:39 +02:00
Angus McLeod
cd6503d425 Remove fragile tests 2023-06-28 09:22:07 +02:00
Angus McLeod
6e0f10ca0d
Merge pull request #248 from paviliondev/add-logs
Add memoization to reduce redis calls
2023-06-22 06:34:07 +02:00
Angus McLeod
f8ea421852 Bump version 2023-06-22 06:25:05 +02:00
Angus McLeod
f08f9f303f Bump version 2023-06-22 06:23:41 +02:00
Angus McLeod
b4d23970bc
Merge branch 'main' into add-logs 2023-06-22 06:20:02 +02:00
Angus McLeod
7561bc8042
Merge pull request #249 from paviliondev/fix_reset_behaviour
FIX: upon revisit, start at step 1 if reset on revisit is set
2023-06-21 11:06:42 +02:00
merefield
d9ace0449f Bump patch 2023-06-21 09:56:46 +01:00
merefield
712c15e845 FIX: upon revisit, start at step 1 if reset on revisit is set 2023-06-21 09:53:42 +01:00
jumagura
a5179e568b bump version 2023-06-21 00:44:39 -04:00
jumagura
9e65fcb410 Merge branch 'main' into add-logs 2023-06-21 00:43:38 -04:00
jumagura
29141ab35c DEV: Change instance name to a more specific name 2023-06-21 00:41:45 -04:00
jumagura
a5ebc282cf DEV: Implement instance-level caching for custom fields 2023-06-21 00:33:01 -04:00
Angus McLeod
0602e59d70 DEV: frontend tests cleanup
- Fix failing test
- Handle deprecations
- Fix typos
2023-06-20 09:10:53 +02:00
jumagura
78e7ae4e04 DEV: Undo formatting change 2023-06-19 16:54:23 -04:00
jumagura
c8a19e8c85 bump version 2023-06-19 16:53:34 -04:00
jumagura
298c083624 DEV: Add memoization to reduce redis calls 2023-06-19 16:52:20 -04:00
Robert
92b8fdc6d9
Bump patch 2023-06-13 19:23:54 +01:00
Angus McLeod
61bf199934 Update class in tests 2023-06-13 20:02:20 +02:00
Angus McLeod
86e6945ad4 Update subscription client class 2023-06-13 19:35:12 +02:00
Angus McLeod
e7ab0f7143
Merge pull request #214 from paviliondev/admin-acceptance-tests
Admin acceptance tests
2023-06-13 16:43:49 +02:00
jumagura
519e868078 bump version 2023-06-06 15:24:32 -04:00
jumagura
c1f06c6fff Merge branch 'main' into admin-acceptance-tests 2023-06-06 15:23:30 -04:00
Angus McLeod
42d6e094a2 Fix failing spec
See further 6cf863080a
2023-06-06 09:15:16 +02:00
Angus McLeod
2fe8501c65 Fix failing specs 2023-06-02 12:51:28 +02:00
Angus McLeod
c256a41668 Also ensure subscription client definition is in the right state 2023-05-31 14:27:00 +02:00
Angus McLeod
99e747a331 Ensure subscriptions are not stubbed if testing for no subscription 2023-05-31 12:09:00 +02:00
jumagura
2cb876ac69 Merge branch 'main' into admin-acceptance-tests 2023-05-26 00:53:58 -04:00
jumagura
acbaebf0aa DEV: Add test for reading wizard content 2023-05-26 00:41:35 -04:00
jumagura
97db657227 DEV: Add test for wizard set and if in actions section 2023-05-26 00:39:27 -04:00
jumagura
c1ee353470 DEV: Add another wizard to test reading a wizard content 2023-05-26 00:35:01 -04:00
Angus McLeod
4bfea70dde Linting fix 2023-05-23 10:27:42 +02:00
Angus McLeod
12ca60775a Bump version 2023-05-23 10:11:43 +02:00
Angus McLeod
4cdfdbf9d5 FIX: ensure element is present before passing on insertText event 2023-05-23 10:10:52 +02:00
Robert
6dbd8f7c4f
Merge pull request #246 from paviliondev/multiple_subscriptions_fix
Fix multiple subscriptions sort
2023-05-19 09:38:02 +01:00
Angus McLeod
49c1848e88 Bump version 2023-05-19 10:30:58 +02:00
Angus McLeod
00ba8425e3 Fix multiple subscriptions sort 2023-05-19 10:29:54 +02:00
Robert
705c84dd02
Merge pull request #221 from paviliondev/subscription_client_update
Complete updates to handle subscription product slugs
2023-05-19 07:47:08 +01:00
Angus McLeod
dc23db7a0c Bump version 2023-05-18 18:45:40 +02:00
Angus McLeod
929edc5d0e
Merge branch 'main' into subscription_client_update 2023-05-18 18:44:08 +02:00
jumagura
594a226576 DEV: Add testing for Step text editor 2023-05-16 01:25:59 -04:00
jumagura
b965afa020 DEV: Fix linting error 2023-05-11 06:33:28 -04:00
jumagura
92461ad9d3 DEV: Add aditional second waiting to avoid global failure 2023-05-11 06:23:35 -04:00
jumagura
a4a18115ee DEV: Change message content condition 2023-05-11 05:57:06 -04:00
jumagura
dd8b4b8e99 DEV: Add waiting the icon to change to default 2023-05-11 05:32:33 -04:00
jumagura
537ffeb883 DEV: Add waiting for inserted element to disappear 2023-05-11 04:57:36 -04:00
jumagura
69dc96562d DEV: Add waiting for the default message 2023-05-11 04:19:05 -04:00
jumagura
c83e514de9 DEV: Add admin manager destroy test 2023-05-11 04:00:46 -04:00
jumagura
887057d0d2 DEV: Add download submissions test 2023-05-11 02:34:23 -04:00
jumagura
64b1c0264e DEV: bump version 2023-05-11 01:48:53 -04:00
jumagura
02a3c426c0 Merge branch 'main' into admin-acceptance-tests 2023-05-11 01:47:58 -04:00
jumagura
9793ef6453 DEV: Add admin submissions modal action tests 2023-05-11 01:44:23 -04:00
jumagura
ed37c13664 DEV: Change title for admin api testing 2023-05-11 01:43:11 -04:00
Angus McLeod
e46d681379
Update README.md
Update issue and documentation links in readme.
2023-05-10 12:20:53 +02:00
Angus McLeod
2103c4d67e
Merge pull request #242 from paviliondev/field_type_subscription_ui
Add wizard-subscription-selector support to field type selection
2023-05-10 11:55:23 +02:00
jumagura
e4b9be9393 DEV: Add update, delete acceptance tests 2023-05-09 10:20:04 -04:00
jumagura
1a84acec21 DEV: Add created and read custom fields tests 2023-05-09 03:17:22 -04:00
jumagura
d0459575e0 DEV: Test available serializer fields for each class 2023-05-09 01:21:47 -04:00
jumagura
0c08b5c044 DEV: Add test for enabled and disabled custom field for unsuscribed plan 2023-05-09 01:19:46 -04:00
jumagura
b3266c6d18 DEV: Add custom fields unsuscribed test 2023-05-09 01:15:21 -04:00
Angus McLeod
7c56b6d4d7
Merge branch 'main' into field_type_subscription_ui 2023-05-08 18:42:14 +02:00
jumagura
af064dc655 DEV: Keep plugin.rb format 2023-05-05 20:43:16 -04:00
jumagura
9ff9844420 Merge branch 'main' into admin-acceptance-tests 2023-05-05 20:38:59 -04:00
jumagura
63d975eba0 DEV: Add admin custom fields acceptance tests 2023-05-05 20:37:58 -04:00
Angus McLeod
6be5511d18
Merge branch 'main' into subscription_client_update 2023-05-04 17:27:07 +02:00
Angus McLeod
44f078caff Fix failing rspec test 2023-05-04 17:25:10 +02:00
Angus McLeod
42517c094e Minor tweaks to subscription loading logic 2023-05-04 17:16:11 +02:00
Angus McLeod
99f2e8bbd9 Rubocop 2023-05-04 15:49:22 +02:00
Angus McLeod
3ea19e1086 Add support for server products PR in isolation 2023-05-04 15:49:04 +02:00
Angus McLeod
92fe9db1e0 Change subscription_url back 2023-05-04 15:18:34 +02:00
Angus McLeod
4c784d98e6 Add not equals support to mapper 2023-05-03 11:01:54 +02:00
Angus McLeod
461e617453
Merge pull request #245 from paviliondev/log_spec_fix 2023-05-02 08:51:27 +02:00
merefield
8b443e0f08 bump patch 2023-05-01 21:52:10 +01:00
merefield
caab850127 FIX: failing log spec 2023-05-01 21:49:44 +01:00
Angus McLeod
32a8dcf19f Add cron schedule to Custom Wizard workflow 2023-04-28 16:15:48 +02:00
jumagura
06c812a720 FIX: Change input value in API endpoint 2023-04-17 12:23:45 -04:00
jumagura
15cc33b8cc DEV: Update admin acceptance test custom-fields, logs, submissions 2023-04-17 12:01:54 -04:00
jumagura
54ad75bafd Merge branch 'main' into admin-acceptance-tests 2023-04-17 11:56:31 -04:00
Robert
cff6796d7c
Change server meta URL temporarily for test scenario 2023-04-17 16:55:15 +01:00
jumagura
fcb6b2a359 DEV: Update standard subscription acceptance test 2023-04-17 11:53:45 -04:00
jumagura
51624ac819 DEV: Update unsubscribed acceptance test 2023-04-17 11:16:13 -04:00
Angus McLeod
2f6492c2ed
Merge pull request #243 from paviliondev/group_user_population_fix 2023-04-11 17:43:57 +08:00
merefield
93b574beb7 fix spelling 2023-04-11 10:00:42 +01:00
merefield
f7cdc77a06 fix spelling 2023-04-11 09:59:22 +01:00
merefield
37cef2ccc2 IMPROVE: warn in logs when at least one user in wizard did not exist 2023-04-11 09:54:37 +01:00
merefield
766cae92ba bump patch 2023-04-06 17:05:06 +01:00
merefield
6b2dd5a443 FIX: users not being added to group as part of create action 2023-04-06 17:04:01 +01:00
Angus McLeod
3d65ad032d Merge branch 'main' into field_type_subscription_ui 2023-04-03 15:08:16 +10:00
Angus McLeod
2423e9afb7 Bump version 2023-04-03 15:08:02 +10:00
Angus McLeod
4c8fd63d6f Bump version 2023-04-03 15:07:44 +10:00
Angus McLeod
f29f300a6f FIX: ensure scrollTop on step route transition 2023-04-03 15:07:25 +10:00
Angus McLeod
b035ab9168 Bump version 2023-04-03 12:39:14 +10:00
Angus McLeod
80405555b0 Merge branch 'main' into field_type_subscription_ui 2023-04-03 12:38:49 +10:00
Angus McLeod
454ed607b4
Merge pull request #241 from paviliondev/handle_admin_template_deprecations
Handle admin template deprecations
2023-04-03 10:38:29 +08:00
Angus McLeod
2114b80185 Add wizard-subscription-selector support to field type selection 2023-04-03 12:37:09 +10:00
Angus McLeod
81372b4d3b Update version 2023-04-03 12:29:45 +10:00
Angus McLeod
61ec6123d7 Handle admin template deprecations 2023-04-03 12:28:06 +10:00
Angus McLeod
4ceffb7d0f FIX: Apply char-counter fix to composer as well 2023-04-03 11:04:28 +10:00
jumagura
0f59c9092f Merge branch 'main' into admin-acceptance-tests 2023-03-30 21:22:44 -04:00
jumagura
0b70806b6b bump version 2023-03-30 21:20:18 -04:00
Angus McLeod
1705a2728f
Merge pull request #240 from paviliondev/field_focus_fix
FIX: autofocus is causing issues on long steps
2023-03-30 15:11:19 +08:00
Angus McLeod
6429bff31a
Merge branch 'main' into field_focus_fix 2023-03-30 12:23:31 +08:00
Angus McLeod
2d8b830962 Bump version 2023-03-30 12:22:20 +08:00
Angus McLeod
889caf3fa5 Bump version 2023-03-30 12:21:23 +08:00
Angus McLeod
d3e4b16610
Merge pull request #239 from paviliondev/character_counter_fix
COMPATIBILITY: Character counter is now a core component
2023-03-30 12:20:00 +08:00
Angus McLeod
5da7030c76 FIX: autofocus is causing issues on long steps 2023-03-30 12:19:00 +08:00
Angus McLeod
fa3e2d0c55 Update wizard-char-counter.js.es6 2023-03-30 12:09:00 +08:00
Angus McLeod
c4e2f2a4a8 Update plugin.rb 2023-03-30 12:02:20 +08:00
Angus McLeod
6bcc24eabc Namespace char-counter helper 2023-03-30 12:02:01 +08:00
Marcos
3fe42c4183
Merge pull request #237 from paviliondev/frontend_updates
Fix deprecations && invalid field handling
2023-03-29 08:32:54 -05:00
Marcos
af62ebb547
bump version 2023-03-29 09:13:28 -04:00
Marcos
978aaf89b0
Merge branch 'main' into frontend_updates 2023-03-29 08:10:51 -05:00
Marcos
82aae6d34a
Merge pull request #238 from paviliondev/incorrect_step_when_steps_are_added
Fix start step when step is added to previously used wizard
2023-03-22 11:51:36 -05:00
Angus McLeod
5ab4147a40 Template linting 2023-03-22 11:39:04 +01:00
Angus McLeod
3f0e1b21f0 Prettier fixes 2023-03-22 11:38:18 +01:00
Angus McLeod
e7e9c0e8f8 Bump version 2023-03-22 11:22:01 +01:00
Angus McLeod
8734cda00b Fix start step when step is added to previously used wizard 2023-03-22 11:20:30 +01:00
Angus McLeod
095cfe1eb6 Bump version 2023-03-22 10:12:19 +01:00
Angus McLeod
392b6f3d58 Fix deprecations && invalid field handling 2023-03-22 10:11:48 +01:00
Angus McLeod
e2797ced64 Bump version 2023-03-21 17:41:49 +01:00
Angus McLeod
8fdd21601b Strings are Objects in ruby 2023-03-21 17:41:05 +01:00
Richard Odekerken
759358e081
Merge pull request #236 from paviliondev/liquid_template_error_handling
Ensure we're not interpolating an object
2023-03-21 17:34:32 +01:00
Angus McLeod
076e1f4966 Bump version 2023-03-21 17:22:15 +01:00
Angus McLeod
a146d57f0e Ensure we're not interpolating an object 2023-03-21 17:20:58 +01:00
Angus McLeod
78f5af87e1
Merge pull request #235 from paviliondev/category_name_output_text_selection
Add output text selection to category name
2023-03-21 15:47:51 +01:00
Angus McLeod
83d3ca8eb3 Add output text selection to category name 2023-03-21 15:34:07 +01:00
jumagura
014219c038 DEV: Use helpers for api creation 2023-03-21 04:56:48 -04:00
jumagura
1254fcfb4e DEV: Add helper for wizard api 2023-03-21 04:48:46 -04:00
jumagura
2c52459f29 DEV: Update api creatipon wizard 2023-03-21 04:48:24 -04:00
jumagura
ebddcb5606 FIX: Update creation of wizard on business tier 2023-03-21 04:47:58 -04:00
jumagura
60d50afc54 FIX: Display no data when no API is selected 2023-03-21 02:19:03 -04:00
jumagura
99c2c2a461 FIX: Display empty API content when no data is selected 2023-03-21 00:53:49 -04:00
jumagura
0a5b7411aa bump version 2023-03-20 17:52:01 -04:00
jumagura
c6c4e31ba9 merge main 2023-03-20 17:50:27 -04:00
Angus McLeod
c6dc80f02c FIX: template guest validation not working with validation conditions 2023-03-17 09:05:53 +01:00
Robert
7d6456667a
Merge pull request #234 from paviliondev/fix_user_in_submissions_two
Ensure each submission wizard has the right user
2023-03-16 17:06:46 +00:00
Angus McLeod
33abececd4 Bump version 2023-03-16 17:44:24 +01:00
Angus McLeod
ef1a8d1457 Ensure each wizard has the right user 2023-03-16 17:44:10 +01:00
Robert
5eca78f172
Merge pull request #229 from paviliondev/fix_user_in_submissions
Ensure submission users are serialized properly
2023-03-16 11:37:11 +00:00
Robert
936efe5aff
Merge branch 'main' into fix_user_in_submissions 2023-03-16 11:28:47 +00:00
jumagura
0e5f0fc86d DEV:Bump version 2023-03-15 21:52:44 -04:00
jumagura
c375c1dcd9 DEV: Merge main 2023-03-15 21:43:32 -04:00
jumagura
9b8a3589bd merge main 2023-03-15 21:43:03 -04:00
Angus McLeod
345885bdbd
Merge pull request #231 from paviliondev/update_workflows
Move to standard plugin workflow
2023-03-15 14:13:37 +01:00
Angus McLeod
e6d7f3d9bc Update plugin.rb 2023-03-15 14:07:25 +01:00
Angus McLeod
59f00d6278 Move to standard plugin workflow 2023-03-15 14:06:55 +01:00
Richard Odekerken
c475ec65cd
Merge pull request #228 from paviliondev/composer_copy_paste
Move to new Uppy handling in discourse/discourse
2023-03-15 14:04:03 +01:00
Angus McLeod
a4e49e7bbc Ensure submission users are serialized properly 2023-03-15 13:33:07 +01:00
Angus McLeod
c0ed596ff9
Merge branch 'main' into composer_copy_paste 2023-03-15 10:48:18 +01:00
Angus McLeod
20e7b492ea FIX: use const instead of let for observedCache 2023-03-15 10:44:56 +01:00
Angus McLeod
52fe5166cd Fix linting 2023-03-15 10:38:26 +01:00
Angus McLeod
24ce4da6f2 Make linters happy 2023-03-15 10:30:24 +01:00
Angus McLeod
e489845daf Bump version 2023-03-15 10:28:51 +01:00
Angus McLeod
6a4063951e Move to new Uppy handling in discourse/discourse 2023-03-15 10:26:46 +01:00
Angus McLeod
0e70a5a221 FIX: add observed cache to undo changes mixin
Prevents observer add / remove race conditions which can cause exceptions.
2023-03-15 09:22:09 +01:00
Angus McLeod
030929a414
Merge pull request #227 from paviliondev/remove_in_wizard_subscription_conditional_logic_check
Remove subscription requirement for template field interpolation
2023-03-14 16:47:45 +01:00
Angus McLeod
3a5430c767 Bump version 2023-03-14 16:35:23 +01:00
Angus McLeod
091362cb00 Remove subscription requirement for field interpolation. 2023-03-14 16:34:58 +01:00
Robert
631b5fe44c
Merge pull request #225 from paviliondev/fix-composer-hyperlink
FIX: Use discourse hyperlink modal in composer instead of custom
2023-03-10 14:59:47 +00:00
Angus McLeod
c2c86b12c2
Merge pull request #226 from paviliondev/guest_permissions_user_access_fix 2023-03-10 15:49:31 +01:00
merefield
b73437299c IMPROVE: separate out new tests 2023-03-10 14:42:42 +00:00
jumagura
a84bf52542 DEV: Add front-end test for hyperlink modal in composer 2023-03-10 10:39:40 -04:00
merefield
148e188490 merge main and bump patch 2023-03-10 12:53:01 +00:00
merefield
a3b665434c Bump patch 2023-03-10 12:50:37 +00:00
merefield
9e59b73ebe Bump patch 2023-03-10 12:49:32 +00:00
merefield
092947f68b FIX: regular users can't access wizard with guest permissions 2023-03-10 12:43:37 +00:00
jumagura
320196b1f0 FIX: Use discourse hyperlink modal in composer instead of custom 2023-03-09 22:34:40 -04:00
Angus McLeod
e422867729 Merge branch 'main' into subscription_client_update 2023-03-09 09:07:59 +01:00
Angus McLeod
9bb01d29ab Fix prettier issue and bump version 2023-03-08 11:10:46 +01:00
Angus McLeod
0fc2c6b850 FIX: Ensure tag_groups is in wizard schema 2023-03-08 09:26:57 +01:00
Angus McLeod
762ddfa16e FIX: Ensure tag_groups is in wizard schema 2023-03-06 10:00:52 +01:00
Angus McLeod
ebea3e666a FIX: Client-side exception fixes 2023-03-02 10:36:06 +01:00
Angus McLeod
71277f8448
Merge branch 'main' into subscription_client_update 2023-02-27 09:27:27 +01:00
Angus McLeod
3e25f43ba0
Merge pull request #222 from xfalcox/main
FIX: (File|Dir).exists? is deprecated
2023-02-24 17:55:39 +01:00
Angus McLeod
7068dfd727 Bump version 2023-02-24 17:35:07 +01:00
Rafael dos Santos Silva
ce914c3f57
FIX: (File|Dir).exists? is deprecated 2023-02-24 12:13:51 -03:00
Angus McLeod
aef9ed24ae Change problematic Dir.exists? 2023-02-24 14:27:08 +01:00
Angus McLeod
da6e75faca Fix admin index 2023-02-24 14:17:00 +01:00
Angus McLeod
bc81ca89aa Update workflow 2023-02-23 21:23:38 +01:00
Angus McLeod
dfc23978ae Bump version 2023-02-23 19:25:52 +01:00
Angus McLeod
9eb5fc6ff6 Complete updates to handle subscription product slugs 2023-02-23 19:24:11 +01:00
Richard Odekerken
643c5ecff0
Merge pull request #219 from paviliondev/tag_group_restriction_fix
Tag group restriction fix
2023-02-10 18:13:22 +01:00
Richard Odekerken
75d429388e
Merge branch 'main' into tag_group_restriction_fix 2023-02-10 18:13:03 +01:00
Robert
f5d265846d
Merge pull request #216 from paviliondev/add_guest_support
Add guest support
2023-02-10 13:51:21 +00:00
Angus McLeod
e5d6a20532 Fix specs 2023-02-09 14:32:01 +01:00
Angus McLeod
e7ee89048a Guest wizards cannot use composer or upload 2023-02-09 14:18:25 +01:00
Angus McLeod
b2b93aad59 Ensure admin can access wizard multiple times 2023-02-09 13:10:55 +01:00
Angus McLeod
7c8f530c86 Update wizard.rb 2023-02-09 12:33:55 +01:00
Angus McLeod
75e262a526 Merge branch 'main' into add_guest_support 2023-02-08 14:00:51 +01:00
Robert
1e6a5c39b1
Merge pull request #220 from paviliondev/css_fix
FIX: compound selectors may no longer be extended
2023-02-08 12:42:31 +00:00
merefield
4171d81528 linting 2023-02-08 12:34:30 +00:00
Angus McLeod
edc94b6ea7 Restrict guest support to standard and business subscriptions
- Support mapped value subscription restrictions
- Restrict permitted guest value to standard and business
2023-02-08 13:32:24 +01:00
merefield
a038e72854 bump version 2023-02-08 12:31:27 +00:00
merefield
202f6ddc06 FIX: compound selectors may no longer be extended 2023-02-08 12:28:30 +00:00
Angus McLeod
e82c158c4a Bump version 2023-02-07 14:44:40 +01:00
Angus McLeod
a931caffc1 Remove request_store and use for_input 2023-02-07 14:43:39 +01:00
Angus McLeod
0cb76659e9 Update custom-wizard-admin.js.es6 2023-02-07 13:55:08 +01:00
Angus McLeod
7657149e6f Update custom-wizard-admin.js.es6 2023-02-07 13:53:20 +01:00
Angus McLeod
1eefd99c6a Minor fixes 2023-02-07 13:17:40 +01:00
Angus McLeod
8f8c6d50c6 move guest toggle to permitted attribute 2023-02-07 12:46:17 +01:00
Angus McLeod
735d43e1ee Add failing test 2023-02-06 17:31:42 +01:00
Angus McLeod
2c84f019bb Update subscription.rb 2023-02-02 14:30:54 +01:00
Angus McLeod
82d2eee414 Fix version 2023-01-26 11:31:04 +01:00
Angus McLeod
ebdc045236
Merge branch 'main' into add_guest_support 2023-01-26 11:29:09 +01:00
Angus McLeod
b712b26896 Update COPYRIGHT.txt 2023-01-26 11:27:40 +01:00
Angus McLeod
1b3551b13d Bump version 2023-01-26 11:27:16 +01:00
Angus McLeod
dfc1540d52 Fix tests and linting 2023-01-26 11:26:24 +01:00
Angus McLeod
7d2e876584 First working version 2023-01-18 19:53:36 +01:00
jumagura
e21c3fa296 DEV: Add a new api entry 2023-01-16 00:46:12 -04:00
jumagura
24a8b95e0b DEV: Add api acceptance test 2022-12-30 17:26:32 -04:00
jumagura
146fd30ab5 DEV: Check if all tabs are displayed according to the subscription plan 2022-12-30 08:49:38 -04:00
jumagura
e88e83dd80 DEV: Unkip test for debugged code 2022-12-29 17:02:19 -04:00
jumagura
57f591e488 DEV: Update tests enabled fields 2022-12-29 14:55:08 -04:00
jumagura
8103a3b9fa DEV: Bump version 2022-12-27 12:33:11 -04:00
jumagura
be3a479270 FIX: Show an empty submission list of no wizard is selected 2022-12-27 12:30:27 -04:00
jumagura
8f42268e88 FIX: Show empty log data when no wizard is selected 2022-12-27 12:28:58 -04:00
jumagura
082139cd97 MERGE: Main branch 2022-12-27 12:25:49 -04:00
Angus McLeod
c1007e78f5 WIP 2022-12-24 09:42:09 +01:00
Marcos
794a8efdec
Merge pull request #215 from paviliondev/add_watch_tags_action
Add watch tags action
2022-12-23 14:16:36 -04:00
Angus McLeod
19ff97f0b4 Bump version 2022-12-23 17:28:29 +01:00
Angus McLeod
34ff9e4136 Add watch_tags action 2022-12-23 17:28:09 +01:00
jumagura
ded6dacd60 DEV: Remove unused admin acceptance tests 2022-12-22 00:21:29 -04:00
jumagura
2557d15a0c DEV: Add helper values for admin unsuscribed acceptance tests 2022-12-22 00:12:29 -04:00
jumagura
f0f27769fd DEV: Add helper values for admin standard acceptance tests 2022-12-22 00:11:57 -04:00
jumagura
828ded7c05 DEV: Add helper values for admin business acceptance tests 2022-12-21 23:59:03 -04:00
jumagura
d6b1655a37 DEV: Add helper values for admin submissions acceptance tests 2022-12-21 23:47:21 -04:00
jumagura
fbf7319c36 DEV: Add helper values for admin manager acceptance tests 2022-12-21 23:44:40 -04:00
jumagura
7c70e8ca75 DEV: Add helper values for admin log acceptance tests 2022-12-21 23:37:51 -04:00
jumagura
ac751b269e DEV: Remove unused import 2022-12-21 12:47:34 -04:00
jumagura
ff8294b8e9 DEV: Remove await settled in admin custom field acceptance tests 2022-12-21 12:47:05 -04:00
jumagura
ced9d768fb DEV: Change embedded response with helper values 2022-12-21 12:24:39 -04:00
jumagura
2a38aabdca DEV: Add helper values for admin acceptance tests 2022-12-21 12:23:52 -04:00
jumagura
28cf4421d4 DEV: Add manager test 2022-12-21 12:11:29 -04:00
jumagura
c866395495 DEV: Skip tests that freezes 2022-12-21 11:32:30 -04:00
jumagura
9a5328a7e9 DEV: Make test run 2022-12-21 11:30:31 -04:00
jumagura
28bb6f2886 DEV: Skip freezing acceptance test 2022-12-21 02:14:45 -04:00
jumagura
e67cf5001f FIX: Add settled to avoid render errors 2022-12-21 01:58:18 -04:00
jumagura
b7953fb882 DEV: Add settled to avoid rendering errors 2022-12-21 01:44:48 -04:00
jumagura
9583851501 DEV: Add settled to prevent rendering errors 2022-12-21 01:30:25 -04:00
jumagura
bd03d62da1 FIX: Add missing / for correct path in pretender server 2022-12-21 00:18:10 -04:00
jumagura
f54025677a DEV: Delete helper file 2022-12-20 23:57:31 -04:00
jumagura
0a03817237 DEV: Bump version 2022-12-20 23:57:04 -04:00
jumagura
039ba8f603 DEV: Create helper for pretender server response 2022-12-20 18:48:28 -04:00
jumagura
b05cbec277 DEV: Remove comments and unused code 2022-12-20 17:56:12 -04:00
jumagura
6026d67b12 DEV: Remove pause 2022-12-20 16:01:56 -04:00
jumagura
a6b6a2c025 DEV: Add admin business subscription acceptance test 2022-12-20 14:57:38 -04:00
jumagura
06366a1574 DEV: Change admin acceptance test 2022-12-20 14:57:15 -04:00
jumagura
8568a1d97f DEV: Remove repeated acceptance test 2022-12-20 13:27:00 -04:00
jumagura
786c5cd6fc DEV: Add subscribed admin test 2022-12-20 12:22:24 -04:00
jumagura
9df0fb97d5 DEV: Modify title for acceptance test 2022-12-20 12:22:01 -04:00
jumagura
0eaf7b7798 DEV: Rename wizard test file 2022-12-20 12:06:13 -04:00
jumagura
fab0095b1f DEV: Add tests to unsuscribed wizard admin 2022-12-20 12:05:27 -04:00
jumagura
953123fbf8 DEV: Add create wizard section in acceptance test 2022-12-20 01:01:32 -04:00
jumagura
23fafeaf05 Merge branch 'main' into admin-acceptance-tests 2022-12-19 11:51:41 -04:00
jumagura
230fe4a51f DEV: Add admin wizards acceptance test 2022-12-19 11:46:52 -04:00
jumagura
27186caafc DEV: Add admin manager acceptance test 2022-12-19 11:46:38 -04:00
Marcos
17fe4d732a
Merge pull request #213 from paviliondev/interpolate_user_avatar
Add avatar interpolation support
2022-12-13 12:05:03 -04:00
Angus McLeod
4fbcc9b849 Update mapper_spec.rb 2022-12-13 15:56:20 +01:00
Angus McLeod
528585db45 Ensure that we're mapping an array 2022-12-13 15:21:56 +01:00
jumagura
52d308e7b4 DEV: Add unselecting dropdown element in admin acceptance test 2022-12-13 09:23:21 -04:00
jumagura
09e56499ca DEV: Remove unused code from admin log acceptance test 2022-12-13 09:22:02 -04:00
jumagura
71b6a184ca DEV: Add admin logs acceptance test 2022-12-13 08:58:35 -04:00
jumagura
0f9fa5fe94 DEV: Add admin custom fields acceptance test 2022-12-13 04:27:41 -04:00
jumagura
cc37043195 DEV: Add admin submission acceptance test 2022-12-13 04:19:02 -04:00
Angus McLeod
621360df58 Update wizard-text-editor.js.es6 2022-12-12 13:24:12 +01:00
Angus McLeod
6a6b44a469 Version bump 2022-12-12 13:21:26 +01:00
Angus McLeod
405a4e3ffa Add avatar interpolation support 2022-12-12 13:19:04 +01:00
Angus McLeod
93ea792972
Update SECURITY.md 2022-12-07 10:55:02 +01:00
Angus McLeod
2828ee9c06
Update SECURITY.md 2022-12-07 10:54:44 +01:00
Angus McLeod
ecbbd5e1ee
Update SECURITY.md 2022-12-07 10:53:01 +01:00
Angus McLeod
d0d2921c17
Create SECURITY.md 2022-12-07 10:52:12 +01:00
Angus McLeod
971b41e15a
Merge pull request #211 from sindbach/fix_preview_url_paths
Patch for wizard URL path to take account of subdirectory base URL.
2022-11-18 16:10:06 +00:00
Wan Bachtiar
5b923f3340 Removed conditional statement that would always be true 2022-11-17 08:59:53 +11:00
Wan Bachtiar
d6ee1501d1 prettier 2022-11-11 20:43:57 +11:00
Wan Bachtiar
d68cd4a9fb Bump version 2022-11-11 16:36:18 +11:00
Wan Bachtiar
9064b2fcbb Patch for wizard URL path to take account of Discourse with subdirectory base URL. 2022-11-11 15:56:07 +11:00
Marcos
6f13f0e4bf
Merge pull request #209 from paviliondev/composer-mobile-upload
Allow upload button in wizard composer when in mobile view
2022-11-08 07:31:42 -04:00
Angus McLeod
e50ce9e5c0 Update plugin.rb 2022-11-07 15:05:13 +01:00
Angus McLeod
28e007536a IMPROVE: Allow upload button on mobile 2022-11-07 15:04:30 +01:00
Angus McLeod
54e6af52e9 Update quit text on first step 2022-11-07 14:43:46 +01:00
Marcos
5e3b0f6d2a
Merge pull request #207 from paviliondev/add_tag_creation_to_tag_field
FEATURE: add can_create_tag
2022-11-04 16:54:04 -04:00
Marcos
e4de96ed03
Merge branch 'main' into add_tag_creation_to_tag_field 2022-11-04 16:18:21 -04:00
Angus McLeod
da7153fe34 Add subscription check for API features 2022-11-01 13:38:56 +01:00
Angus McLeod
f76ae370b0 Update plugin version 2022-10-26 10:08:14 +02:00
Angus McLeod
345bb310e8 FEATURE: add can_create_tag 2022-10-26 10:04:50 +02:00
Angus McLeod
12cd8ac201 FIX: straighten-out wizard-level subscription features 2022-10-26 09:40:02 +02:00
Angus McLeod
b49e878458 Add ruby to gemfile.lock platforms and update gitignore 2022-10-20 09:30:24 +02:00
Angus McLeod
bf711a910d Update plugin.rb 2022-10-19 19:09:33 +02:00
Angus McLeod
1904001098 Add lefthook 2022-10-19 18:13:03 +02:00
Angus McLeod
92b02ed7d9 FIX: link index assignment edge cases 2022-10-19 18:07:19 +02:00
Angus McLeod
02255491d0 FIX: avatar link in wizard submissions was broken 2022-10-14 09:19:02 +02:00
Angus McLeod
4ab7c77257 FIX: fix wizard index creation 2022-10-12 10:57:40 +02:00
Angus McLeod
b2a5558de1 Version bump 2022-10-12 09:30:07 +02:00
Angus McLeod
71acc4577d FIX: indexes should not require a subscription 2022-10-12 09:28:31 +02:00
Angus McLeod
0b4c154456 Version bump 2022-10-10 14:05:08 +02:00
Angus McLeod
1dfe93ee24 Add explicit locations plugin support 2022-10-10 14:04:55 +02:00
Angus McLeod
359b165743 Bump version 2022-10-05 17:35:54 +02:00
Angus McLeod
eaf0b5f7ba Update submission_spec.rb 2022-10-05 17:29:21 +02:00
Angus McLeod
94e1d4988d Fix linting 2022-10-05 17:20:25 +02:00
Angus McLeod
1f077ce22b Bump version 2022-10-05 17:14:50 +02:00
Angus McLeod
c2e759b1c5 FIX: pagination and submitted_at ordering of submissions 2022-10-05 17:14:43 +02:00
Angus McLeod
60abb6981e FIX: re-add logic incorrectly removed submissions logic during merge 2022-09-28 14:26:27 +02:00
Angus McLeod
072a3ea142 FIX: remove incorrectly merged code 2022-09-23 18:09:49 +02:00
Angus McLeod
e38b54351f
Merge pull request #204 from paviliondev/pro-release
Custom Wizard 2.0
2022-09-23 17:47:48 +02:00
Angus McLeod
3bacb09f82 Acknowledge Kailtlin as an author 2022-09-23 17:30:55 +02:00
Angus McLeod
8f7fae0e7c Remove beta tag 2022-09-23 17:27:11 +02:00
Angus McLeod
919ac702af Merge branch 'main' into pro-release 2022-09-23 17:25:34 +02:00
Angus McLeod
61e80779ce
Merge pull request #203 from paviliondev/update_events_integration
Add automatic events plugin integration
2022-09-23 17:22:06 +02:00
Angus McLeod
ebd382cca4 Fix linting 2022-09-23 17:06:16 +02:00
Angus McLeod
12e5bef372 Add spec for action callbacks 2022-09-23 17:00:41 +02:00
Angus McLeod
aa288b19e2 Move action callbacks to action class 2022-09-23 16:52:55 +02:00
Angus McLeod
26749bd055 Add asset requiring for backwards compatibility 2022-09-23 16:23:41 +02:00
Angus McLeod
8083f44389 Bump version 2022-09-23 15:58:39 +02:00
Angus McLeod
a3db405d93 Apply prettier 2022-09-23 15:54:43 +02:00
Angus McLeod
c79dee3d16 Add community subscription as an explicit type 2022-09-23 15:52:05 +02:00
Angus McLeod
785bd5d956 Merge branch 'main' into pro-release 2022-09-22 08:20:44 +02:00
Angus McLeod
0be2b98030 Update plugin documentation domain 2022-09-20 11:16:43 +02:00
Angus McLeod
bfd4e30d36 Add automatic integration 2022-09-19 12:09:34 +02:00
Angus McLeod
b2714b524c Bump version 2022-09-02 10:01:21 +02:00
Angus McLeod
e5904846cf FIX: registered topic field names not being cast properly in actions 2022-09-02 09:45:20 +02:00
Angus McLeod
47a1a3d730 Make prettier happy 2022-08-29 11:58:42 +02:00
Angus McLeod
66808dba08 Update documentation references 2022-08-29 11:38:35 +02:00
Angus McLeod
f8d5e9296d COMPATIBILITY: previewUpdated now receives a DOM node 2022-08-25 09:49:32 +02:00
Angus McLeod
1f67f2ed4f
Merge pull request #179 from paviliondev/translations_main
I18n: Update translations
2022-08-25 08:33:51 +02:00
Keegan George
8af3fde41c New translations server.en.yml (German) 2022-08-24 08:43:03 -07:00
Keegan George
76de5e60c1 New translations client.en.yml (German) 2022-08-24 08:43:02 -07:00
Angus McLeod
b35781927f DEV: remove unused import 2022-08-24 12:02:28 +02:00
Angus McLeod
b11eea3a06 FIX: error handling needs to take account of internal discourse ajax changes 2022-08-24 11:35:17 +02:00
Angus McLeod
78a9c97e43 FIX: Ensure no access skip works for guests 2022-08-24 09:52:08 +02:00
Angus McLeod
b05ed5093e Bump version 2022-08-23 17:04:44 +02:00
Angus McLeod
6c39054853 Add notice about subscriptions to wizard admin panel 2022-08-23 17:04:30 +02:00
Angus McLeod
b3bcaa26f1 DEV: apply prettier to wizard composer editor 2022-08-22 16:10:01 +02:00
Angus McLeod
d6b4954ae3 Bump version 2022-08-22 15:57:38 +02:00
Angus McLeod
9e1dfd9cf9 FIX: simplify wizard composer event handling 2022-08-22 15:56:58 +02:00
Angus McLeod
7386be3ac0 Ensure bootstrap mode notice is hidden in wizard 2022-08-22 14:39:01 +02:00
Angus McLeod
800ec34ed3 Merge branch 'main' of https://github.com/paviliondev/discourse-custom-wizard 2022-08-18 23:04:48 +02:00
Angus McLeod
6e02c138ef Update plugin about 2022-08-18 23:04:42 +02:00
Angus McLeod
4173404bbd
Update README.md 2022-08-18 22:43:13 +02:00
Angus McLeod
0dd54255ef Update README.md 2022-08-18 13:28:43 +02:00
Angus McLeod
ff7185f742 Update README.md 2022-08-18 12:36:05 +02:00
Angus McLeod
f7d074fb05
Merge pull request #201 from paviliondev/file-upload-test
Fix manager fix uploads
2022-08-15 16:35:12 +02:00
Angus McLeod
81680033a7 Apply prettier 2022-08-15 16:16:18 +02:00
Angus McLeod
1f254732da version bump 2022-08-15 15:41:01 +02:00
Angus McLeod
cfe563e515 FIX: use native javascript instead of jquery 2022-08-15 14:36:42 +02:00
Angus McLeod
eae5fbbbb8 FIX: try using new component style 2022-08-15 14:26:36 +02:00
Angus McLeod
e59d12be95 FIX: use input event instead of change event 2022-08-15 14:00:58 +02:00
Angus McLeod
6a1f8c9cb7 DEV: site-settings:main has been replaced with service:site-settings 2022-08-15 13:53:31 +02:00
Angus McLeod
5c6b66e730 Update plugin contact email 2022-08-12 15:48:30 +01:00
Angus McLeod
ef590abce2
Update README.md 2022-08-11 10:58:41 +01:00
Angus McLeod
e75c9de052
Add banner 2022-08-11 10:58:07 +01:00
Angus McLeod
93107236ea Update README.md 2022-08-11 10:33:41 +01:00
Angus McLeod
209bb077e9 Update metadata in preparation from v2.0 2022-08-09 15:20:49 +01:00
Angus McLeod
734cc44f62 Update admin.scss 2022-08-09 15:00:26 +01:00
Angus McLeod
248e785086 Merge branch 'main' into pro-release 2022-08-09 14:56:31 +01:00
Angus McLeod
e5a91aaab5
Merge pull request #200 from paviliondev/fix_orphaned_uploads
Add upload_references for wizard step and field uploads
2022-08-02 14:04:13 +01:00
Angus McLeod
c3c87852b8 Bump version 2022-08-02 13:57:44 +01:00
Angus McLeod
5acff01708 Apply prettier 2022-08-02 13:57:19 +01:00
Angus McLeod
1e8b667e3f Working version contained within template model 2022-08-02 13:54:57 +01:00
Keegan George
c8602c13cc New translations server.en.yml (Chinese Simplified) 2022-08-02 05:01:08 -07:00
Keegan George
5856d95757 New translations client.en.yml (Portuguese) 2022-08-02 05:00:40 -07:00
Keegan George
f76185c73d New translations client.en.yml (Portuguese, Brazilian) 2022-08-02 05:00:24 -07:00
Keegan George
2812cd107f New translations client.en.yml (Chinese Traditional) 2022-08-02 05:00:19 -07:00
Angus McLeod
2cec01ba2c WIP Example 2022-08-02 12:39:56 +01:00
Angus McLeod
d4da391a4d Various rebase fixes 2022-08-01 18:07:16 +01:00
Angus McLeod
1175cbab96 Merge branch 'main' into pro-release 2022-08-01 17:48:04 +01:00
Angus McLeod
38307c565a Fix header content CSS 2022-08-01 17:18:21 +01:00
Angus McLeod
2f21358f10 Merge branch 'main' into pro-release 2022-08-01 16:44:42 +01:00
Keegan George
a6109636dd New translations server.en.yml (Portuguese, Brazilian) 2022-08-01 03:42:20 -07:00
Keegan George
6ca3f9347c New translations server.en.yml (Chinese Traditional) 2022-08-01 03:42:16 -07:00
Keegan George
bcc243ad27 New translations server.en.yml (Portuguese) 2022-08-01 03:42:08 -07:00
Keegan George
7669eb8907 New translations server.en.yml (Chinese Simplified) 2022-08-01 03:41:38 -07:00
Keegan George
bfda41a5ab New translations client.en.yml (Portuguese) 2022-08-01 03:41:02 -07:00
Keegan George
66cb18701f New translations client.en.yml (Chinese Simplified) 2022-08-01 03:40:43 -07:00
Keegan George
af77cdbefc New translations client.en.yml (Chinese Traditional) 2022-08-01 03:40:38 -07:00
Angus McLeod
0d7a220f1d FIX: direct step path error when not logged in && fix acceptance tests 2022-08-01 08:41:11 +01:00
Keegan George
af9c1ebed5 New translations server.en.yml (Chinese Simplified) 2022-07-31 03:39:02 -07:00
Keegan George
36bb8c6b8d New translations client.en.yml (Chinese Simplified) 2022-07-31 03:39:01 -07:00
Keegan George
4967ecef5b New translations client.en.yml (Japanese) 2022-07-31 03:39:00 -07:00
Keegan George
8c8a6c1c9f New translations client.en.yml (French) 2022-07-31 03:38:59 -07:00
Keegan George
37927bf63c New translations client.en.yml (Sindhi) 2022-07-30 03:32:26 -07:00
Keegan George
87acb3ba24 New translations client.en.yml (Croatian) 2022-07-30 03:32:25 -07:00
Keegan George
875429a701 New translations client.en.yml (Kazakh) 2022-07-30 03:32:24 -07:00
Keegan George
797f194c15 New translations client.en.yml (Estonian) 2022-07-30 03:32:23 -07:00
Keegan George
0248cd9469 New translations client.en.yml (Latvian) 2022-07-30 03:32:22 -07:00
Keegan George
97a75c6258 New translations client.en.yml (Azerbaijani) 2022-07-30 03:32:21 -07:00
Keegan George
14f29f5366 New translations client.en.yml (Hindi) 2022-07-30 03:32:20 -07:00
Keegan George
6d1a8dff8f New translations client.en.yml (Malay) 2022-07-30 03:32:19 -07:00
Keegan George
ca5aaf7f92 New translations client.en.yml (Telugu) 2022-07-30 03:32:18 -07:00
Keegan George
65647fc6b7 New translations client.en.yml (Tagalog) 2022-07-30 03:32:17 -07:00
Keegan George
bd66f380b7 New translations client.en.yml (Yiddish) 2022-07-30 03:32:16 -07:00
Keegan George
66fe68e88d New translations client.en.yml (Thai) 2022-07-30 03:32:15 -07:00
Keegan George
083e3cf353 New translations client.en.yml (Welsh) 2022-07-30 03:32:14 -07:00
Keegan George
9349fca152 New translations client.en.yml (Tatar) 2022-07-30 03:32:13 -07:00
Keegan George
4cf90e23b6 New translations client.en.yml (Malayalam) 2022-07-30 03:32:12 -07:00
Keegan George
18c31dd66a New translations client.en.yml (Tibetan) 2022-07-30 03:32:11 -07:00
Keegan George
087af5bfad New translations client.en.yml (Bosnian) 2022-07-30 03:32:10 -07:00
Keegan George
7f9ace13e8 New translations client.en.yml (Kannada) 2022-07-30 03:32:09 -07:00
Keegan George
afd77dc409 New translations client.en.yml (Swahili) 2022-07-30 03:32:08 -07:00
Keegan George
15cb6d67c5 New translations client.en.yml (Nepali) 2022-07-30 03:32:07 -07:00
Keegan George
a592054d1d New translations client.en.yml (Lao) 2022-07-30 03:32:06 -07:00
Keegan George
7b5f39b4b6 New translations client.en.yml (Oromo) 2022-07-30 03:32:05 -07:00
Keegan George
59086fefdd New translations client.en.yml (Esperanto) 2022-07-30 03:32:04 -07:00
Keegan George
b49385774b New translations client.en.yml (Bengali) 2022-07-30 03:32:03 -07:00
Keegan George
e34c058f42 New translations client.en.yml (Tamil) 2022-07-30 03:32:02 -07:00
Keegan George
6ff14cac23 New translations client.en.yml (Macedonian) 2022-07-30 03:32:01 -07:00
Keegan George
306fca6779 New translations client.en.yml (Lithuanian) 2022-07-30 03:32:00 -07:00
Keegan George
abc55c1e78 New translations client.en.yml (Kurdish) 2022-07-30 03:31:59 -07:00
Keegan George
747b36a840 New translations client.en.yml (Korean) 2022-07-30 03:31:58 -07:00
Keegan George
25962ac93d New translations client.en.yml (Georgian) 2022-07-30 03:31:57 -07:00
Keegan George
125a11a2b5 New translations client.en.yml (Japanese) 2022-07-30 03:31:56 -07:00
Keegan George
b9ec915f7f New translations client.en.yml (Italian) 2022-07-30 03:31:55 -07:00
Keegan George
adf5e91e9f New translations client.en.yml (Armenian) 2022-07-30 03:31:54 -07:00
Keegan George
23f3bd2b94 New translations client.en.yml (Hungarian) 2022-07-30 03:31:54 -07:00
Keegan George
a8d5165fe0 New translations client.en.yml (Hebrew) 2022-07-30 03:31:53 -07:00
Keegan George
40e6194143 New translations client.en.yml (Mongolian) 2022-07-30 03:31:52 -07:00
Keegan George
44e6fac586 New translations client.en.yml (Finnish) 2022-07-30 03:31:51 -07:00
Keegan George
52b5fd8eee New translations client.en.yml (Greek) 2022-07-30 03:31:50 -07:00
Keegan George
837f2470d1 New translations client.en.yml (German) 2022-07-30 03:31:49 -07:00
Keegan George
2b1d9c28bb New translations client.en.yml (Danish) 2022-07-30 03:31:48 -07:00
Keegan George
c4f4a7f4d9 New translations client.en.yml (Czech) 2022-07-30 03:31:47 -07:00
Keegan George
1f04cc50ca New translations client.en.yml (Catalan) 2022-07-30 03:31:46 -07:00
Keegan George
dfdf21e03a New translations client.en.yml (Bulgarian) 2022-07-30 03:31:45 -07:00
Keegan George
20cb9f3df7 New translations client.en.yml (Belarusian) 2022-07-30 03:31:44 -07:00
Keegan George
8988b1d722 New translations client.en.yml (Arabic) 2022-07-30 03:31:43 -07:00
Keegan George
f484706d98 New translations client.en.yml (Afrikaans) 2022-07-30 03:31:42 -07:00
Keegan George
967e238f8f New translations client.en.yml (Spanish) 2022-07-30 03:31:41 -07:00
Keegan George
4f84bdb87a New translations client.en.yml (Basque) 2022-07-30 03:31:40 -07:00
Keegan George
39bd40cbe1 New translations client.en.yml (French) 2022-07-30 03:31:39 -07:00
Keegan George
89a29767c5 New translations client.en.yml (Dutch) 2022-07-30 03:31:38 -07:00
Keegan George
7c2ef92672 New translations client.en.yml (Punjabi) 2022-07-30 03:31:37 -07:00
Keegan George
ef9e80263a New translations client.en.yml (Khmer) 2022-07-30 03:31:36 -07:00
Keegan George
5300d03bed New translations client.en.yml (Persian) 2022-07-30 03:31:35 -07:00
Keegan George
ce7200c90f New translations client.en.yml (Indonesian) 2022-07-30 03:31:35 -07:00
Keegan George
7181d1bbf5 New translations client.en.yml (Portuguese, Brazilian) 2022-07-30 03:31:34 -07:00
Keegan George
35cd36d395 New translations client.en.yml (Icelandic) 2022-07-30 03:31:32 -07:00
Keegan George
50a14ffe9c New translations client.en.yml (Galician) 2022-07-30 03:31:31 -07:00
Keegan George
3586079af4 New translations client.en.yml (Vietnamese) 2022-07-30 03:31:30 -07:00
Keegan George
47d150b977 New translations client.en.yml (Urdu (Pakistan)) 2022-07-30 03:31:30 -07:00
Keegan George
cad81a76cc New translations client.en.yml (Zulu) 2022-07-30 03:31:29 -07:00
Keegan George
f53a1d1f22 New translations client.en.yml (Chinese Traditional) 2022-07-30 03:31:28 -07:00
Keegan George
6d3cf642d9 New translations client.en.yml (Norwegian) 2022-07-30 03:31:27 -07:00
Keegan George
3e9edbf8c9 New translations client.en.yml (Chinese Simplified) 2022-07-30 03:31:26 -07:00
Keegan George
9000949a04 New translations client.en.yml (Turkish) 2022-07-30 03:31:25 -07:00
Keegan George
6c98daf644 New translations client.en.yml (Swedish) 2022-07-30 03:31:24 -07:00
Keegan George
090f6700e8 New translations client.en.yml (Serbian (Cyrillic)) 2022-07-30 03:31:23 -07:00
Keegan George
26c24815c5 New translations client.en.yml (Albanian) 2022-07-30 03:31:22 -07:00
Keegan George
6508e99efb New translations client.en.yml (Slovenian) 2022-07-30 03:31:21 -07:00
Keegan George
7e878a19f1 New translations client.en.yml (Slovak) 2022-07-30 03:31:20 -07:00
Keegan George
280c01d149 New translations client.en.yml (Russian) 2022-07-30 03:31:19 -07:00
Keegan George
051aaf4d0e New translations client.en.yml (Portuguese) 2022-07-30 03:31:18 -07:00
Keegan George
d36e8223b7 New translations client.en.yml (Polish) 2022-07-30 03:31:17 -07:00
Keegan George
39b9124c84 New translations client.en.yml (Ukrainian) 2022-07-30 03:31:16 -07:00
Keegan George
65812b7b4e New translations client.en.yml (Romanian) 2022-07-30 03:31:15 -07:00
Angus McLeod
556a32aa5c wizard_js locales are only loaded on the new /wizard route for non-staff 2022-07-30 11:23:12 +01:00
Angus McLeod
3fec341e97
Merge pull request #199 from OsamaSayegh/dev/replace-deprecated-component
DEV: Replace `{{user-selector}}` with `{{email-group-user-chooser}}`
2022-07-29 17:28:48 +01:00
Angus McLeod
e3efc68dc9 Bump version 2022-07-29 17:13:44 +01:00
OsamaSayegh
5d55c154c1
DEV: Replace {{user-selector}} with {{email-group-user-chooser}} 2022-07-29 18:51:58 +03:00
Angus McLeod
d9407b5d7d Hide top-notices-outlet in the wizard route 2022-07-29 16:36:06 +01:00
Angus McLeod
2414146fab FIX: step model name update 2022-07-29 16:32:41 +01:00
Keegan George
458f2b896f New translations client.en.yml (Sindhi) 2022-07-28 13:04:42 -07:00
Keegan George
3b270638bf New translations client.en.yml (Croatian) 2022-07-28 13:04:41 -07:00
Keegan George
9263a847af New translations client.en.yml (Kazakh) 2022-07-28 13:04:40 -07:00
Keegan George
e9d78f64a3 New translations client.en.yml (Estonian) 2022-07-28 13:04:39 -07:00
Keegan George
796d4c52db New translations client.en.yml (Latvian) 2022-07-28 13:04:38 -07:00
Keegan George
1354301f3c New translations client.en.yml (Azerbaijani) 2022-07-28 13:04:37 -07:00
Keegan George
292f47f58b New translations client.en.yml (Hindi) 2022-07-28 13:04:36 -07:00
Keegan George
6a0d684d50 New translations client.en.yml (Malay) 2022-07-28 13:04:35 -07:00
Keegan George
315aded76d New translations client.en.yml (Telugu) 2022-07-28 13:04:34 -07:00
Keegan George
3b8b00c712 New translations client.en.yml (Tagalog) 2022-07-28 13:04:33 -07:00
Keegan George
415fdba9fe New translations client.en.yml (Yiddish) 2022-07-28 13:04:32 -07:00
Keegan George
1182c191a0 New translations client.en.yml (Thai) 2022-07-28 13:04:31 -07:00
Keegan George
dfd7e1ad56 New translations client.en.yml (Welsh) 2022-07-28 13:04:30 -07:00
Keegan George
b9b3edd565 New translations client.en.yml (Tatar) 2022-07-28 13:04:29 -07:00
Keegan George
1f73807376 New translations client.en.yml (Malayalam) 2022-07-28 13:04:27 -07:00
Keegan George
7239404b41 New translations client.en.yml (Tibetan) 2022-07-28 13:04:26 -07:00
Keegan George
5cfd322416 New translations client.en.yml (Bosnian) 2022-07-28 13:04:25 -07:00
Keegan George
0e390e0bd6 New translations client.en.yml (Kannada) 2022-07-28 13:04:23 -07:00
Keegan George
bef18c0433 New translations client.en.yml (Swahili) 2022-07-28 13:04:22 -07:00
Keegan George
d78ecbb419 New translations client.en.yml (Nepali) 2022-07-28 13:04:21 -07:00
Keegan George
96fbdee147 New translations client.en.yml (Lao) 2022-07-28 13:04:20 -07:00
Keegan George
f2f6ebb6e7 New translations client.en.yml (Oromo) 2022-07-28 13:04:19 -07:00
Keegan George
2ad58ef79f New translations client.en.yml (Esperanto) 2022-07-28 13:04:18 -07:00
Keegan George
5aa47e1c43 New translations client.en.yml (Bengali) 2022-07-28 13:04:16 -07:00
Keegan George
da91b6df02 New translations client.en.yml (Tamil) 2022-07-28 13:04:15 -07:00
Keegan George
f057fe8339 New translations client.en.yml (Macedonian) 2022-07-28 13:04:14 -07:00
Keegan George
d46899a5df New translations client.en.yml (Lithuanian) 2022-07-28 13:04:13 -07:00
Keegan George
2b447962d1 New translations client.en.yml (Kurdish) 2022-07-28 13:04:12 -07:00
Keegan George
9f491d2541 New translations client.en.yml (Korean) 2022-07-28 13:04:11 -07:00
Keegan George
5a58607bd7 New translations client.en.yml (Georgian) 2022-07-28 13:04:10 -07:00
Keegan George
e94b0dea0e New translations client.en.yml (Japanese) 2022-07-28 13:04:09 -07:00
Keegan George
66b2d414e0 New translations client.en.yml (Italian) 2022-07-28 13:04:08 -07:00
Keegan George
cf0b847194 New translations client.en.yml (Armenian) 2022-07-28 13:04:07 -07:00
Keegan George
4fa8c92241 New translations client.en.yml (Hungarian) 2022-07-28 13:04:06 -07:00
Keegan George
ba2f892eb7 New translations client.en.yml (Hebrew) 2022-07-28 13:04:05 -07:00
Keegan George
3ef92b7859 New translations client.en.yml (Mongolian) 2022-07-28 13:04:04 -07:00
Keegan George
aa5b364e21 New translations client.en.yml (Finnish) 2022-07-28 13:04:03 -07:00
Keegan George
e6a934927c New translations client.en.yml (Greek) 2022-07-28 13:04:02 -07:00
Keegan George
f9b0895b9e New translations client.en.yml (German) 2022-07-28 13:04:00 -07:00
Keegan George
f1529294dd New translations client.en.yml (Danish) 2022-07-28 13:03:59 -07:00
Keegan George
0eafe1249d New translations client.en.yml (Czech) 2022-07-28 13:03:58 -07:00
Keegan George
c28eec978e New translations client.en.yml (Catalan) 2022-07-28 13:03:57 -07:00
Keegan George
ba9d618df0 New translations client.en.yml (Bulgarian) 2022-07-28 13:03:56 -07:00
Keegan George
8efaa58749 New translations client.en.yml (Belarusian) 2022-07-28 13:03:55 -07:00
Keegan George
2747611d5a New translations client.en.yml (Arabic) 2022-07-28 13:03:54 -07:00
Keegan George
ebd826cc9b New translations client.en.yml (Afrikaans) 2022-07-28 13:03:53 -07:00
Keegan George
01bfbc24d4 New translations client.en.yml (Spanish) 2022-07-28 13:03:52 -07:00
Keegan George
048271b136 New translations client.en.yml (Basque) 2022-07-28 13:03:51 -07:00
Keegan George
f9c4de04c4 New translations client.en.yml (French) 2022-07-28 13:03:50 -07:00
Keegan George
96b0fa47b6 New translations client.en.yml (Dutch) 2022-07-28 13:03:48 -07:00
Keegan George
f2cadf9fc2 New translations client.en.yml (Punjabi) 2022-07-28 13:03:47 -07:00
Keegan George
29d01227eb New translations client.en.yml (Khmer) 2022-07-28 13:03:46 -07:00
Keegan George
4f4a8ed8f3 New translations client.en.yml (Persian) 2022-07-28 13:03:45 -07:00
Keegan George
f36884f2dd New translations client.en.yml (Indonesian) 2022-07-28 13:03:44 -07:00
Keegan George
41807aec53 New translations client.en.yml (Portuguese, Brazilian) 2022-07-28 13:03:43 -07:00
Keegan George
6801e2885f New translations client.en.yml (Icelandic) 2022-07-28 13:03:42 -07:00
Keegan George
d88c1cf2ff New translations client.en.yml (Galician) 2022-07-28 13:03:41 -07:00
Keegan George
706c8e0413 New translations client.en.yml (Vietnamese) 2022-07-28 13:03:40 -07:00
Keegan George
b23952a0d2 New translations client.en.yml (Urdu (Pakistan)) 2022-07-28 13:03:39 -07:00
Keegan George
f2822c7520 New translations client.en.yml (Zulu) 2022-07-28 13:03:38 -07:00
Keegan George
f816073405 New translations client.en.yml (Chinese Traditional) 2022-07-28 13:03:38 -07:00
Keegan George
cc504baba6 New translations client.en.yml (Norwegian) 2022-07-28 13:03:36 -07:00
Keegan George
7c3ee8a0e1 New translations client.en.yml (Chinese Simplified) 2022-07-28 13:03:35 -07:00
Keegan George
0105be82b8 New translations client.en.yml (Turkish) 2022-07-28 13:03:34 -07:00
Keegan George
b933d41dbe New translations client.en.yml (Swedish) 2022-07-28 13:03:33 -07:00
Keegan George
a4db15adab New translations client.en.yml (Serbian (Cyrillic)) 2022-07-28 13:03:32 -07:00
Keegan George
09d40951da New translations client.en.yml (Albanian) 2022-07-28 13:03:31 -07:00
Keegan George
5aeabdd648 New translations client.en.yml (Slovenian) 2022-07-28 13:03:30 -07:00
Keegan George
83b985ac02 New translations client.en.yml (Slovak) 2022-07-28 13:03:29 -07:00
Keegan George
7268050cf7 New translations client.en.yml (Russian) 2022-07-28 13:03:28 -07:00
Keegan George
42b7264fc2 New translations client.en.yml (Portuguese) 2022-07-28 13:03:27 -07:00
Keegan George
6fce834244 New translations client.en.yml (Polish) 2022-07-28 13:03:26 -07:00
Keegan George
8b2e3e4c20 New translations client.en.yml (Ukrainian) 2022-07-28 13:03:24 -07:00
Keegan George
1cab61b373 New translations client.en.yml (Romanian) 2022-07-28 13:03:23 -07:00
Angus McLeod
72a1f9f2c2
Merge pull request #198 from paviliondev/move_custom_wizard_into_main_app
Move custom wizard into main app
2022-07-28 21:02:23 +01:00
Angus McLeod
dd74989562 Remove out of date specs 2022-07-28 20:37:10 +01:00
Angus McLeod
12e1d802a3 Remove unused build_type 2022-07-28 20:29:01 +01:00
Angus McLeod
1e56477253 Minor style fixes and deprecation handling 2022-07-28 20:26:35 +01:00
Angus McLeod
b078b9c8f4 Use custom-wizard-step-form 2022-07-28 20:12:36 +01:00
Angus McLeod
ea177b790d Update plugin-tests.yml 2022-07-27 15:55:14 +01:00
Angus McLeod
6792cfb000 Use plugin's prettier 2022-07-27 15:36:22 +01:00
Angus McLeod
039e478f47 Update admin-wizards-api-show.js.es6 2022-07-27 15:33:58 +01:00
Angus McLeod
7f233f178c Apply prettier and eslint 2022-07-27 15:30:45 +01:00
Angus McLeod
f3aed50927 Update plugin-linting workflow 2022-07-27 15:21:02 +01:00
Angus McLeod
cbc76e4810 Update plugin-linting.yml 2022-07-27 15:14:41 +01:00
Angus McLeod
b38f2b947f Update plugin-linting.yml 2022-07-27 14:52:29 +01:00
Angus McLeod
72fc36dd67 Apply prettier 2022-07-27 14:50:49 +01:00
Angus McLeod
d416cbb20e CSS Tweak 2022-07-27 14:47:51 +01:00
Angus McLeod
c6d5778d12 Update metadata 2022-07-27 14:42:08 +01:00
Angus McLeod
c3bec5a3e9 Fix linting 2022-07-27 14:40:48 +01:00
Angus McLeod
150afb29e0 Namespace CSS and remove uneccessary site attributes 2022-07-27 14:40:05 +01:00
Angus McLeod
60823cd87a First release candidate 2022-07-27 11:47:50 +01:00
Angus McLeod
11ff38ae90 Move wizard into core app first step: move the files 2022-07-26 15:18:09 +01:00
Angus McLeod
4b21566673 Merge branch 'main' into pro-release 2022-07-18 08:53:49 +01:00
Angus McLeod
ac279e4a67 Version bump 2022-07-18 07:41:46 +01:00
Angus McLeod
f373e2ad81 COMPATIBILITY: remove overly-active keyPress 2022-07-18 07:41:28 +01:00
Angus McLeod
c7097d5775 COMPATIBILITY: Add new common library 2022-07-18 07:37:10 +01:00
Angus McLeod
d7271b7288 Version bump 2022-07-15 16:41:04 +01:00
Angus McLeod
c107ee2375 Merge branch 'main' into pro-release 2022-07-15 15:14:57 +01:00
Angus McLeod
0b3c71c621 FIX: adopt a simplified with_resolved_locale to ensure user's locale is always loaded 2022-07-15 13:23:32 +01:00
Angus McLeod
8f53d25114 Merge branch 'main' into pro-release 2022-07-13 16:29:24 +01:00
Angus McLeod
d64b6b50dd COMPATIBILITY: The ember resolver has been "modernized"..
fc36ac6cde
2022-07-09 10:24:27 +02:00
Angus McLeod
e761276ed5 COMPATIBILITY: plugin-outlet no longer works as a helper. 2022-07-05 09:06:09 +02:00
Angus McLeod
5d445ecd86 COMPATIBILITY: Move all remaining vendor assets into legacy support 2022-07-05 08:45:31 +02:00
Angus McLeod
180fc0b3ea Create bootstrap-modal.js 2022-07-05 08:40:55 +02:00
Angus McLeod
d2c1a30410 Update linting workflow 2022-06-29 09:55:21 +02:00
Angus McLeod
85c9629da6 COMPATIBILITY: XSS lib has also been moved to a node module
d1d6868325
2022-06-27 11:36:00 +02:00
Angus McLeod
6a5198041b Bump version
Plugin supports all recent asset pipeline changes in Discourse.
2022-06-22 12:56:41 +02:00
Angus McLeod
44f5d39e0a Skip more vendor modules and tweak uppy 2022-06-22 12:45:35 +02:00
Angus McLeod
7dcc6ea61f Add ember_jquery to precompilation pipeline 2022-06-22 12:29:54 +02:00
Angus McLeod
b7d332e0e5 COMPATIBILITY: everything is transpiled by default now.
624c684d51
2022-06-22 12:19:50 +02:00
Angus McLeod
b8329f0fa0 wizard-vendor needs to be precompiled 2022-06-22 10:37:02 +02:00
Angus McLeod
8496e15728 Remove qunit entirely for now
Re-add when migration to ember-cli is made
2022-06-22 10:22:20 +02:00
Angus McLeod
f09ab628df Temporarily disable qunit until we get it working with ember cli 2022-06-22 10:07:20 +02:00
Angus McLeod
ed25847dd8 namespace env in qunit loader 2022-06-22 09:34:43 +02:00
Angus McLeod
ce3d2ced55 COMPATIBILITY: Various core file changes
The completion of the move to ember-cli in core requires a move to an independent asset pipeline. The wizard app itself will be upgraded to ember-cli when I have time. See further:
- fcb4e5a1a1
- 1b4692039e
- a69b914710
2022-06-22 09:14:55 +02:00
Angus McLeod
70329f209a COMPATIBILITY: The core wizard is now an ember addon 2022-06-17 16:00:22 +02:00
Angus McLeod
aea2df9b06 Bump version 2022-06-15 09:59:40 +02:00
Angus McLeod
7cf99f2391 Final cherry pick fixes 2022-06-15 09:57:20 +02:00
Angus McLeod
3136b779b4 More fixes from the cherry picks 2022-06-15 09:14:42 +02:00
Angus McLeod
47eed48ad5 Update wizard-i18n.js.es6 2022-06-15 09:10:33 +02:00
Angus McLeod
af93a67bb1 Fixes from the cherry picks 2022-06-15 09:08:28 +02:00
Angus McLeod
f3c5eeb371 Fix linting 2022-06-15 08:59:09 +02:00
Angus McLeod
3abb65294c re-add qunit bootstrap conditional 2022-06-15 08:37:31 +02:00
Angus McLeod
576d96b2ba FIX: we're no longer extending the application controller 2022-06-15 08:36:40 +02:00
Angus McLeod
41cfdfb135 Fix tests 2022-06-15 08:14:26 +02:00
Angus McLeod
8fd07322d0 Minor config updates 2022-06-15 08:12:58 +02:00
Angus McLeod
39defec897 Remove duplicated functions 2022-06-15 08:10:41 +02:00
Angus McLeod
a2106bf592 Update workflow to add frontend tests && handle deprecations 2022-06-15 08:09:45 +02:00
Angus McLeod
a19a1fa3b1 Refactor wizard client and add tests 2022-06-15 08:03:38 +02:00
Angus McLeod
969fff1a3c COMPATIBILITY: Support tag-group-chooser interface && add base CSS to wizard app 2022-06-13 09:25:34 +02:00
Angus McLeod
e88fff7e25 Tweak preview toggle text 2022-06-02 18:05:17 +02:00
Angus McLeod
717aedb607 Tweak checkbox field description css 2022-06-02 18:00:01 +02:00
Angus McLeod
d000bc7665 Merge branch 'main' into pro-release 2022-06-02 17:51:32 +02:00
Angus McLeod
dec670ac43 FIX: ensure we have the right upload ID when navigating between steps 2022-06-02 17:49:16 +02:00
Angus McLeod
cf33fb9792 Style and other fixes for API features 2022-06-02 16:45:20 +02:00
Angus McLeod
eb8b289b50 Fix create api action 2022-05-31 13:37:34 +02:00
Angus McLeod
1d7d9d1119 Fix failing specs 2022-05-31 13:16:28 +02:00
Angus McLeod
8fd5ae7169 Ensure wizard asset paths are included 2022-05-31 13:04:35 +02:00
Angus McLeod
1c9d52bcfc Fix linting 2022-05-13 12:06:38 +02:00
Angus McLeod
45f52d56c0 Sort actions by subscription type 2022-05-13 12:04:53 +02:00
Angus McLeod
45ab9b1b80 Remove unconnected action 2022-05-13 11:52:11 +02:00
Angus McLeod
3e2faaa264 Merge branch 'main' into pro-release 2022-05-13 11:42:50 +02:00
Angus McLeod
294c35cf9b COMPATIBILITY: three custom fields were dropped in core
991b62b6f1
2022-05-13 11:40:08 +02:00
Angus McLeod
2c7addb9ae FIX: css grid causes issues for admin editor in safari 2022-05-12 18:14:38 +02:00
Angus McLeod
449b81a93e COMPATIBILITY: new editor helper fn signatures
See 94207e27d1
2022-04-22 15:46:32 +03:00
Keegan George
883dacf347 New translations server.en.yml (Portuguese, Brazilian) 2022-04-21 23:47:21 -07:00
Keegan George
4ff50b191b New translations client.en.yml (Portuguese, Brazilian) 2022-04-21 23:47:20 -07:00
Keegan George
8dcdc9c196 New translations server.en.yml (German) 2022-04-20 23:43:06 -07:00
Keegan George
04e78c102f New translations client.en.yml (German) 2022-04-20 23:43:05 -07:00
Keegan George
5325be0308 New translations client.en.yml (German) 2022-04-19 23:46:04 -07:00
Angus McLeod
0970b49db8 Remove unnecessary extensions 2022-04-11 15:24:10 +02:00
Angus McLeod
1f320aac93 Fix tests 2022-04-11 15:16:29 +02:00
Angus McLeod
0313e1be95 Add backslash to qunit path 2022-04-11 14:56:19 +02:00
Angus McLeod
7904bb5b3a Add more env variables 2022-04-11 14:37:04 +02:00
Angus McLeod
4348a4ee68 Add more logs 2022-04-11 14:36:04 +02:00
Angus McLeod
15c0245edf Test config 2022-04-11 14:00:12 +02:00
Angus McLeod
86b0df89d1 Test config 2022-04-11 13:42:32 +02:00
Angus McLeod
0783cac9e0 Add LOAD_PLUGINS to env in action workflow 2022-04-11 12:42:26 +02:00
Angus McLeod
a87dc19eb3 Add qunit CSP extension 2022-04-11 12:21:38 +02:00
Angus McLeod
9b96c02d0f re-add qunit bootstrap conditional 2022-04-11 12:17:11 +02:00
Angus McLeod
cebc63b6d8 Try removing conditional from bootstrap 2022-04-11 11:47:33 +02:00
Angus McLeod
3c0d256e4e Update plugin.rb 2022-04-11 11:35:00 +02:00
Angus McLeod
b0ea1081a2 Update plugin-tests.yml 2022-04-11 11:31:11 +02:00
Angus McLeod
1f899935a0 Update plugin-tests.yml 2022-04-11 11:28:51 +02:00
Angus McLeod
7d941eaf5e Update bootstrap.js.es6 2022-04-11 11:10:00 +02:00
Angus McLeod
8b5b9624d7 Update wizard-qunit.js 2022-04-11 11:08:07 +02:00
Angus McLeod
305f94e9d9 Minor config updates 2022-04-11 11:02:21 +02:00
Angus McLeod
84d21f78e5 Udpate version 2022-04-11 10:01:28 +02:00
Angus McLeod
b57bf8e0fe tweak qunit format 2022-04-11 09:51:01 +02:00
Angus McLeod
9e8878e174 Move to new workflow approach (based on updated Discourse approach) 2022-04-08 16:50:49 +02:00
Angus McLeod
ef22c1d33d Increase qunit timeout 2022-04-08 16:35:40 +02:00
Angus McLeod
2d6581c60c FIX: createWizard is a route action 2022-04-04 15:07:17 +02:00
Angus McLeod
0b6ba868ce FIX: Ensure we always progress index 2022-04-04 12:15:13 +02:00
Angus McLeod
cd43cdd29b Revert "Update admin-wizards-wizard-show.hbs"
This reverts commit 13f5aeda98.
2022-04-04 12:14:05 +02:00
Angus McLeod
61ad74e07b Revert "Update action usage"
This reverts commit 37685ea8cf.
2022-04-04 12:14:00 +02:00
Angus McLeod
13f5aeda98 Update admin-wizards-wizard-show.hbs 2022-04-04 12:02:42 +02:00
Angus McLeod
37685ea8cf Update action usage 2022-04-04 12:01:36 +02:00
Angus McLeod
26b0fcffb0 Update plugin-tests.yml 2022-03-30 11:25:09 +02:00
Angus McLeod
15b72155c5 Update admin-wizards-wizard-show.hbs 2022-03-30 11:01:36 +02:00
Angus McLeod
1296d3bff8 Update action usage 2022-03-29 21:15:09 +02:00
Angus McLeod
466c7a7a49 Explicitly load asset paths for tests 2022-03-29 20:17:59 +02:00
Angus McLeod
a053440466 Update plugin.rb 2022-03-29 18:09:12 +02:00
Angus McLeod
c56e5dcbf8
Merge pull request #192 from paviliondev/remove_subs_and_notices
Remove subs and notices
2022-03-29 16:49:21 +02:00
Angus McLeod
04f0d34ef3 Fix specs 2022-03-25 17:08:24 +01:00
Angus McLeod
92219ace2f Apply linting 2022-03-25 12:22:27 +01:00
Angus McLeod
f607863510 Remove more subscription related things and integrate with subscription client 2022-03-25 12:18:54 +01:00
Angus McLeod
5edfb4c41e Remove subs and notices files 2022-03-16 15:49:25 +01:00
Angus McLeod
c0b93fc166
Merge pull request #191 from paviliondev/add_acceptance_tests
Add acceptance tests
2022-03-16 15:11:09 +01:00
Angus McLeod
591274d38f Skip core qunit 2022-03-16 15:07:49 +01:00
Angus McLeod
01d972f6ba Try using bundle exec 2022-03-16 14:39:39 +01:00
Angus McLeod
7e295dfb14 Update plugin-tests.yml 2022-03-16 14:22:18 +01:00
Angus McLeod
6cd6b111bd Bump minor version 2022-03-16 14:13:45 +01:00
Angus McLeod
61928ce436 Apply rubocop 2022-03-16 14:12:13 +01:00
Angus McLeod
ea52b2779b Remove duplicated functions 2022-03-16 14:10:54 +01:00
Angus McLeod
e7755b106f Update workflow to add frontend tests && handle deprecations 2022-03-16 14:09:23 +01:00
Angus McLeod
0c48435672 Merge branch 'pro-release' into add_acceptance_tests 2022-03-16 12:51:15 +01:00
Angus McLeod
835600c054 Fix linting 2022-03-16 12:46:16 +01:00
Angus McLeod
8893e6caf1 Refactor wizard client and add tests 2022-03-16 12:33:34 +01:00
Angus McLeod
d57f260def Cleanup after merge 2022-03-12 15:20:54 +01:00
Angus McLeod
69fd3d451d merge main 2022-03-12 15:08:56 +01:00
Angus McLeod
cb7bb4e12f Move to proper folder structure 2022-03-12 14:49:41 +01:00
Angus McLeod
72e16ad9c3
Merge pull request #190 from paviliondev/update_simplecov
Move to new coverage approach
2022-03-12 14:40:14 +01:00
Angus McLeod
684a2a3801 Update plugin-tests.yml 2022-03-12 14:26:27 +01:00
Angus McLeod
7a56b9d390 Rubocop 2022-03-12 14:02:11 +01:00
Angus McLeod
8cac2a5960 Update plugin.rb 2022-03-12 14:01:39 +01:00
Angus McLeod
46c86cda58 Move to new coverage approach 2022-03-12 14:00:07 +01:00
Angus McLeod
f9b35a2541 COMPATIBILITY: Remove lodash 2022-03-07 09:02:39 +01:00
Angus McLeod
035e997e35
Merge pull request #186 from paviliondev/bugfix_dropdown
FIX: dropdown content assignment should be allowed to be set to "text"
2022-03-03 21:19:12 +01:00
Angus McLeod
caf2333326 Bump coverage 2022-03-03 21:02:44 +01:00
Angus McLeod
cb1054bcd6 FIX: output text for dropdown should not be possible 2022-03-03 20:47:30 +01:00
Angus McLeod
71af94c80b Version bump 2022-03-03 20:40:29 +01:00
Angus McLeod
3169c0803e BUGFIX: assignment does not need mapping 2022-03-03 20:38:49 +01:00
Angus McLeod
1a2f8f1b76
Merge pull request #185 from Fma965/main
Fix issue with dropdown not working
2022-02-28 20:24:02 +01:00
Scott
c5da68823e
Update plugin.rb 2022-02-28 12:43:10 +00:00
Scott
dbd7251073
Update wizard_field_serializer.rb 2022-02-28 12:34:48 +00:00
Angus McLeod
b20b8ce333 WIP 2 2022-02-17 17:08:14 +11:00
Faizaan Gagan
038604e284
FIX: checkout correct branches of plugin and discourse (#182)
* FIX: checkout correct branches of plugin and discourse

* add condition to check correct discourse branch

* FIX: use updated redis version

* bump patch version
2022-02-16 19:44:56 +05:30
Angus McLeod
b62aee8a48 WIP 2022-02-15 17:16:21 +11:00
Faizaan Gagan
dcefd7c39e FIX: add pretty-text-bundle 2022-02-11 19:20:48 +05:30
Faizaan Gagan
6201530606 FIX: add required dependency 2022-02-11 00:01:43 +05:30
Faizaan Gagan
3b7b0e1a54 cleanup 2022-02-09 12:31:18 +05:30
Angus McLeod
dd067768fd FIX: use request_store properly 2022-02-09 10:30:46 +11:00
Angus McLeod
ba7e8d7cd2 Update plugin.rb 2022-02-09 09:54:55 +11:00
Keegan George
363ce6a83f New translations client.en.yml (Sindhi) 2022-02-06 21:49:23 -08:00
Keegan George
294878d376 New translations client.en.yml (Croatian) 2022-02-06 21:49:22 -08:00
Keegan George
be684274a3 New translations client.en.yml (Kazakh) 2022-02-06 21:49:21 -08:00
Keegan George
4c0e95bddb New translations client.en.yml (Estonian) 2022-02-06 21:49:20 -08:00
Keegan George
3ccfeced5d New translations client.en.yml (Latvian) 2022-02-06 21:49:19 -08:00
Keegan George
a6a87b8471 New translations client.en.yml (Azerbaijani) 2022-02-06 21:49:18 -08:00
Keegan George
c1b4971bd9 New translations client.en.yml (Hindi) 2022-02-06 21:49:17 -08:00
Keegan George
d71808048d New translations client.en.yml (Malay) 2022-02-06 21:49:16 -08:00
Keegan George
57e3bc7421 New translations client.en.yml (Telugu) 2022-02-06 21:49:15 -08:00
Keegan George
61e2817503 New translations client.en.yml (Tagalog) 2022-02-06 21:49:14 -08:00
Keegan George
bf5ce61ede New translations client.en.yml (Yiddish) 2022-02-06 21:49:13 -08:00
Keegan George
f1007b1483 New translations client.en.yml (Thai) 2022-02-06 21:49:12 -08:00
Keegan George
649f014466 New translations client.en.yml (Welsh) 2022-02-06 21:49:11 -08:00
Keegan George
6c1d2df7e1 New translations client.en.yml (Tatar) 2022-02-06 21:49:10 -08:00
Keegan George
90a7512a33 New translations client.en.yml (Malayalam) 2022-02-06 21:49:09 -08:00
Keegan George
18bba7a92b New translations client.en.yml (Tibetan) 2022-02-06 21:49:08 -08:00
Keegan George
01a4469af5 New translations client.en.yml (Bosnian) 2022-02-06 21:49:07 -08:00
Keegan George
fe56e3beff New translations client.en.yml (Kannada) 2022-02-06 21:49:06 -08:00
Keegan George
ccc5103e21 New translations client.en.yml (Swahili) 2022-02-06 21:49:05 -08:00
Keegan George
ba235bac67 New translations client.en.yml (Nepali) 2022-02-06 21:49:04 -08:00
Keegan George
9aefb688a9 New translations client.en.yml (Lao) 2022-02-06 21:49:03 -08:00
Keegan George
2f2072509d New translations client.en.yml (Oromo) 2022-02-06 21:49:02 -08:00
Keegan George
56b795af5d New translations client.en.yml (Esperanto) 2022-02-06 21:49:01 -08:00
Keegan George
3ee4aaf083 New translations client.en.yml (Bengali) 2022-02-06 21:48:59 -08:00
Keegan George
7563608b45 New translations client.en.yml (Tamil) 2022-02-06 21:48:58 -08:00
Keegan George
9f25125510 New translations client.en.yml (Macedonian) 2022-02-06 21:48:57 -08:00
Keegan George
b5022cc07b New translations client.en.yml (Lithuanian) 2022-02-06 21:48:56 -08:00
Keegan George
15a653ddd9 New translations client.en.yml (Kurdish) 2022-02-06 21:48:55 -08:00
Keegan George
56af532903 New translations client.en.yml (Korean) 2022-02-06 21:48:54 -08:00
Keegan George
24752365f7 New translations client.en.yml (Georgian) 2022-02-06 21:48:53 -08:00
Keegan George
eb3c190649 New translations client.en.yml (Japanese) 2022-02-06 21:48:52 -08:00
Keegan George
14f79bd4c8 New translations client.en.yml (Italian) 2022-02-06 21:48:51 -08:00
Keegan George
462b8fef72 New translations client.en.yml (Armenian) 2022-02-06 21:48:50 -08:00
Keegan George
0dc9cdd86a New translations client.en.yml (Hungarian) 2022-02-06 21:48:49 -08:00
Keegan George
9d95ec8811 New translations client.en.yml (Hebrew) 2022-02-06 21:48:48 -08:00
Keegan George
12c37bd733 New translations client.en.yml (Mongolian) 2022-02-06 21:48:47 -08:00
Keegan George
a57d1b5043 New translations client.en.yml (Finnish) 2022-02-06 21:48:46 -08:00
Keegan George
c07337de2e New translations client.en.yml (Greek) 2022-02-06 21:48:45 -08:00
Keegan George
3f56dc9134 New translations client.en.yml (German) 2022-02-06 21:48:44 -08:00
Keegan George
18b28f5b80 New translations client.en.yml (Danish) 2022-02-06 21:48:43 -08:00
Keegan George
421e64ac46 New translations client.en.yml (Czech) 2022-02-06 21:48:42 -08:00
Keegan George
76bf5631e1 New translations client.en.yml (Catalan) 2022-02-06 21:48:41 -08:00
Keegan George
eb9c443484 New translations client.en.yml (Bulgarian) 2022-02-06 21:48:40 -08:00
Keegan George
df9494e461 New translations client.en.yml (Belarusian) 2022-02-06 21:48:39 -08:00
Keegan George
c57c551129 New translations client.en.yml (Arabic) 2022-02-06 21:48:38 -08:00
Keegan George
22b9698f2b New translations client.en.yml (Afrikaans) 2022-02-06 21:48:37 -08:00
Keegan George
1c4422d7e2 New translations client.en.yml (Spanish) 2022-02-06 21:48:36 -08:00
Keegan George
15539eb0c3 New translations client.en.yml (Basque) 2022-02-06 21:48:35 -08:00
Keegan George
681ba4e5b4 New translations client.en.yml (French) 2022-02-06 21:48:34 -08:00
Keegan George
0f58fe5aab New translations client.en.yml (Dutch) 2022-02-06 21:48:33 -08:00
Keegan George
27396538ad New translations client.en.yml (Punjabi) 2022-02-06 21:48:32 -08:00
Keegan George
24be61e593 New translations client.en.yml (Khmer) 2022-02-06 21:48:31 -08:00
Keegan George
f967f792d2 New translations client.en.yml (Persian) 2022-02-06 21:48:30 -08:00
Keegan George
7bea8c1c12 New translations client.en.yml (Indonesian) 2022-02-06 21:48:29 -08:00
Keegan George
a75fc1f2d4 New translations client.en.yml (Icelandic) 2022-02-06 21:48:28 -08:00
Keegan George
1b69c1919a New translations client.en.yml (Galician) 2022-02-06 21:48:26 -08:00
Keegan George
3a922f7a93 New translations client.en.yml (Vietnamese) 2022-02-06 21:48:25 -08:00
Keegan George
a0688b81a2 New translations client.en.yml (Urdu (Pakistan)) 2022-02-06 21:48:24 -08:00
Keegan George
8dc59745e6 New translations client.en.yml (Zulu) 2022-02-06 21:48:23 -08:00
Keegan George
1d1ac820f5 New translations client.en.yml (Chinese Traditional) 2022-02-06 21:48:22 -08:00
Keegan George
69942a8a58 New translations client.en.yml (Norwegian) 2022-02-06 21:48:22 -08:00
Keegan George
a5fd54a3ee New translations client.en.yml (Chinese Simplified) 2022-02-06 21:48:21 -08:00
Keegan George
5e231c3e7b New translations client.en.yml (Turkish) 2022-02-06 21:48:19 -08:00
Keegan George
3df6fcbf0c New translations client.en.yml (Swedish) 2022-02-06 21:48:18 -08:00
Keegan George
ec650a1f67 New translations client.en.yml (Serbian (Cyrillic)) 2022-02-06 21:48:18 -08:00
Keegan George
bed0483e64 New translations client.en.yml (Albanian) 2022-02-06 21:48:16 -08:00
Keegan George
5b3550bdde New translations client.en.yml (Slovenian) 2022-02-06 21:48:15 -08:00
Keegan George
b1d5c888c4 New translations client.en.yml (Slovak) 2022-02-06 21:48:14 -08:00
Keegan George
91c9644fb1 New translations client.en.yml (Russian) 2022-02-06 21:48:13 -08:00
Keegan George
71c101290c New translations client.en.yml (Portuguese) 2022-02-06 21:48:12 -08:00
Keegan George
87f7b22103 New translations client.en.yml (Polish) 2022-02-06 21:48:11 -08:00
Keegan George
47df65292c New translations client.en.yml (Ukrainian) 2022-02-06 21:48:10 -08:00
Keegan George
f0f16ce4dc New translations client.en.yml (Romanian) 2022-02-06 21:48:09 -08:00
Faizaan Gagan
f0580d2bba
FEATURE: allow tags from tag field to be confined to a tag group (#175)
* FEATURE: allow tag field to be confined to a tag group

* fixed linting

* bump minor version

* moved monkeypatch to a separate module

* use snake case for variable names

* added specs
2022-02-07 11:10:52 +05:30
Keegan George
676d538da2
i18n: Update Translations (#173)
* New translations client.en.yml (Romanian)

* New translations client.en.yml (Ukrainian)

* New translations client.en.yml (Polish)

* New translations client.en.yml (Portuguese)

* New translations client.en.yml (Russian)

* New translations client.en.yml (Slovak)

* New translations client.en.yml (Slovenian)

* New translations client.en.yml (Albanian)

* New translations client.en.yml (Serbian (Cyrillic))

* New translations client.en.yml (Swedish)

* New translations client.en.yml (Turkish)

* New translations client.en.yml (Chinese Simplified)

* New translations client.en.yml (Norwegian)

* New translations client.en.yml (Chinese Traditional)

* New translations client.en.yml (Zulu)

* New translations client.en.yml (Urdu (Pakistan))

* New translations client.en.yml (Vietnamese)

* New translations client.en.yml (Galician)

* New translations client.en.yml (Icelandic)

* New translations client.en.yml (Indonesian)

* New translations client.en.yml (Persian)

* New translations client.en.yml (Khmer)

* New translations client.en.yml (Punjabi)

* New translations client.en.yml (Dutch)

* New translations client.en.yml (French)

* New translations client.en.yml (Basque)

* New translations client.en.yml (Spanish)

* New translations client.en.yml (Afrikaans)

* New translations client.en.yml (Arabic)

* New translations client.en.yml (Belarusian)

* New translations client.en.yml (Bulgarian)

* New translations client.en.yml (Catalan)

* New translations client.en.yml (Czech)

* New translations client.en.yml (Danish)

* New translations client.en.yml (German)

* New translations client.en.yml (Greek)

* New translations client.en.yml (Finnish)

* New translations client.en.yml (Mongolian)

* New translations client.en.yml (Hebrew)

* New translations client.en.yml (Hungarian)

* New translations client.en.yml (Armenian)

* New translations client.en.yml (Italian)

* New translations client.en.yml (Japanese)

* New translations client.en.yml (Georgian)

* New translations client.en.yml (Korean)

* New translations client.en.yml (Kurdish)

* New translations client.en.yml (Lithuanian)

* New translations client.en.yml (Macedonian)

* New translations client.en.yml (Tamil)

* New translations client.en.yml (Bengali)

* New translations server.en.yml (Finnish)

* New translations server.en.yml (Arabic)

* New translations server.en.yml (Belarusian)

* New translations server.en.yml (Bulgarian)

* New translations server.en.yml (Catalan)

* New translations server.en.yml (Czech)

* New translations server.en.yml (Danish)

* New translations server.en.yml (German)

* New translations server.en.yml (Greek)

* New translations server.en.yml (Basque)

* New translations server.en.yml (Hebrew)

* New translations server.en.yml (Spanish)

* New translations server.en.yml (Hungarian)

* New translations server.en.yml (Armenian)

* New translations server.en.yml (Italian)

* New translations server.en.yml (Japanese)

* New translations server.en.yml (Georgian)

* New translations server.en.yml (Korean)

* New translations server.en.yml (Kurdish)

* New translations server.en.yml (Lithuanian)

* New translations server.en.yml (Macedonian)

* New translations server.en.yml (Mongolian)

* New translations server.en.yml (Afrikaans)

* New translations server.en.yml (French)

* New translations client.en.yml (Thai)

* New translations client.en.yml (Welsh)

* New translations client.en.yml (Croatian)

* New translations client.en.yml (Kazakh)

* New translations client.en.yml (Estonian)

* New translations client.en.yml (Latvian)

* New translations client.en.yml (Azerbaijani)

* New translations client.en.yml (Hindi)

* New translations client.en.yml (Malay)

* New translations client.en.yml (Telugu)

* New translations client.en.yml (Tagalog)

* New translations client.en.yml (Yiddish)

* New translations client.en.yml (Esperanto)

* New translations server.en.yml (Romanian)

* New translations client.en.yml (Tatar)

* New translations client.en.yml (Malayalam)

* New translations client.en.yml (Tibetan)

* New translations client.en.yml (Bosnian)

* New translations client.en.yml (Kannada)

* New translations client.en.yml (Swahili)

* New translations client.en.yml (Nepali)

* New translations client.en.yml (Lao)

* New translations client.en.yml (Oromo)

* New translations client.en.yml (Sindhi)

* New translations server.en.yml (Dutch)

* New translations server.en.yml (Norwegian)

* New translations server.en.yml (Welsh)

* New translations server.en.yml (Kazakh)

* New translations server.en.yml (Estonian)

* New translations server.en.yml (Latvian)

* New translations server.en.yml (Azerbaijani)

* New translations server.en.yml (Hindi)

* New translations server.en.yml (Malay)

* New translations server.en.yml (Telugu)

* New translations server.en.yml (Tagalog)

* New translations server.en.yml (Yiddish)

* New translations server.en.yml (Esperanto)

* New translations server.en.yml (Thai)

* New translations server.en.yml (Tatar)

* New translations server.en.yml (Malayalam)

* New translations server.en.yml (Tibetan)

* New translations server.en.yml (Bosnian)

* New translations server.en.yml (Kannada)

* New translations server.en.yml (Swahili)

* New translations server.en.yml (Nepali)

* New translations server.en.yml (Lao)

* New translations server.en.yml (Oromo)

* New translations server.en.yml (Croatian)

* New translations server.en.yml (Bengali)

* New translations server.en.yml (Punjabi)

* New translations server.en.yml (Ukrainian)

* New translations server.en.yml (Polish)

* New translations server.en.yml (Portuguese)

* New translations server.en.yml (Russian)

* New translations server.en.yml (Slovak)

* New translations server.en.yml (Slovenian)

* New translations server.en.yml (Albanian)

* New translations server.en.yml (Serbian (Cyrillic))

* New translations server.en.yml (Swedish)

* New translations server.en.yml (Turkish)

* New translations server.en.yml (Chinese Simplified)

* New translations server.en.yml (Tamil)

* New translations server.en.yml (Chinese Traditional)

* New translations server.en.yml (Zulu)

* New translations server.en.yml (Urdu (Pakistan))

* New translations server.en.yml (Vietnamese)

* New translations server.en.yml (Galician)

* New translations server.en.yml (Icelandic)

* New translations server.en.yml (Indonesian)

* New translations server.en.yml (Persian)

* New translations server.en.yml (Khmer)

* New translations server.en.yml (Sindhi)

* New translations client.en.yml (Serbian (Cyrillic))

* New translations client.en.yml (Chinese Simplified)

* New translations client.en.yml (Chinese Traditional)

* New translations server.en.yml (Serbian (Cyrillic))

* New translations server.en.yml (Chinese Simplified)

* New translations server.en.yml (Chinese Traditional)

* bump version

* New translations server.en.yml (Romanian)

* New translations server.en.yml (Ukrainian)

* New translations server.en.yml (Polish)

* New translations server.en.yml (Portuguese)

* New translations server.en.yml (Russian)

* New translations server.en.yml (Slovak)

* New translations server.en.yml (Slovenian)

* New translations server.en.yml (Albanian)

* New translations server.en.yml (Serbian (Cyrillic))

* New translations server.en.yml (Swedish)

* New translations server.en.yml (Turkish)

* New translations server.en.yml (Chinese Simplified)

* New translations server.en.yml (Norwegian)

* New translations server.en.yml (Chinese Traditional)

* New translations server.en.yml (Zulu)

* New translations server.en.yml (Urdu (Pakistan))

* New translations server.en.yml (Vietnamese)

* New translations server.en.yml (Galician)

* New translations server.en.yml (Icelandic)

* New translations server.en.yml (Indonesian)

* New translations server.en.yml (Persian)

* New translations server.en.yml (Khmer)

* New translations server.en.yml (Punjabi)

* New translations server.en.yml (Dutch)

* New translations server.en.yml (French)

* New translations server.en.yml (Basque)

* New translations server.en.yml (Spanish)

* New translations server.en.yml (Afrikaans)

* New translations server.en.yml (Arabic)

* New translations server.en.yml (Belarusian)

* New translations server.en.yml (Bulgarian)

* New translations server.en.yml (Catalan)

* New translations server.en.yml (Czech)

* New translations server.en.yml (Danish)

* New translations server.en.yml (German)

* New translations server.en.yml (Greek)

* New translations server.en.yml (Finnish)

* New translations server.en.yml (Mongolian)

* New translations server.en.yml (Hebrew)

* New translations server.en.yml (Hungarian)

* New translations server.en.yml (Armenian)

* New translations server.en.yml (Italian)

* New translations server.en.yml (Japanese)

* New translations server.en.yml (Georgian)

* New translations server.en.yml (Korean)

* New translations server.en.yml (Kurdish)

* New translations server.en.yml (Lithuanian)

* New translations server.en.yml (Macedonian)

* New translations server.en.yml (Tamil)

* New translations server.en.yml (Bengali)

* New translations server.en.yml (Esperanto)

* New translations server.en.yml (Oromo)

* New translations server.en.yml (Lao)

* New translations server.en.yml (Nepali)

* New translations server.en.yml (Swahili)

* New translations server.en.yml (Kannada)

* New translations server.en.yml (Bosnian)

* New translations server.en.yml (Tibetan)

* New translations server.en.yml (Malayalam)

* New translations server.en.yml (Tatar)

* New translations server.en.yml (Welsh)

* New translations server.en.yml (Thai)

* New translations server.en.yml (Yiddish)

* New translations server.en.yml (Tagalog)

* New translations server.en.yml (Telugu)

* New translations server.en.yml (Malay)

* New translations server.en.yml (Hindi)

* New translations server.en.yml (Azerbaijani)

* New translations server.en.yml (Latvian)

* New translations server.en.yml (Estonian)

* New translations server.en.yml (Kazakh)

* New translations server.en.yml (Croatian)

* New translations server.en.yml (Sindhi)

Co-authored-by: Faizaan Gagan <fzngagan@gmail.com>
2022-02-01 12:20:18 +05:30
Faizaan Gagan
8d2dbd565e
FIX: increase width to accomodate long category names (#178)
* FIX: increase width to accomodate long category names

* version bump
2022-01-31 16:21:23 +05:30
Angus McLeod
f92c2cd574
FIX: Wizard id increment fix (#177)
* increment object ids based on last object id

* Bump version

* Apply prettier
2022-01-31 15:12:26 +05:30
Faizaan Gagan
51553bc71d
FEATURE: validate liquid templates on wizard save (#156)
* DEV: validate liquid templates on wizard save

* minor fix

* code improvements and spec

* version bump

* fixed failing specs

* FIX: handle displaying backend validation errors on frontend

* fixed linting

* improved error display

* validate raw description for steps

* refactor conditional

* Identify attribute with liquid template error and pass syntax error

Co-authored-by: angusmcleod <angus@mcleod.org.au>
Co-authored-by: Angus McLeod <angusmcleod@users.noreply.github.com>
2022-01-31 15:11:14 +05:30
Angus McLeod
5e5b5e67ee
FIX: Cache valid directs and only allow one type in a template (#176)
* Cache valid directs and only allow one type in a template

* Add spec

* Bump version

* Bump version

* Exclude current wizard from other_after_signup
2022-01-31 14:48:04 +05:30
Angus McLeod
5bbb36e213
Merge pull request #151 from paviliondev/wizard-permissions
FIX: grant reply/edit permissions to topic author
2022-01-31 16:04:38 +08:00
Faizaan Gagan
f5a35baa1b simplified logic 2022-01-31 12:50:20 +05:30
Faizaan Gagan
5d882d69a2 merged 'main' and resolved conflicts 2022-01-31 09:47:12 +05:30
angusmcleod
4605b23585 Merge branch 'main' into pro-release 2022-01-27 17:51:24 +08:00
Keegan George
c9e243f3d8
DEV: Add PR title for translations 2022-01-26 09:37:31 -08:00
Keegan George
9f0b08a37e Update Crowdin configuration file 2022-01-26 06:20:50 -08:00
angusmcleod
02e931ae08 Update plugin-linting.yml 2021-12-22 16:49:24 +08:00
angusmcleod
43c4a1e0d6 COMPATIBILITY: composer editor compatibility updates 2021-12-22 16:41:38 +08:00
angusmcleod
41b5ba4f31 FIX: cleanup mixin requires 2021-12-22 12:35:47 +08:00
Angus McLeod
3ffb0a9c2a
Merge pull request #169 from martin-brennan/issue/replace-image-uploader-with-uppy-image-uploader
FIX: Use uppy-image-uploader instead of image-uploader
2021-12-22 12:14:51 +08:00
angusmcleod
b74dfcc3f8 Increment patch version 2021-12-22 12:12:48 +08:00
Martin Brennan
7f065d91a1
FIX: Use uppy-image-uploader instead of image-uploader
The image-uploader component is deprecated and will
be removed shortly in Discourse core. The new component
is functionally equivalent.
2021-12-21 15:15:11 +10:00
Angus McLeod
517da30a4c
DEV: Use uppy in upload field (#167)
* Move from jquery uploads to uppy.js

* Apply prettier and update version
2021-12-16 13:56:44 +05:30
angusmcleod
b37f7dbdd5 DEV: preview template style improvements 2021-12-14 09:11:23 +08:00
Angus McLeod
1c31097078
Merge pull request #155 from paviliondev/create_topic_button_override
FEATURE: allow 'New Topic' button to redirect to a wizard
2021-12-09 10:09:29 +08:00
angusmcleod
70c3f19334 Update settings text and file naming 2021-12-09 09:53:10 +08:00
Faizaan Gagan
21b0d52b1b cleanup 2021-12-08 12:56:14 +05:30
Faizaan Gagan
9c98887437 optional chaining to prevent errors 2021-12-08 12:50:57 +05:30
Faizaan Gagan
1a08c9b0c0 merged 'main' and resolved conflicts 2021-12-08 12:30:37 +05:30
Faizaan Gagan
00682fb4c2
FIX: field validation was not working in backend (#165)
* FIX: field validation was not working in backend

* added tests
2021-12-07 14:20:34 +05:30
Faizaan Gagan
460d4e397a fixed linting 2021-12-07 14:01:39 +05:30
Tim Santos
757b382345
Update .discourse-compatibility (#161) 2021-12-06 11:49:09 +05:30
Angus McLeod
b95639b315
Merge pull request #163 from paviliondev/uploader_compatibility_fixes
COMPATIBILITY: support new uploader
2021-12-01 16:38:07 +08:00
angusmcleod
1ad9691e49 COMPATIBILITY: support new uploader 2021-12-01 15:19:14 +08:00
angusmcleod
7af77533ba Add https to notice requests 2021-11-25 14:38:16 +08:00
Angus McLeod
ce0335b679
Merge pull request #159 from paviliondev/fix_date_time_display
FIX: pass a fallback format to date picker
2021-11-22 09:24:25 +08:00
Faizaan Gagan
c271612fa9 minor formatting 2021-11-22 01:40:50 +05:30
Faizaan Gagan
3cb7e1fffb set a fallback if no date format is passed 2021-11-22 01:23:12 +05:30
Faizaan Gagan
342fe53a4d remove unused import 2021-11-22 00:38:43 +05:30
Faizaan Gagan
acd27cd380 FIX: don't pass format to date picker 2021-11-22 00:30:29 +05:30
Faizaan Gagan
ac944dbb3e FIX: Discourse.BaseUrl no longer works 2021-11-21 11:22:36 +05:30
Faizaan Gagan
80d470b25d FIX: add import, fix deprication 2021-11-21 10:41:44 +05:30
angusmcleod
fac8d821cf publish notice count at the end of the update cycle 2021-11-18 17:07:15 +08:00
angusmcleod
e1a746ca28 Add pluginId and console.logs 2021-11-18 16:32:23 +08:00
angusmcleod
559d3f4f19 Use iso times for the notice timestamps 2021-11-18 16:05:32 +08:00
Faizaan Gagan
cdafffea2b use proper structure for preloading category custom fields 2021-11-17 20:15:48 +05:30
Angus McLeod
75d881de06
Merge pull request #157 from paviliondev/add_notice_inbox
Add notice inbox
2021-11-17 21:04:52 +08:00
angusmcleod
49538d554d Linting 2021-11-17 20:48:11 +08:00
angusmcleod
853634be27 Fix failing specs 2021-11-17 20:26:44 +08:00
angusmcleod
98061c14e8 Fix spec (mostly) 2021-11-17 20:26:44 +08:00
angusmcleod
81bb7e56c2 WIP 2021-11-17 20:26:44 +08:00
Angus McLeod
bbd1253891
Merge pull request #147 from paviliondev/pro-release-api
Pro release api
2021-11-17 20:18:54 +08:00
Faizaan Gagan
892914d649 fixed formatting 2021-11-11 17:38:53 +05:30
Faizaan Gagan
f044ad6101 bump version 2021-11-11 17:22:54 +05:30
Faizaan Gagan
564985e46e FEATURE: allow 'New Topic' button to redirect to a wizard 2021-11-11 17:20:42 +05:30
angusmcleod
457463f7c7 Add blankspace 2021-11-10 22:25:42 +08:00
merefield
e37b2a6e85 Remove semi colon! 2021-11-09 15:04:04 +00:00
merefield
584ee6d24e remove redundant returns 2021-11-09 15:01:17 +00:00
merefield
c6b8e08e38 Add subscription level logic to back-end validation 2021-11-09 14:57:33 +00:00
angusmcleod
9ab441f888 Update plugin metadata 2021-11-09 20:38:53 +08:00
merefield
14a337e00c template lint 2021-11-02 09:11:30 +00:00
merefield
3add43e81b eslint 2021-11-02 09:09:06 +00:00
merefield
8cbc8745b9 prettier 2021-11-02 09:06:00 +00:00
merefield
bd5edaffe9 custom field input: further make generic, fix serializers dropdown 2021-11-02 08:58:15 +00:00
Faizaan Gagan
51dbf7ac40
FIX: handle non-logged in user trying to skip wizard (#154)
* FIX: handle non-logged in user trying to skip wizard

* update version, fixed formatting

* make sure skipping user is logged in
2021-11-02 13:41:46 +05:30
Faizaan Gagan
4b0008ee52 version bump 2021-10-30 16:09:38 +05:30
Faizaan Gagan
b7575a3295 use standard naming for custom fields 2021-10-30 16:07:16 +05:30
Faizaan Gagan
dec5f5b5ce added more specs and fixed formatting 2021-10-30 16:03:30 +05:30
Faizaan Gagan
c1481e2ad4 Merge branch 'main' into wizard-permissions 2021-10-30 14:29:32 +05:30
angusmcleod
b9b80ecc63 FIX: use object property shorthand to make linter happy 2021-10-28 09:55:50 +08:00
Angus McLeod
c2864b9790
Merge pull request #153 from paviliondev/conditionality_fix
Conditionality Fix
2021-10-28 09:46:14 +08:00
merefield
a3d59caee8 yet more linting fixes 2021-10-27 15:05:09 +01:00
merefield
203876e927 linting fixes 2021-10-27 15:01:29 +01:00
merefield
60388b7dab fix more linting errors 2021-10-27 14:52:22 +01:00
merefield
31b4663b3f Fix linting errors 2021-10-27 14:41:49 +01:00
merefield
0c9acb9b20 Update subscription titles 2021-10-27 14:31:24 +01:00
merefield
0752f8068a fix subscription spec 2021-10-27 14:09:34 +01:00
merefield
791eab6c47 Fix action spec example 2021-10-27 14:02:21 +01:00
merefield
36257fbdfe fix excon call 2021-10-27 13:59:50 +01:00
merefield
9350db5424 REFACTOR: abstract subscription logic to reduce code 2021-10-25 18:55:28 +01:00
merefield
7b129debac partial generalisation of subscription logic 2021-10-25 15:31:44 +01:00
merefield
a806e14c64 Admin custom fields subscription differentiation 2021-10-23 13:06:12 +01:00
merefield
5334d12f10 format code 2021-10-22 19:57:16 +01:00
merefield
fbab8d89a5 Update action dropdown behaviour to show sub level 2021-10-22 19:56:00 +01:00
merefield
41e0f13b25 update subscription types 2021-10-22 19:24:28 +01:00
merefield
50176b400d more rubocop 2021-10-22 19:07:45 +01:00
merefield
0b8fced879 rubocop changes 2021-10-22 19:04:37 +01:00
merefield
30fe73570a remove triple curlies 2021-10-22 15:38:38 +01:00
angusmcleod
a9af086252 bump version: patch
@fzngagan I don't think this qualifies as a new feature, as it's a bugfix plus a related UI update to make the UX of an existing feature clearer
2021-10-20 22:03:42 +08:00
angusmcleod
ede6752619 Apply prettier 2021-10-20 22:00:30 +08:00
angusmcleod
5abc0f4a4c IMPROVE: Add value type to mapper selector 2021-10-20 21:56:34 +08:00
angusmcleod
f908e5ec9d Add spec for fix 2021-10-20 21:19:21 +08:00
angusmcleod
805e934fdf FIX: cast both key and value as boolean if operator is `is:[true|false]` 2021-10-20 20:48:38 +08:00
merefield
b4f463778d fix linting issues 2021-10-19 13:49:06 +01:00
merefield
b616adaf71 fix linting 2021-10-19 13:13:32 +01:00
merefield
487ad3c46d Fix test 2021-10-19 13:09:11 +01:00
angusmcleod
231051d8ea Update status domains 2021-10-19 16:08:03 +08:00
angusmcleod
774cf70efc IMPROVE: remove custom paragraph line-height 2021-10-19 15:16:54 +08:00
Angus McLeod
69153a7379
IMPROVE: Add plugin metadata workflow with version check (#149)
* IMPROVE: Add plugin metadata workflow with version check

* Update error message

* Fix workflow keys

* Update plugin-metadata.yml

* Update plugin-metadata.yml

* Update plugin-metadata.yml

* bump version

* Update plugin-metadata.yml

* Update plugin-metadata.yml

* Use npm semver to compare versions

* Fix syntax

* Add semver to package.json

* Update npm usage

* Update plugin-metadata.yml

* Update plugin-metadata.yml

* purposefully fail test

* Pass test
2021-10-19 09:11:16 +05:30
Faizaan Gagan
687c3530b3 WIP 2021-10-19 09:05:55 +05:30
Faizaan Gagan
d9d4c7d8fa WIP 2021-10-14 18:27:18 +05:30
merefield
deb4460d2c modify dropdown sub text slightly 2021-10-14 13:53:58 +01:00
merefield
a42e23d352 Show but differentiate unsubbed action options 2021-10-14 13:41:24 +01:00
Robert Barrow
a13096c8f1 merge in pro-release branch 2021-10-13 14:22:33 +01:00
angusmcleod
450f7bfc25 Update notice.rb 2021-10-13 19:32:49 +08:00
Robert Barrow
e5fbc408f5 Add failing API call test 2021-10-12 14:49:09 +01:00
Robert Barrow
3e2907abc2 show api for complete sub 2021-10-12 14:37:36 +01:00
Robert Barrow
d4e489456e rename functional levels 2021-10-12 13:01:39 +01:00
Robert Barrow
67cfeb6ed9 Distinguish actions which require additional subscription 2021-10-12 12:51:38 +01:00
Robert Barrow
14e7e9c0db improve api section switch 2021-10-12 09:54:52 +01:00
angusmcleod
702ccc868c Update connection_error.rb 2021-10-12 09:45:50 +08:00
angusmcleod
b475e39ee9 Fix specs 2021-10-07 21:19:19 +08:00
Angus McLeod
538d618ff3
FEATURE: Add mentionables integration (#148)
* Add mentionables integration

* fix linting issues

* bump version

* FIX: Use wizard site model

* FIX: apply prettier
2021-10-06 17:25:50 +05:30
angusmcleod
925c8c009a DEV: Add notice specs and UI updates 2021-10-05 20:54:06 +08:00
merefield
1f939c1ca0 API: only show API menu on business sub 2021-10-05 10:20:36 +01:00
merefield
31e275668c API: remove byebug 2021-10-05 10:19:47 +01:00
merefield
5a424e8e3d API: add mocked request spec 2021-10-05 10:07:20 +01:00
merefield
6056351b7c API: fix request call 2021-10-05 10:06:15 +01:00
angusmcleod
d4c25d406b DEV: add stable to github workflows 2021-10-05 14:33:27 +08:00
angusmcleod
1edfcca78b DEV: remove group log settings change from create_group action 2021-10-05 10:23:48 +08:00
merefield
a2ebd5c463 API: don't present an API menu entry if not subscribed 2021-10-04 18:51:47 +01:00
merefield
c9453a0bdd API: remove GET method from API options 2021-10-04 14:40:17 +01:00
angusmcleod
084c6f4a7a wip 2021-09-24 17:58:42 +08:00
Faizaan Gagan
2678ee153d
FEATURE: add resume wizard popup (#146)
* FEATURE: add resume wizard popup

* code cleanup, copy edits

* FIX: address functionality, setting and copy issues

@fzngagan a few issues fixed

1. The resume button wasn't working (old reference to ``resumeDialog`` remained in callback.
2. This needs a wizard setting
3. It's not necessary to serialize the first step separately. We have all the steps in ``steps`` and steps have indexes.
4. Button copy

* Fix linting

* Ensure aa submission exists

* Apply prettier

Co-authored-by: angusmcleod <angus@mcleod.org.au>
2021-09-22 13:52:05 +05:30
angusmcleod
270d3bccf5 IMPROVE: translation feature 2021-09-14 11:33:16 +08:00
Faizaan Gagan
11192182e7
DEV: bump version according to latest calculation (#141)
* bump version according to latest calculation

* bumped version for the current PR
2021-09-09 19:06:01 +05:30
angusmcleod
15668d37dc COMPATIBILITY: add new click-trap vendor 2021-09-09 15:13:02 +08:00
angusmcleod
10fb3ee176 Merge branch 'master' into pro-release 2021-09-09 14:39:49 +08:00
angusmcleod
2cd02a15fe COMPATIBILITY: remove removed vendor 2021-09-09 14:39:36 +08:00
angusmcleod
7b57e7fcab Apply new table style to wizard logs view 2021-09-09 14:07:12 +08:00
angusmcleod
a8e81150f1 Remove additional sentence from submissions.viewing 2021-09-08 18:25:30 +08:00
Angus McLeod
13304f5b6d
Merge pull request #144 from paviliondev/pro-features
Pro features
2021-09-07 21:58:14 +08:00
angusmcleod
4a0d176f1a Fix locale file 2021-09-07 20:55:46 +08:00
angusmcleod
18c43f499e Apply template lint 2021-09-07 20:53:45 +08:00
angusmcleod
ba897abf8e Apply eslint 2021-09-07 20:15:04 +08:00
angusmcleod
33824de1d1 Merge branch 'pro-features' of https://github.com/angusmcleod/discourse-custom-wizard into pro-features 2021-09-07 20:13:13 +08:00
angusmcleod
0313c773e8 Apply prettier 2021-09-07 20:13:01 +08:00
angusmcleod
7c9a0ef862 Apply rubocop 2021-09-07 20:11:50 +08:00
Angus McLeod
f4d419cac2
Merge branch 'pro-release' into pro-features 2021-09-07 20:10:12 +08:00
angusmcleod
23c4b45195 Add pro feature specs 2021-09-07 20:06:13 +08:00
angusmcleod
61f7cf64af COMPATIBILITY: add new vendor require 2021-09-07 11:11:59 +08:00
angusmcleod
208cb1229a FIX: Minor bugfixes in manager and create_group action 2021-09-07 11:11:29 +08:00
Angus McLeod
3383aec37f
Merge pull request #142 from paviliondev/ui_conventions
UX: Update Submissions Admin UI
2021-09-06 22:51:52 +08:00
angusmcleod
5063e3eaeb Merge branch 'ui_conventions' of https://github.com/paviliondev/discourse-custom-wizard into pr/142 2021-09-06 17:26:34 +08:00
angusmcleod
31b9e48c8f Apply rubocop 2021-09-06 17:26:22 +08:00
angusmcleod
f6c3c98d71 Add submission serializer spec 2021-09-06 17:25:08 +08:00
angusmcleod
8ddff9873d Merge branch 'master' of https://github.com/angusmcleod/discourse-custom-wizard 2021-09-06 10:57:44 +08:00
angusmcleod
1d70232952 COMPATIBILITY: update stable commit after rebase 2021-09-06 10:53:53 +08:00
angusmcleod
4b20542251 COMPATIBILITY: pin current stable prior to tests-passed compatibility changes 2021-09-06 10:52:32 +08:00
angusmcleod
a5b0cf95ba COMPATIBILITY: Add new textarea-text-manipulation mixin 2021-09-06 10:52:32 +08:00
angusmcleod
9db8ce908a COMPATIBILITY: Add new composer-upload mixin 2021-09-06 10:52:32 +08:00
angusmcleod
e07a57e398 IMPROVE: by default every tag should be available in admin tag selector 2021-09-06 10:52:32 +08:00
angusmcleod
2362478c9c IMPROVE: by default every tag should be available in tag field 2021-09-06 10:52:32 +08:00
angusmcleod
481e9e668c IMPROVE: by default every tag should be available in admin tag selector 2021-09-06 10:45:41 +08:00
angusmcleod
8911862320 COMPATIBILITY: pin current stable prior to tests-passed compatibility changes 2021-09-06 10:30:04 +08:00
angusmcleod
8dbb3990e4 Remove test change 2021-09-03 16:46:43 +08:00
angusmcleod
6ef333a657 Complete pro-feature functionality 2021-09-03 16:46:32 +08:00
angusmcleod
65e269c71f IMPROVE: by default every tag should be available in tag field 2021-09-03 09:41:11 +08:00
Keegan George
c60d1e3338 DEV: Run Prettier 💄 2021-09-02 15:46:49 -07:00
Keegan George
4abe30464c DEV: Run Prettier💄 2021-09-02 15:43:34 -07:00
Keegan George
1e38001942 DEV: Run Prettier 💄 2021-09-02 15:41:55 -07:00
Keegan George
9fc2092951 DEV: Run prettier 💄 2021-09-02 15:38:30 -07:00
Angus McLeod
450a94e38d
Merge pull request #143 from paviliondev/split_log_messages
DEV: split log messages
2021-09-02 14:48:49 +08:00
Keegan George
7b13605c7b FIX: Resolve linting issues 2021-09-01 12:46:39 -07:00
Keegan George
622ab1b2ce Merge branch 'pro-release' of https://github.com/paviliondev/discourse-custom-wizard into ui_conventions 2021-09-01 12:38:09 -07:00
angusmcleod
d5f8c46f2c COMPATIBILITY: Add new textarea-text-manipulation mixin 2021-09-01 19:49:44 +08:00
KC Maddever
e34f2b5076 Merge branch 'pro-release' into split_log_messages 2021-09-01 16:51:28 +08:00
angusmcleod
403f063b0f Fix failing specs 2021-09-01 11:10:49 +08:00
angusmcleod
0e5fc756df Fix merge issues 2021-09-01 10:46:52 +08:00
angusmcleod
001d116298 Merge branch 'master' into pro-release 2021-09-01 10:37:50 +08:00
angusmcleod
6b1e7568c1 Improve PRO feature approach 2021-09-01 10:19:00 +08:00
Keegan George
280d2ffe54 IMPROVE: Make edit columns adjust submissions as well 2021-08-31 13:29:30 -07:00
KC Maddever
399cc9c220 DEV: rubocop 2021-08-31 14:43:21 +08:00
KC Maddever
c394656ed8 DEV: update tests for split log fields 2021-08-31 14:34:47 +08:00
KC Maddever
35ff172967 DEV: specify which fields to split in log data migration 2021-08-31 14:33:16 +08:00
KC Maddever
b79039c2e2 DEV: save logs with split fields 2021-08-31 14:33:16 +08:00
KC Maddever
aa928c319e DEV: add data migration to split out log fields 2021-08-31 14:33:16 +08:00
angusmcleod
8eced70f60 COMPATIBILITY: Add new composer-upload mixin 2021-08-31 11:25:06 +08:00
Keegan George
0bc151fc7b WIP: Edit Columns modal functionality
Currently modal and edit columns works but removes only field and not corresponding submission.
2021-08-30 16:33:48 -07:00
Keegan George
d74d3d25be UX: Display submission fields unique to each type 2021-08-30 16:23:33 -07:00
Keegan George
466229af0b Merge branch 'ui_conventions' of https://github.com/paviliondev/discourse-custom-wizard into ui_conventions 2021-08-30 11:58:19 -07:00
angusmcleod
03fb7b7ada WIP: update field data handling to support column toggling 2021-08-25 09:59:24 +08:00
Angus McLeod
e865516f48
Merge pull request #138 from paviliondev/maybe_later_bug
FIX: clear submission if skipped by user
2021-08-23 14:12:48 +08:00
Faizaan Gagan
0b20c6ff81 removed redundant method 2021-08-23 10:38:02 +05:30
Faizaan Gagan
1916335fa9 FIX: use class method as alias for instance method 2021-08-23 03:00:14 +05:30
angusmcleod
a810155f91 Clean up pro constants 2021-08-18 14:59:43 +08:00
angusmcleod
eadc40bdae Add CustomWizard class protections and pro feature restrictions 2021-08-18 14:11:00 +08:00
angusmcleod
eff1d2c7d2 Merge branch 'master' into pro-features 2021-08-17 19:35:10 +08:00
Faizaan Gagan
e260241dea group specs related to skip functionality in a context 2021-08-13 18:58:41 +05:30
Faizaan Gagan
3c70b712bf remove redundant reset method 2021-08-13 18:57:20 +05:30
Faizaan Gagan
4578cb0a24 use existing method to reset user's progress 2021-08-13 18:56:38 +05:30
Faizaan Gagan
61c92ec768 FIX: reset user's progress on wizard skip 2021-08-13 17:49:31 +05:30
Faizaan Gagan
bfa190e98b Revert "FIX: reset step progress on wizard skip"
This reverts commit 0d2f3d1cb5.
2021-08-13 02:55:25 +05:30
Faizaan Gagan
0d2f3d1cb5 FIX: reset step progress on wizard skip 2021-08-12 20:02:04 +05:30
Faizaan Gagan
249cda4de6 Merge branch 'master' into maybe_later_bug 2021-08-12 19:57:38 +05:30
Faizaan Gagan
973cffee26
FIX: disable string caching in Oj gem while running specs (#139) 2021-08-12 19:56:17 +05:30
Faizaan Gagan
89f733ae32 added spec to verify functionality 2021-08-12 17:11:58 +05:30
angusmcleod
e81b773512 Move pro conditions out of advanced section 2021-08-10 17:18:49 +08:00
Faizaan Gagan
dee3691cd0 fix formatting 2021-08-10 14:35:56 +05:30
Faizaan Gagan
c1fc2fd0e4 FIX: clear submission if skipped by user 2021-08-10 14:31:59 +05:30
angusmcleod
f49f516403 Add pro restriction 2021-08-10 17:00:42 +08:00
angusmcleod
a7904a28af Update pro admin title attributes 2021-08-10 15:32:21 +08:00
angusmcleod
a27c222dc6 Update authentication and subscription handling 2021-08-10 14:45:23 +08:00
Keegan George
ae271ce647
UX: Add support button to admin-nav (#118)
* Add support button to admin-nav

* FIX: Security vulnerabilities with _blank anchor link

* Update pro support url

* UX: Create pro button custom styling

* UX: Merge support button focus styling with hover

* DEV: Move pro support url to setting

* UX: Change support button name to Pro Support

* DEV: Format stylesheet code

* DEV: Use variables and change selector specificity for pro button

* DEV: Hardcode pro-support url in button

* DEV: Remove support url localization

* DEV: Undo formatting fixes and add pro support button strings

* DEV: Undo formatting fixes auto applied

* DEV: Add space between selectors

* DEV: Convert scss variables to CSS Custom properties

* DEV: Fix linting

* FIX: Use SCSS variables for color manipulation functions

* DEV: Fix space before i18n

* DEV: Add new line at end of file

* DEV: Add new line at end of file

* DEV: Remove name attribute in localizations

* DEV: Remove padding from new line
2021-08-09 14:44:44 -07:00
Faizaan Gagan
f00d01c50f
FIX: ensure single incomplete submission existence (#136)
* created method to fetch incomplete submissions

* added new field 'updated_at' to submission schema

* Revert "created method to fetch incomplete submissions"

This reverts commit 15c65236e7.

* added logic to cleanup redundant incomplete submissions

* logic improvements and spec

* simplified the cleanup logic

* simplified the logic further

* early return to improve performance

* consolidated cleanup logic

* perform cleanup in wizard.update

* fixed issue

* minor fix

* use consistent naming
2021-08-02 13:01:49 +05:30
Faizaan Gagan
998757f857
FIX: apply text length validations for non-empty fields only (#137)
* apply text length validations for non-empty fields only

* consolidated logic

* fixed formatting

* fix formatting

* calculate length only for string type values

* fix assignment

* added specs
2021-07-30 16:03:48 +05:30
Faizaan Gagan
ee9e9a1d94 FIX: skip_guardian option is removed from discourse core 2021-07-28 19:01:09 +05:30
Keegan George
51038ade8a FIX: Update help text in wizard message bar 2021-07-26 10:44:08 -07:00
angusmcleod
55b92f4256 IMPROVE: Add additional data to submission serialiser 2021-07-21 11:31:03 +08:00
Angus McLeod
911a47db28
IMPROVE: Remove sortable and add manual step and field sorting (#135)
* IMPROVE: Remove sortable and add manual step and field sorting

* Apply eslint

* Apply prettier
2021-07-20 13:02:18 +05:30
Keegan George
543b676f53 Merge branch 'pro-release' of https://github.com/paviliondev/discourse-custom-wizard into ui_conventions 2021-07-19 09:30:48 -07:00
Keegan George
5f5adf93e4
Merge pull request #134 from paviliondev/admin-ui-support
IMPROVE: Admin UI support
2021-07-19 09:18:28 -07:00
Keegan George
bdc4044581 Merge branch 'pro-release' of https://github.com/paviliondev/discourse-custom-wizard into ui_conventions 2021-07-19 07:11:47 -07:00
Faizaan Gagan
247f7ca466 IMPROVE: reduce field placeholder setting textarea width 2021-07-14 13:32:19 +05:30
angusmcleod
1a78b44d35 Apply rubocop 2021-07-14 14:06:54 +08:00
angusmcleod
56a1463413 Apply prettier 2021-07-14 14:05:13 +08:00
angusmcleod
34fee3729c Add pagination to submissions 2021-07-14 14:04:19 +08:00
angusmcleod
7375c63403 Version bump 2021-07-13 12:03:11 +08:00
Angus McLeod
5aef8972ff
Merge pull request #125 from paviliondev/submission_improvements
Abstract and improve submission handling
2021-07-12 22:43:13 +08:00
Faizaan Gagan
ca10ae797a
FEATURE: new field type Composer Preview (#130)
* WIP

* composer preview field working

* remove redundant variable

* fix linting issues

* fix rubocop

* remove unnecessary entry

* consolidate preview generation code

* add styles for onebox

* add css for @ mentions

* fixed eslint issues

* FIX: ensure oneboxes load every time

* remove unused import

* fix prettier issues

* removed unused code

* remove unused imports

* fixed prettier issue

* improve css structure

* add csrf header in all cases
2021-07-12 17:05:05 +05:30
angusmcleod
d602281a6a Fix failing test 2021-07-12 16:39:37 +08:00
angusmcleod
dfd382cd8a Apply prettier 2021-07-12 16:01:52 +08:00
angusmcleod
56f58414b3 Remove meta keys from fields attribute and update submissions ui to handle new submission structure 2021-07-12 15:53:58 +08:00
angusmcleod
20c8ec1202 Merge branch 'master' into pr/125 2021-07-12 14:05:02 +08:00
Faizaan Gagan
d88d2b7d97
converted placeholder input to a textarea (#133) 2021-07-10 11:33:00 +05:30
Faizaan Gagan
e4df646022
FIX: clear site model cache to prevent spec failure (#132) 2021-07-08 13:04:03 +05:30
Faizaan Gagan
c9f90fb8ce FIX: text length validation bug 2021-07-07 11:50:56 +05:30
Angus McLeod
9293aaeabc
Merge pull request #131 from paviliondev/text-placeholder
FEATURE: placeholder setting for text type fields
2021-07-05 16:44:09 +10:00
Faizaan Gagan
d47950733d enabled interpolation and templating 2021-07-05 11:52:29 +05:30
Faizaan Gagan
21ac87cdda FEATURE: placeholder setting for text type fields 2021-07-03 15:41:49 +05:30
Faizaan Gagan
c2e51cba3a FIX: hide placeholder on field focus 2021-07-03 13:23:33 +05:30
Faizaan Gagan
e235a66b01 FIX: avoid translating pre-translated placeholder 2021-07-03 13:06:06 +05:30
Faizaan Gagan
d8f6f00e60
FIX: add csrf token to all wizard ajax requests in dev (#129)
* FIX: add csrf token to all wizard ajax requests in dev

* fix formatting

* simplified code

* Update field.rb
2021-07-01 11:25:31 +05:30
Faizaan Gagan
dc19b508ab Merge branch 'master' into submission_improvements 2021-06-29 16:19:23 +05:30
Penar Musaraj
0bd4dbd08b
DEV: Switch to CSS custom properties for colors (#127) 2021-06-29 13:19:28 +05:30
Faizaan Gagan
6d1958d772 Merge branch 'master' into submission_improvements 2021-06-28 13:54:03 +05:30
Angus McLeod
262f2d5628
Merge pull request #128 from paviliondev/fix-theme-lookup
DEV: fix compatibility with core theme architecture changes
2021-06-28 17:18:27 +10:00
Angus McLeod
8a9f3e1a3d
Merge pull request #114 from paviliondev/sprockets-fix
DEV: add new sprockets directive to require discourse folders
2021-06-28 12:17:47 +10:00
Faizaan Gagan
13faa849d8 minor formatting 2021-06-27 17:02:19 +05:30
Faizaan Gagan
9ec2da5a9f DEV: fix compatibility with core theme arch changes 2021-06-27 16:58:26 +05:30
Faizaan Gagan
be86c77a77
IMPROVE: cron schedule and use step output (#126)
* use step output for populating repo name

* schedule cron every 12 hours
2021-06-26 19:07:08 +05:30
Faizaan Gagan
28400ee24e Merge branch 'master' into sprockets-fix 2021-06-26 13:30:37 +05:30
Angus McLeod
f80f40d6b3
Apply consistent date validation on the server (using v8) (#124)
* Apply consistent date validation on the server (using v8)

* Variable fix

* added specs to verify date/time field validation

* minor text change

Co-authored-by: Faizaan Gagan <fzngagan@gmail.com>
2021-06-26 13:15:33 +05:30
Angus McLeod
7bfa0aff70
Apply format to new picker in wizard-date-input (#123) 2021-06-26 13:15:19 +05:30
angusmcleod
5a6856fcff COMPATIBILITY: categories are being loaded differently on Site model
See 0e4b8c5318
2021-06-25 11:45:22 +10:00
angusmcleod
3d9f6aac98 Ensure data is not nil 2021-06-23 17:02:21 +10:00
angusmcleod
39ee61b422 Update coverage 2021-06-23 16:17:18 +10:00
angusmcleod
098e8418fb Apply rubocop 2021-06-23 16:15:17 +10:00
angusmcleod
e441588aa3 Fix specs and tighten conditional handling 2021-06-23 16:13:58 +10:00
Keegan George
d8a24eb940 Merge https://github.com/paviliondev/discourse-custom-wizard into ui_conventions 2021-06-18 12:04:17 -07:00
Keegan George
dd8513a563 UX: Add wizard-message component to logs pane 2021-06-18 11:47:24 -07:00
Keegan George
582b9d82aa FIX: Missing refresh button icon in logs pane 2021-06-18 11:36:18 -07:00
Keegan George
10c7c8bcc0 UX: Change info message when selecting a wizard in the submissions pane 2021-06-18 11:25:51 -07:00
Keegan George
c490da3145 UX: Add wizard message component to submissions page 2021-06-18 10:25:01 -07:00
angusmcleod
d3c6733e59 Abstract and improve submission handling 2021-06-17 17:50:22 +10:00
Faizaan Gagan
7b9a54590b Merge branch 'master' into sprockets-fix 2021-06-16 14:28:55 +05:30
Angus McLeod
cc0b5fcf9f
Merge pull request #122 from paviliondev/final_step_single_submission_issue
Force second step build to overcome can_access? check
2021-06-16 16:42:35 +10:00
angusmcleod
dc7e43b6d7 Force second step build to overcome can_access? check
The can_access? check will fail if the wizard does not allow multiple submissions. This means that on the second build of the wizard on the final step of a single submission wizard, the wizard instance will have no steps, and an error will be thrown when logic assumes it does.
2021-06-16 16:21:24 +10:00
Angus McLeod
85bb23e70f
Merge pull request #120 from paviliondev/fix-paste-event
Ensure our custom paste logic is running
2021-06-16 15:01:31 +10:00
Angus McLeod
b2ed2c1dc7
Merge pull request #121 from paviliondev/cant_access_skip_bugfix
Cant access skip bugfix
2021-06-16 14:41:49 +10:00
angusmcleod
46bb28bb07 Fix linting 2021-06-16 14:26:28 +10:00
angusmcleod
33df6f9fbc Add test for skip when cant access 2021-06-16 14:24:07 +10:00
angusmcleod
9452907f0a Don't attempt to save submissions if the user can't access the wizard 2021-06-16 14:13:12 +10:00
angusmcleod
f742626786 Ensure our custom paste logic is running 2021-06-16 13:55:10 +10:00
Angus McLeod
58b3bc13c9
FIX: Ensure user_email and user_option attributes are handled properly (#119) 2021-06-15 11:48:17 +05:30
Angus McLeod
af3e61fe75
Add custom field improvements (#115)
* Add custom field improvements

This PR does a few things to improve our support of custom fields
1. Adds custom fields added by other plugins to the list in admin/wizards/custom-fields and the custom field list in the mapper selector
2. Adds support for json custom fields in the wizard actions

* Make eslint happy

* Make prettier happy

* Make rubocop happy

* Make ember template lint happy

* Don't assume we have the context in the selector

* Ensure custom fields don't require optional attributes (with tests)
2021-06-08 17:09:49 +05:30
Angus McLeod
f1f13065c8
Merge pull request #117 from paviliondev/ci-impr
FIX: populate repository name from global object and enable cron
2021-06-08 21:29:50 +10:00
Faizaan Gagan
48fbb61dcc FIX: populate repository name from global object 2021-06-08 16:10:00 +05:30
Angus McLeod
522d4e9489
IMPROVE: ensure redirect_to_wizard is cleaned up even if sidekiq is not working (#116)
* Add test of redirect_to_wizard when wizard is removed

* Make clear_user_wizard_redirect a synchronous operation
2021-06-07 18:45:41 +05:30
Angus McLeod
31a27cbb00
Merge pull request #113 from paviliondev/fix-locales
FIX: changed wizard id resolution logic
2021-05-31 08:45:09 +12:00
Faizaan Gagan
61ff018244 added spec 2021-05-30 18:30:51 +05:30
Faizaan Gagan
db72617b61 FIX: changed wizard id resolution logic 2021-05-18 16:10:43 +05:30
Faizaan Gagan
04f008575f
combine rspec run with coverage report (#101) 2021-05-17 14:00:23 +05:30
angusmcleod
c574ad7c32 Update package.json 2021-05-17 19:57:13 +12:00
angusmcleod
0c4eb02038 Exclude gems from simplecov 2021-05-17 19:57:09 +12:00
Angus McLeod
6cb5d62a7a
Merge pull request #109 from paviliondev/conditional-submission
FIX: filter conditionally excluded fields from wizard submission
2021-05-14 08:44:48 +12:00
Faizaan Gagan
ff14570d64 FIX: exclude conditional fields while saving step submission 2021-05-12 18:15:55 +05:30
Faizaan Gagan
a1e8070062 FIX: move sprockets customization to monkeypatch 2021-05-12 06:33:19 +05:30
Faizaan Gagan
eb5e2fe604 move sprockets logic outside after_initialize 2021-05-12 06:17:01 +05:30
Faizaan Gagan
a4adeecf5f Revert "Revert "DEV: add new sprockets directive to require discourse folders" (#111)"
This reverts commit ca125a2a8a.
2021-05-12 06:14:09 +05:30
Faizaan Gagan
8c61b9b1f3 Merge branch 'master' into conditional-submission 2021-05-12 03:11:40 +05:30
Faizaan Gagan
ca125a2a8a
Revert "DEV: add new sprockets directive to require discourse folders" (#111) 2021-05-12 02:58:12 +05:30
Angus McLeod
edbba891f6
Merge pull request #86 from paviliondev/sprockets-fix
DEV: add new sprockets directive to require discourse folders
2021-05-10 19:07:32 +12:00
Angus McLeod
580cc55445
Merge pull request #108 from paviliondev/upload-prettytext
FIX: set correct options while initializing PrettyText
2021-05-10 19:05:49 +12:00
Faizaan Gagan
4cacd84967 code formatting 2021-05-08 23:38:26 +05:30
Faizaan Gagan
3a3d23a317 added missing file 2021-05-08 23:18:58 +05:30
Faizaan Gagan
5f24882ef6 DEV: raise plugin specific errors on failure 2021-05-08 23:15:06 +05:30
Faizaan Gagan
c254a0c6b8 convert key to string 2021-05-07 04:02:56 +05:30
Faizaan Gagan
56268823c5 confine exclusion to wizard fields 2021-05-07 03:28:16 +05:30
Faizaan Gagan
957a32cf5a FIX: filter conditionally excluded fields from wizard submission 2021-05-05 13:13:03 +05:30
Faizaan Gagan
743af8edc5
FIX: breakage due to core changes (#107) 2021-05-05 11:35:53 +05:30
Faizaan Gagan
40c0c12719 FIX: set correct options while initializing PrettyText 2021-05-05 02:36:01 +05:30
Angus McLeod
aca0fab74e
Merge pull request #103 from paviliondev/checkbox-def
DEV: checkbox value should default to false
2021-05-03 17:55:33 +12:00
Faizaan Gagan
cdb9ec6c3e remove the directory after spec run 2021-05-03 04:19:27 +05:30
Faizaan Gagan
77dd879f80 minor formatting 2021-05-03 03:43:47 +05:30
Faizaan Gagan
13eabe0695 added specs 2021-05-03 03:42:26 +05:30
Faizaan Gagan
4a4c1934a0 revert client side change 2021-04-30 23:02:13 +05:30
Faizaan Gagan
887de25833 FIX: set checkbox field default value as false 2021-04-30 22:59:06 +05:30
Faizaan Gagan
848874ea1f
FIX: clicking Maybe Later was causing 500 error (#105) 2021-04-30 21:56:00 +05:30
Faizaan Gagan
c463e8b541 fix formatting 2021-04-29 12:18:09 +05:30
Faizaan Gagan
8aafb257fd DEV: checkbox value should default to false 2021-04-29 11:02:51 +05:30
Faizaan Gagan
f05d859007
Enable templating (#102)
* enabled templating for create topic action

* enabled templating for step and field descriptions

* FIX: don't run pretty text on step description

* FIX: step description should be cooked post template parsing
2021-04-23 17:21:41 +05:30
Angus McLeod
7d38337c84
Merge pull request #100 from paviliondev/step-conditionality-multiple
FIX: allow setting multiple conditions for entering a step
2021-04-23 17:08:55 +10:00
Faizaan Gagan
eb93169f86 use option multiple and aggregate the result 2021-04-23 12:22:04 +05:30
Faizaan Gagan
be1eab6092 minor formatting 2021-04-22 23:52:38 +05:30
Faizaan Gagan
2a8a4367d8 added specs 2021-04-22 23:50:54 +05:30
Faizaan Gagan
911140fde3 improved the logic to accomodate multiple conditions using 'or' 2021-04-22 23:50:26 +05:30
Faizaan Gagan
fb8cdab0fd merged master 2021-04-21 03:32:31 +05:30
Angus McLeod
ceef3f4bc9
Step and field conditionality (#87)
* Re structure builder logic to allow for step conditionality

Concerns
- Performance. Look at whether the additional build in the steps controller can be reduced
- Does not work if applied to the last step.
- Certain conditions will not work with the first step(?)
- How should this be scoped to known functionality?

* Add indexes and conditions to steps and fields

* Complete and add spec

* Complete backend

* Complete step conditionality and field indexing

* Fix failing spec

* Update coverage

* Apply rubocop

* Apply prettier

* Apply prettier to wizard js

* Fix schema issues created in merge

* Remove setting label for force_final

* Improve client wizard cache naming

* Improve steps controller and spec conditionality

* Improve final step attribute naming

* Fix failing spec

* Linting

* Add one more final step test

* Linting

* Fix eslint issues

* Apply prettier

* Linting, syntax, merge and copy cleanups

* Update wizard-admin.scss

* Fix template linting

* Rubocop fixes
2021-04-20 23:28:19 +05:30
Angus McLeod
ec21c8e274
Merge pull request #98 from paviliondev/pm-multiple-targets
FEATURE: allow targetting multiple users/groups when sending a privat…
2021-04-19 17:41:50 +10:00
Faizaan Gagan
9ded3602eb Merge branch 'master' into pm-multiple-targets 2021-04-19 11:04:47 +05:30
Faizaan Gagan
772392efae
FIX: checkbox description alignment (#99) 2021-04-18 17:27:16 +05:30
Faizaan Gagan
b71548427d
Added files used by github actions workflows (#78)
* Added files used by github actions workflows

* added simplecov report for tests workflow

* removed trailing space

* Rubocop fixes

* Update plugin-linting.yml

* Create Gemfile.lock

* Update Gemfile.lock

* Re-add bundler

* Update gitignore

* Limit yarn install to dev

* Update rubocop config and gemfile.lock

* allow strings to be mutated

* Update invites_controller_spec.rb

Co-authored-by: angusmcleod <angus@mcleod.org.au>
2021-04-16 13:37:32 +05:30
Angus McLeod
d7542d58c7
Merge pull request #96 from paviliondev/hbs-lint
fixed linting for all the hbs files
2021-04-16 16:01:23 +10:00
Faizaan Gagan
ce222c0c04 modified spec to confirm working for multiple users and groups 2021-04-15 02:15:20 +05:30
Faizaan Gagan
bb08f50042 fixed wrongly introduced variable name changes 2021-04-14 09:09:41 +05:30
Faizaan Gagan
f443840358 FEATURE: allow targetting multiple users/groups when sending a private message 2021-04-14 08:59:12 +05:30
Faizaan Gagan
a76cda0c02 fixed linting for all the hbs files 2021-04-12 19:49:53 +05:30
Faizaan Gagan
2788e8026e
ran prettier on stylesheets and global wizard javascripts (#95) 2021-04-12 12:05:15 +05:30
Faizaan Gagan
0205d8ccb5
fixed linting issues for javascripts/wizard folder (#94)
* ran eslint and fixes linting issues for javascripts/wizard folder

* ran prettier
2021-04-12 11:56:22 +05:30
angusmcleod
54c00f1784 Apply prettier to recent changes 2021-04-12 16:12:20 +10:00
Angus McLeod
c02ae44a82
Merge pull request #93 from paviliondev/es-lint
Apply es-lint to javascripts/discourse
2021-04-12 15:58:07 +10:00
angusmcleod
8171fc730c Apply es-lint to javascripts/discourse 2021-04-12 15:44:47 +10:00
angusmcleod
9c17957b43 Apply to javascripts/discourse 2021-04-12 15:10:02 +10:00
Angus McLeod
cb930a27bb
Merge pull request #92 from paviliondev/jquery-timepicker-2
Remove jquery timepicker from wizard client
2021-04-12 15:05:22 +10:00
angusmcleod
0a23172fa9 Remove jquery timepicker from wizard client 2021-04-12 15:05:04 +10:00
Angus McLeod
f26176b7ab
Merge pull request #91 from paviliondev/move_vendor_assets
Remove jquery timepicker
2021-04-12 14:57:23 +10:00
angusmcleod
88a0846842 Remove jquery timepicker 2021-04-12 14:56:48 +10:00
Faizaan Gagan
9289439cbd
added gems folder to gitignore (#90) 2021-04-12 10:19:37 +05:30
Faizaan Gagan
105fc46774
FEATURE: added liquid based templating (#83)
* FEATURE: added liquid based templating

* templating should be false by default

* added rspec tests for mapper templating

* wrapped templating tests in a context block

* added a custom liquid filter and tests

* ran rubocop on changed files

* DEV: minor variable and naming changes

* minor code formatting

* improved overall structure and tightened spec for custom filter

* added a spec template: false

* define method at the top of spec file

* naming convention

* removed extra space
2021-04-09 11:04:42 +05:30
Faizaan Gagan
dadac11c1e
FIX: use wizard-i18n helper to support theme translation overrides (#88) 2021-04-07 10:49:48 +05:30
Faizaan Gagan
1bc55c6099 code formatting 2021-04-05 22:04:17 +05:30
Faizaan Gagan
ae918976a3 DEV: add sprockets directive to require discourse folders 2021-04-05 21:53:34 +05:30
Faizaan Gagan
2fe3aa53b1
disable autocomplete when similar-topics validation is enabled (#85) 2021-04-02 19:21:33 +05:30
Faizaan Gagan
369ceb8584 FIX: set similarTopics to null when searching 2021-03-31 11:54:29 +05:30
Angus McLeod
d3e34a5be2
Merge pull request #84 from paviliondev/fix-theme-i18n
FIX: explicitly lookup for translation overrides in wizard theme
2021-03-30 22:03:16 +11:00
Faizaan Gagan
e79458f6ce FIX: explicitly lookup for translation overrides in wizard theme 2021-03-30 13:04:52 +05:30
Angus McLeod
cf50a7deb3
Apply prettier 💄 (#80)
* Apply prettier

* applied prettier for similar-topics-validator

Co-authored-by: Faizaan Gagan <fzngagan@gmail.com>
2021-03-28 14:36:49 +05:30
Faizaan Gagan
94a02157af
FIX: hide similar topics if the field becomes empty (#82) 2021-03-25 16:31:26 +05:30
Angus McLeod
87675c1bfa
Merge pull request #81 from paviliondev/similar-topics-impr
IMPR: added a state for insufficient characters
2021-03-25 19:11:55 +11:00
Faizaan Gagan
9d0a061099 removed unused computed property 2021-03-25 11:38:53 +05:30
Faizaan Gagan
873b30ac65 improved code structure 2021-03-25 11:33:12 +05:30
Faizaan Gagan
ee613d74c8 minor fix 2021-03-25 11:30:57 +05:30
Faizaan Gagan
c62f1ac96f IMPR: added a state for insufficient characters 2021-03-25 11:18:33 +05:30
Faizaan Gagan
04b2b87ea2
FIX: lookup for assets in the wizard specified theme (#79) 2021-03-19 01:14:57 +05:30
621 geänderte Dateien mit 70873 neuen und 9746 gelöschten Zeilen

Datei anzeigen

@ -1 +1,3 @@
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c 3.1.999: 1f35b80f85e5fd1efb7f4851f0845700432febdc
2.7.99: e07a57e398b6b1676ab42a7e34467556fca5416b
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c

3
.eslintrc Normale Datei
Datei anzeigen

@ -0,0 +1,3 @@
{
"extends": "eslint-config-discourse"
}

13
.github/workflows/discourse-plugin.yml gevendort Normale Datei
Datei anzeigen

@ -0,0 +1,13 @@
name: Discourse Plugin
on:
push:
branches:
- main
pull_request:
schedule:
- cron: "0 0 * * *"
jobs:
ci:
uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1

44
.github/workflows/plugin-metadata.yml gevendort Normale Datei
Datei anzeigen

@ -0,0 +1,44 @@
name: Metadata
on:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout head repository
uses: actions/checkout@v2
- name: Store head version
run: |
sed -n -e 's/^.*version: /head_version=/p' plugin.rb >> $GITHUB_ENV
- name: Checkout base repository
uses: actions/checkout@v2
with:
ref: "${{ github.base_ref }}"
- name: Store base version
run: |
sed -n -e 's/^.*version: /base_version=/p' plugin.rb >> $GITHUB_ENV
- name: Setup node
uses: actions/setup-node@v2
with:
node-version: 14
- name: Install semver
run: npm install --include=dev
- name: Check version
uses: actions/github-script@v5
with:
script: |
const semver = require('semver');
const { head_version, base_version } = process.env;
if (semver.lte(head_version, base_version)) {
core.setFailed("Head version is equal to or lower than base version.");
}

8
.gitignore gevendort
Datei anzeigen

@ -1,2 +1,8 @@
coverage/* coverage/*
!coverage/.last_run.json !coverage/.last_run.json
gems/*
.bundle/
auto_generated
.DS_Store
node_modules/
vendor/*

1
.prettierrc Normale Datei
Datei anzeigen

@ -0,0 +1 @@
{}

8
.rubocop.yml Normale Datei
Datei anzeigen

@ -0,0 +1,8 @@
inherit_gem:
rubocop-discourse: default.yml
RSpec/ContextWording:
Enabled: false
RSpec/DescribeClass:
Enabled: false

7
.simplecov Normale Datei
Datei anzeigen

@ -0,0 +1,7 @@
# frozen_string_literal: true
plugin = "discourse-custom-wizard"
SimpleCov.configure do
track_files "plugins/#{plugin}/**/*.rb"
add_filter { |src| !(src.filename =~ /(\/#{plugin}\/app\/|\/#{plugin}\/lib\/)/) }
end

4
.template-lintrc.js Normale Datei
Datei anzeigen

@ -0,0 +1,4 @@
module.exports = {
plugins: ["ember-template-lint-plugin-discourse"],
extends: "discourse:recommended",
};

Datei anzeigen

@ -1,4 +1,4 @@
All code in this repository is Copyright 2018 by Angus McLeod. All code in this repository is Copyright 2023 by Angus McLeod.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

7
Gemfile Normale Datei
Datei anzeigen

@ -0,0 +1,7 @@
# frozen_string_literal: true
source 'https://rubygems.org'
group :development do
gem 'rubocop-discourse'
end

39
Gemfile.lock Normale Datei
Datei anzeigen

@ -0,0 +1,39 @@
GEM
remote: https://rubygems.org/
specs:
ast (2.4.2)
json (2.6.2)
parallel (1.22.1)
parser (3.1.2.1)
ast (~> 2.4.1)
rainbow (3.1.1)
regexp_parser (2.6.0)
rexml (3.2.5)
rubocop (1.36.0)
json (~> 2.3)
parallel (~> 1.10)
parser (>= 3.1.2.1)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.20.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.22.0)
parser (>= 3.1.1.0)
rubocop-discourse (3.0)
rubocop (>= 1.1.0)
rubocop-rspec (>= 2.0.0)
rubocop-rspec (2.13.2)
rubocop (~> 1.33)
ruby-progressbar (1.11.0)
unicode-display_width (2.3.0)
PLATFORMS
ruby
DEPENDENCIES
rubocop-discourse
BUNDLED WITH
2.2.16

Datei anzeigen

@ -1,3 +1,27 @@
# discourse-custom-wizard # Discourse Custom Wizard Plugin
See further: https://thepavilion.io/c/knowledge/discourse/custom-wizard/118 The Custom Wizard Plugin lets you make forms for your Discourse forum. Better user onboarding, structured posting, data enrichment, automated actions and much more for your community.
<img src="https://camo.githubusercontent.com/593432f1fc9658ffca104065668cc88fa21dffcd3002cb78ffd50c71f33a2523/68747470733a2f2f706176696c696f6e2d6173736574732e6e7963332e63646e2e6469676974616c6f6365616e7370616365732e636f6d2f706c7567696e732f77697a6172642d7265706f7369746f72792d62616e6e65722e706e67" alt="" data-canonical-src="https://pavilion-assets.nyc3.cdn.digitaloceanspaces.com/plugins/wizard-repository-banner.png" style="max-width: 100%;" width="400">
👋 Looking to report an issue? We're managing issues for this plugin using our [bug report wizard](https://coop.pavilion.tech/w/bug-report).
## Install
If you're not sure how to install a plugin in Discourse, please follow the [plugin installation guide](https://meta.discourse.org/t/install-a-plugin/19157) or contact your Discourse hosting provider.
## Documentation
[Read the full documentation here](https://coop.pavilion.tech/c/82), or go directly to the relevant section
- [Wizard Administration](https://coop.pavilion.tech/t/1602)
- [Wizard Settings](https://coop.pavilion.tech/t/1614)
- [Step Settings](https://coop.pavilion.tech/t/1735)
- [Field Settings](https://coop.pavilion.tech/t/1580)
- [Conditional Settings](https://coop.pavilion.tech/t/1673)
- [Field Interpolation](https://coop.pavilion.tech/t/1557)
- [Handling Dates and Times](https://coop.pavilion.tech/t/1708)
## Support
- [Report an issue](https://coop.pavilion.tech/w/bug-report)

7
SECURITY.md Normale Datei
Datei anzeigen

@ -0,0 +1,7 @@
# Security Policy
The security of Discourse plugins are premised on the security of [Discourse](https://github.com/discourse/discourse). Please first consider whether a security issue is best reported and handled by the Discourse team. You can view the Discourse security policy [here](https://github.com/discourse/discourse/security/policy).
## Reporting a Vulnerability
If you find a security vulnerability that is specific to this plugin, please report it to development@pavilion.tech. Security issues always take precedence over all other work. All commits specific to security are prefixed with SECURITY.

Datei anzeigen

@ -3,6 +3,13 @@ class CustomWizard::AdminController < ::Admin::AdminController
before_action :ensure_admin before_action :ensure_admin
def index def index
subcription = CustomWizard::Subscription.new
render_json_dump(
subscribed: subcription.subscribed?,
subscription_type: subcription.type,
subscription_attributes: CustomWizard::Subscription.attributes,
subscription_client_installed: CustomWizard::Subscription.client_installed?
)
end end
private private
@ -14,7 +21,7 @@ class CustomWizard::AdminController < ::Admin::AdminController
end end
def custom_field_list def custom_field_list
serialize_data(CustomWizard::CustomField.list, CustomWizard::CustomFieldSerializer) serialize_data(CustomWizard::CustomField.full_list, CustomWizard::CustomFieldSerializer)
end end
def render_error(message) def render_error(message)

Datei anzeigen

@ -20,6 +20,10 @@ class CustomWizard::AdminApiController < CustomWizard::AdminController
raise Discourse::InvalidParameters, "An API with that name already exists: '#{current.title || current.name}'" raise Discourse::InvalidParameters, "An API with that name already exists: '#{current.title || current.name}'"
end end
unless subscription.includes?(:api, :all)
raise Discourse::InvalidParameters, "Your subscription doesn't include API features."
end
PluginStoreRow.transaction do PluginStoreRow.transaction do
CustomWizard::Api.set(api_params[:name], title: api_params[:title]) CustomWizard::Api.set(api_params[:name], title: api_params[:title])
@ -130,4 +134,8 @@ class CustomWizard::AdminApiController < CustomWizard::AdminController
@auth_data ||= auth_data @auth_data ||= auth_data
end end
def subscription
@subscription ||= CustomWizard::Subscription.new
end
end end

Datei anzeigen

@ -1,7 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController
def index def index
render_json_dump(custom_field_list) render_json_dump(
custom_fields: custom_field_list
)
end end
def update def update

Datei anzeigen

@ -0,0 +1,44 @@
# frozen_string_literal: true
class CustomWizard::AdminLogsController < CustomWizard::AdminController
before_action :find_wizard, except: [:index]
def index
render json: ActiveModel::ArraySerializer.new(
CustomWizard::Wizard.list(current_user),
each_serializer: CustomWizard::BasicWizardSerializer
)
end
def show
render_json_dump(
wizard: CustomWizard::BasicWizardSerializer.new(@wizard, root: false),
logs: ActiveModel::ArraySerializer.new(
log_list.logs,
each_serializer: CustomWizard::LogSerializer
),
total: log_list.total
)
end
protected
def log_list
@log_list ||= begin
list = CustomWizard::Log.list(params[:page].to_i, params[:limit].to_i, params[:wizard_id])
if list.logs.any? && (usernames = list.logs.map(&:username)).present?
user_map = User.where(username: usernames)
.reduce({}) do |result, user|
result[user.username] = user
result
end
list.logs.each do |log_item|
log_item.user = user_map[log_item.username]
end
end
list
end
end
end

Datei anzeigen

@ -41,27 +41,28 @@ class CustomWizard::AdminManagerController < CustomWizard::AdminController
end end
begin begin
template_json = JSON.parse file template_json = JSON.parse(file)
rescue JSON::ParserError rescue JSON::ParserError
return render_error(I18n.t('wizard.import.error.invalid_json')) return render_error(I18n.t('wizard.import.error.invalid_json'))
end end
imported = [] imported = []
failures = [] failures = []
templates = template_json.is_a?(Array) ? template_json : [template_json]
template_json.each do |json| templates.each do |raw_template|
template = CustomWizard::Template.new(json) template = CustomWizard::Template.new(raw_template)
template.save(skip_jobs: true, create: true) template.save(skip_jobs: true, create: true)
if template.errors.any? if template.errors.any?
failures.push( failures.push(
id: json['id'], id: template.data['id'],
messages: template.errors.full_messages.join(', ') messages: template.errors.full_messages.join(', ')
) )
else else
imported.push( imported.push(
id: json['id'], id: template.data['id'],
name: json['name'] name: template.data['name']
) )
end end
end end

Datei anzeigen

@ -13,34 +13,29 @@ class CustomWizard::AdminSubmissionsController < CustomWizard::AdminController
def show def show
render_json_dump( render_json_dump(
wizard: CustomWizard::BasicWizardSerializer.new(@wizard, root: false), wizard: CustomWizard::BasicWizardSerializer.new(@wizard, root: false),
submissions: build_submissions.as_json submissions: ActiveModel::ArraySerializer.new(
submission_list.submissions,
each_serializer: CustomWizard::SubmissionSerializer
),
total: submission_list.total
) )
end end
def download def download
send_data build_submissions.to_json, content = ActiveModel::ArraySerializer.new(
CustomWizard::Submission.list(@wizard).submissions,
each_serializer: CustomWizard::SubmissionSerializer
)
send_data content.to_json,
filename: "#{Discourse.current_hostname}-wizard-submissions-#{@wizard.name}.json", filename: "#{Discourse.current_hostname}-wizard-submissions-#{@wizard.name}.json",
content_type: "application/json", content_type: "application/json",
disposition: "attachment" disposition: "attachment"
end end
private protected
def build_submissions def submission_list
PluginStoreRow.where(plugin_name: "#{@wizard.id}_submissions") CustomWizard::Submission.list(@wizard, page: params[:page].to_i)
.order('id DESC')
.map do |row|
value = ::JSON.parse(row.value)
if user = User.find_by(id: row.key)
username = user.username
else
username = I18n.t('admin.wizard.submissions.no_user', id: row.key)
end
value.map do |v|
{ username: username }.merge!(v.except("redirect_to"))
end
end.flatten
end end
end end

Datei anzeigen

@ -37,7 +37,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
wizard_id = template.save(create: params[:create]) wizard_id = template.save(create: params[:create])
if template.errors.any? if template.errors.any?
render json: failed_json.merge(errors: result.errors.full_messages) render json: failed_json.merge(backend_validation_error: template.errors.full_messages.join("\n\n"))
else else
render json: success_json.merge(wizard_id: wizard_id) render json: success_json.merge(wizard_id: wizard_id)
end end
@ -79,21 +79,28 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:required, :required,
:prompt_completion, :prompt_completion,
:restart_on_revisit, :restart_on_revisit,
:resume_on_revisit,
:theme_id, :theme_id,
permitted: mapped_params, permitted: mapped_params,
steps: [ steps: [
:id, :id,
:index,
:title, :title,
:key, :key,
:banner, :banner,
:banner_upload_id,
:raw_description, :raw_description,
:required_data_message, :required_data_message,
:force_final,
required_data: mapped_params, required_data: mapped_params,
permitted_params: mapped_params, permitted_params: mapped_params,
condition: mapped_params,
fields: [ fields: [
:id, :id,
:index,
:label, :label,
:image, :image,
:image_upload_id,
:description, :description,
:required, :required,
:key, :key,
@ -105,9 +112,15 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:format, :format,
:limit, :limit,
:property, :property,
:preview_template,
:placeholder,
:can_create_tag,
prefill: mapped_params, prefill: mapped_params,
content: mapped_params, content: mapped_params,
condition: mapped_params,
index: mapped_params,
validations: {}, validations: {},
tag_groups: [],
] ]
], ],
actions: [ actions: [
@ -151,7 +164,9 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
mentionable_level: mapped_params, mentionable_level: mapped_params,
messageable_level: mapped_params, messageable_level: mapped_params,
visibility_level: mapped_params, visibility_level: mapped_params,
members_visibility_level: mapped_params members_visibility_level: mapped_params,
add_event: mapped_params,
add_location: mapped_params
] ]
) )
end end

Datei anzeigen

@ -0,0 +1,113 @@
# frozen_string_literal: true
class CustomWizard::StepsController < ::CustomWizard::WizardClientController
before_action :ensure_can_update
def update
update = update_params.to_h
update[:fields] = {}
if params[:fields]
field_ids = @builder.wizard.field_ids
params[:fields].each do |k, v|
update[:fields][k] = v if field_ids.include? k
end
end
@builder.build
updater = @builder.wizard.create_updater(update[:step_id], update[:fields])
updater.update
@result = updater.result
if updater.success?
wizard_id = update_params[:wizard_id]
builder = CustomWizard::Builder.new(wizard_id, current_user, guest_id)
@wizard = builder.build(force: true)
current_step = @wizard.find_step(update[:step_id])
current_submission = @wizard.current_submission
result = {}
if current_step.conditional_final_step && !current_step.last_step
current_step.force_final = true
end
if current_step.final?
builder.template.actions.each do |action_template|
if action_template['run_after'] === 'wizard_completion'
action_result = CustomWizard::Action.new(
action: action_template,
wizard: @wizard,
submission: current_submission
).perform
if action_result.success?
current_submission = action_result.submission
end
end
end
current_submission.save
if redirect = get_redirect
updater.result[:redirect_on_complete] = redirect
end
@wizard.cleanup_on_complete!
result[:final] = true
else
current_submission.save
result[:final] = false
result[:next_step_id] = current_step.next.id
end
result.merge!(updater.result) if updater.result.present?
result[:refresh_required] = true if updater.refresh_required?
result[:wizard] = ::CustomWizard::WizardSerializer.new(
@wizard,
scope: Guardian.new(current_user),
root: false
).as_json
render json: result
else
errors = []
updater.errors.messages.each do |field, msg|
errors << { field: field, description: msg.join(',') }
end
render json: { errors: errors }, status: 422
end
end
private
def ensure_can_update
raise Discourse::InvalidParameters.new(:wizard_id) if @builder.template.nil?
raise Discourse::InvalidAccess.new if !@builder.wizard || !@builder.wizard.can_access?
@step_template = @builder.template.steps.select do |s|
s['id'] == update_params[:step_id]
end.first
raise Discourse::InvalidParameters.new(:step_id) if !@step_template
raise Discourse::InvalidAccess.new if !@builder.check_condition(@step_template)
end
def update_params
@update_params || begin
params.require(:step_id)
params.require(:wizard_id)
params.permit(:wizard_id, :step_id).transform_values { |v| v.underscore }
end
end
def get_redirect
return @result[:redirect_on_next] if @result[:redirect_on_next].present?
submission = @wizard.current_submission
return nil unless submission.present?
## route_to set by actions, redirect_on_complete set by actions, redirect_to set at wizard entry
submission.route_to || submission.redirect_on_complete || submission.redirect_to
end
end

Datei anzeigen

@ -0,0 +1,39 @@
# frozen_string_literal: true
class CustomWizard::WizardController < ::CustomWizard::WizardClientController
def show
if wizard.present?
render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
else
render json: { error: I18n.t('wizard.none') }
end
end
def skip
params.require(:wizard_id)
if wizard.required && !wizard.completed? && wizard.permitted?
return render json: { error: I18n.t('wizard.no_skip') }
end
result = { success: 'OK' }
if current_user && wizard.can_access?
if redirect_to = wizard.current_submission&.redirect_to
result.merge!(redirect_to: redirect_to)
end
wizard.cleanup_on_skip!
end
render json: result
end
protected
def wizard
@wizard ||= begin
return nil unless @builder.present?
@builder.build({ reset: params[:reset] }, params)
end
end
end

Datei anzeigen

@ -0,0 +1,23 @@
# frozen_string_literal: true
class CustomWizard::WizardClientController < ::ApplicationController
before_action :ensure_plugin_enabled
before_action :set_builder
private
def ensure_plugin_enabled
unless SiteSetting.custom_wizard_enabled
redirect_to path("/")
end
end
def guest_id
return nil if current_user.present?
cookies[:custom_wizard_guest_id] ||= CustomWizard::Wizard.generate_guest_id
cookies[:custom_wizard_guest_id]
end
def set_builder
@builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user, guest_id)
end
end

Datei anzeigen

@ -9,11 +9,13 @@ module Jobs
user_ids = [] user_ids = []
User.human_users.each do |user| User.human_users.each do |user|
if CustomWizard::Wizard.set_wizard_redirect(wizard.id, user) if CustomWizard::Wizard.set_user_redirect(wizard.id, user)
user_ids.push(user.id) user_ids.push(user.id)
end end
end end
CustomWizard::Template.clear_cache_keys
MessageBus.publish "/redirect_to_wizard", wizard.id, user_ids: user_ids MessageBus.publish "/redirect_to_wizard", wizard.id, user_ids: user_ids
end end
end end

Datei anzeigen

@ -0,0 +1,10 @@
# frozen_string_literal: true
class CustomWizard::LogSerializer < ApplicationSerializer
attributes :date,
:action,
:username,
:message
has_one :user, serializer: ::BasicUserSerializer, embed: :objects
end

Datei anzeigen

@ -0,0 +1,35 @@
# frozen_string_literal: true
class CustomWizard::SubmissionSerializer < ApplicationSerializer
attributes :id,
:fields,
:submitted_at,
:user
def include_user?
object.wizard.user.present?
end
def user
::BasicUserSerializer.new(object.wizard.user, root: false).as_json
end
def fields
@fields ||= begin
result = {}
object.wizard.template['steps'].each do |step|
step['fields'].each do |field|
if value = object.fields[field['id']]
result[field['id']] = {
value: value,
type: field['type'],
label: field['label']
}
end
end
end
result
end
end
end

Datei anzeigen

@ -0,0 +1,138 @@
# frozen_string_literal: true
class CustomWizard::FieldSerializer < ::ApplicationSerializer
attributes :id,
:index,
:type,
:required,
:value,
:label,
:placeholder,
:description,
:image,
:file_types,
:format,
:limit,
:property,
:content,
:tag_groups,
:can_create_tag,
:validations,
:max_length,
:char_counter,
:preview_template
def id
object.id
end
def index
object.index
end
def type
object.type
end
def required
object.required
end
def value
object.value
end
def label
I18n.t("#{i18n_key}.label", default: object.label, base_url: Discourse.base_url)
end
def include_label?
label.present?
end
def description
I18n.t("#{i18n_key}.description", default: object.description, base_url: Discourse.base_url)
end
def include_description?
description.present?
end
def placeholder
I18n.t("#{i18n_key}.placeholder", default: object.placeholder)
end
def include_placeholder?
placeholder.present?
end
def image
object.image
end
def include_image?
object.image.present?
end
def file_types
object.file_types
end
def format
object.format
end
def limit
object.limit
end
def property
object.property
end
def content
object.content
end
def tag_groups
object.tag_groups
end
def can_create_tag
object.can_create_tag
end
def validations
validations = {}
object.validations&.each do |type, props|
next unless props["status"]
validations[props["position"]] ||= {}
validations[props["position"]][type] = props.merge CustomWizard::RealtimeValidation.types[type.to_sym]
end
validations
end
def max_length
object.max_length
end
def char_counter
object.char_counter
end
def preview_template
object.preview_template
end
protected
def i18n_key
@i18n_key ||= "#{object.step.wizard.id}.#{object.step.id}.#{object.id}".underscore
end
def subscribed?
@subscribed ||= CustomWizard::Subscription.subscribed?
end
end

Datei anzeigen

@ -4,16 +4,15 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
attributes :start, attributes :start,
:background, :background,
:submission_last_updated_at,
:theme_id, :theme_id,
:completed, :completed,
:required, :required,
:permitted, :permitted,
:uncategorized_category_id :resume_on_revisit
has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects
has_one :user, serializer: ::BasicUserSerializer, embed: :objects has_one :user, serializer: ::BasicUserSerializer, embed: :objects
has_many :categories, serializer: ::BasicCategorySerializer, embed: :objects
has_many :groups, serializer: ::BasicGroupSerializer, embed: :objects
def completed def completed
object.completed? object.completed?
@ -30,30 +29,18 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
end end
def start def start
object.start.id object.start
end end
def include_start? def include_start?
include_steps? && object.start.present? include_steps? && object.start.present?
end end
def submission_last_updated_at
object.current_submission.updated_at
end
def include_steps? def include_steps?
!include_completed? !include_completed?
end end
def include_categories?
object.needs_categories
end
def include_groups?
object.needs_groups
end
def uncategorized_category_id
SiteSetting.uncategorized_category_id
end
def include_uncategorized_category_id?
object.needs_categories
end
end end

Datei anzeigen

@ -0,0 +1,83 @@
# frozen_string_literal: true
class CustomWizard::StepSerializer < ::ApplicationSerializer
attributes :id,
:index,
:next,
:previous,
:description,
:title,
:banner,
:permitted,
:permitted_message,
:final
has_many :fields, serializer: ::CustomWizard::FieldSerializer, embed: :objects
def id
object.id
end
def index
object.index
end
def next
object.next.id if object.next.present?
end
def include_next?
object.next.present?
end
def previous
object.previous.id if object.previous.present?
end
def include_previous?
object.previous.present?
end
def title
I18n.t("#{i18n_key}.title", default: object.title, base_url: Discourse.base_url)
end
def include_title?
title.present?
end
def description
I18n.t("#{i18n_key}.description", default: object.description, base_url: Discourse.base_url)
end
def include_description?
description.present?
end
def banner
object.banner
end
def include_banner?
object.banner.present?
end
def permitted
object.permitted
end
def permitted_message
object.permitted_message
end
def final
object.final?
end
protected
def i18n_key
@i18n_key ||= "#{object.wizard.id}.#{object.id}".underscore
end
end

Datei anzeigen

@ -0,0 +1,28 @@
<!DOCTYPE html>
<html>
<head>
<title>Custom Wizard QUnit Test Runner</title>
<%= discourse_stylesheet_link_tag(:test_helper, theme_id: nil) %>
<%= discourse_stylesheet_link_tag :wizard, theme_id: nil %>
<%= discourse_stylesheet_link_tag :wizard_custom %>
<%= preload_script "locales/en" %>
<%= preload_script "ember_jquery" %>
<%= preload_script "wizard-vendor" %>
<%= preload_script "wizard-custom" %>
<%= preload_script "wizard-raw-templates" %>
<%= preload_script "wizard-plugin" %>
<%= preload_script "pretty-text-bundle" %>
<%= preload_script "wizard-qunit" %>
<%= csrf_meta_tags %>
<script src="<%= ExtraLocalesController.url("wizard") %>"></script>
<%= tag.meta id: 'data-discourse-setup', data: client_side_setup_data %>
<meta name="discourse_theme_id" content="">
<meta name="discourse-base-uri" content="<%= Discourse.base_path %>">
</head>
<body class="custom-wizard">
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

Datei anzeigen

@ -1,119 +1,126 @@
import Component from "@ember/component"; import Component from "@ember/component";
import discourseComputed, { observes } from "discourse-common/utils/decorators"; import discourseComputed, { observes } from "discourse-common/utils/decorators";
import { or, alias } from "@ember/object/computed"; import { alias, equal, or } from "@ember/object/computed";
import I18n from "I18n";
const generateContent = function(array, type) {
return array.map(key => ({
id: key,
name: I18n.t(`admin.wizard.custom_field.${type}.${key}`)
}));
}
export default Component.extend({ export default Component.extend({
tagName: 'tr', tagName: "tr",
topicSerializers: ['topic_view', 'topic_list_item'], topicSerializers: ["topic_view", "topic_list_item"],
postSerializers: ['post'], postSerializers: ["post"],
groupSerializers: ['basic_group'], groupSerializers: ["basic_group"],
categorySerializers: ['basic_category'], categorySerializers: ["basic_category"],
klassContent: generateContent(['topic', 'post', 'group', 'category'], 'klass'), showInputs: or("field.new", "field.edit"),
typeContent: generateContent(['string', 'boolean', 'integer', 'json'], 'type'), classNames: ["custom-field-input"],
showInputs: or('field.new', 'field.edit'), loading: or("saving", "destroying"),
classNames: ['custom-field-input'], destroyDisabled: alias("loading"),
loading: or('saving', 'destroying'), closeDisabled: alias("loading"),
destroyDisabled: alias('loading'), isExternal: equal("field.id", "external"),
closeDisabled: alias('loading'),
didInsertElement() { didInsertElement() {
this.set('originalField', JSON.parse(JSON.stringify(this.field))); this.set("originalField", JSON.parse(JSON.stringify(this.field)));
}, },
@discourseComputed('field.klass') @discourseComputed("field.klass")
serializerContent(klass, p2) { serializerContent(klass) {
const serializers = this.get(`${klass}Serializers`); const serializers = this.get(`${klass}Serializers`);
if (serializers) { if (serializers) {
return generateContent(serializers, 'serializers'); return serializers.reduce((result, key) => {
} else { result.push({
return []; id: key,
name: I18n.t(`admin.wizard.custom_field.serializers.${key}`),
});
return result;
}, []);
} }
}, },
@observes('field.klass') @observes("field.klass")
clearSerializersWhenClassChanges() { clearSerializersWhenClassChanges() {
this.set('field.serializers', null); this.set("field.serializers", null);
}, },
compareArrays(array1, array2) { compareArrays(array1, array2) {
return array1.length === array2.length && array1.every((value, index) => { return (
return value === array2[index]; array1.length === array2.length &&
}); array1.every((value, index) => {
return value === array2[index];
})
);
}, },
@discourseComputed( @discourseComputed(
'saving', "saving",
'field.name', "isExternal",
'field.klass', "field.name",
'field.type', "field.klass",
'field.serializers' "field.type",
"field.serializers"
) )
saveDisabled(saving) { saveDisabled(saving, isExternal) {
if (saving) return true; if (saving || isExternal) {
return true;
}
const originalField = this.originalField; const originalField = this.originalField;
if (!originalField) return false; if (!originalField) {
return false;
return ['name', 'klass', 'type', 'serializers'].every(attr => { }
return ["name", "klass", "type", "serializers"].every((attr) => {
let current = this.get(attr); let current = this.get(attr);
let original = originalField[attr]; let original = originalField[attr];
if (!current) return false; if (!current) {
return false;
if (attr == 'serializers') { }
if (attr === "serializers") {
return this.compareArrays(current, original); return this.compareArrays(current, original);
} else { } else {
return current == original; return current === original;
} }
}); });
}, },
actions: { actions: {
edit() { edit() {
this.set('field.edit', true); this.set("field.edit", true);
}, },
close() { close() {
if (this.field.edit) { if (this.field.edit) {
this.set('field.edit', false); this.set("field.edit", false);
} }
}, },
destroy() { destroy() {
this.set('destroying', true); this.set("destroying", true);
this.removeField(this.field); this.removeField(this.field);
}, },
save() { save() {
this.set('saving', true); this.set("saving", true);
const field = this.field; const field = this.field;
let data = { let data = {
id: field.id, id: field.id,
klass: field.klass, klass: field.klass,
type: field.type, type: field.type,
serializers: field.serializers, serializers: field.serializers,
name: field.name name: field.name,
} };
this.saveField(data).then((result) => { this.saveField(data).then((result) => {
this.set('saving', false); this.set("saving", false);
if (result.success) { if (result.success) {
this.set('field.edit', false); this.set("field.edit", false);
} else { } else {
this.set('saveIcon', 'times'); this.set("saveIcon", "times");
} }
setTimeout(() => this.set('saveIcon', null), 10000); setTimeout(() => this.set("saveIcon", null), 10000);
}); });
} },
} },
}); });

Datei anzeigen

@ -0,0 +1,146 @@
import {
default as computed,
observes,
} from "discourse-common/utils/decorators";
import { renderAvatar } from "discourse/helpers/user-avatar";
import userSearch from "discourse/lib/user-search";
import I18n from "I18n";
import Handlebars from "handlebars";
import { isEmpty } from "@ember/utils";
import TextField from "discourse/components/text-field";
const template = function (params) {
const options = params.options;
let html = "<div class='autocomplete'>";
if (options.users) {
html += "<ul>";
options.users.forEach((u) => {
html += `<li><a href title="${u.name}">`;
html += renderAvatar(u, { imageSize: "tiny" });
html += `<span class='username'>${u.username}</span>`;
if (u.name) {
html += `<span class='name'>${u.name}</span>`;
}
html += `</a></li>`;
});
html += "</ul>";
}
html += "</div>";
return new Handlebars.SafeString(html).string;
};
export default TextField.extend({
attributeBindings: ["autofocus", "maxLength"],
autocorrect: false,
autocapitalize: false,
name: "user-selector",
id: "custom-member-selector",
@computed("placeholderKey")
placeholder(placeholderKey) {
return placeholderKey ? I18n.t(placeholderKey) : "";
},
@observes("usernames")
_update() {
if (this.get("canReceiveUpdates") === "true") {
this.didInsertElement({ updateData: true });
}
},
didInsertElement(opts) {
this._super();
let self = this,
selected = [],
groups = [],
includeMentionableGroups =
this.get("includeMentionableGroups") === "true",
includeMessageableGroups =
this.get("includeMessageableGroups") === "true",
includeGroups = this.get("includeGroups") === "true",
allowedUsers = this.get("allowedUsers") === "true";
function excludedUsernames() {
// hack works around some issues with allowAny eventing
const usernames = self.get("single") ? [] : selected;
return usernames;
}
$(this.element)
.val(this.get("usernames"))
.autocomplete({
template,
disabled: this.get("disabled"),
single: this.get("single"),
allowAny: this.get("allowAny"),
updateData: opts && opts.updateData ? opts.updateData : false,
dataSource(term) {
const termRegex = /[^a-zA-Z0-9_\-\.@\+]/;
let results = userSearch({
term: term.replace(termRegex, ""),
topicId: self.get("topicId"),
exclude: excludedUsernames(),
includeGroups,
allowedUsers,
includeMentionableGroups,
includeMessageableGroups,
});
return results;
},
transformComplete(v) {
if (v.username || v.name) {
if (!v.username) {
groups.push(v.name);
}
return v.username || v.name;
} else {
let excludes = excludedUsernames();
return v.usernames.filter(function (item) {
return excludes.indexOf(item) === -1;
});
}
},
onChangeItems(items) {
let hasGroups = false;
items = items.map(function (i) {
if (groups.indexOf(i) > -1) {
hasGroups = true;
}
return i.username ? i.username : i;
});
self.set("usernames", items.join(","));
self.set("hasGroups", hasGroups);
selected = items;
if (self.get("onChangeCallback")) {
self.sendAction("onChangeCallback");
}
},
reverseTransform(i) {
return { username: i };
},
});
},
willDestroyElement() {
this._super();
$(this.element).autocomplete("destroy");
},
// THIS IS A HUGE HACK TO SUPPORT CLEARING THE INPUT
@observes("usernames")
_clearInput: function () {
if (arguments.length > 1) {
if (isEmpty(this.get("usernames"))) {
$(this.element).parent().find("a").click();
}
}
},
});

Datei anzeigen

@ -0,0 +1,18 @@
import CategorySelector from "select-kit/components/category-selector";
import { computed } from "@ember/object";
import { makeArray } from "discourse-common/lib/helpers";
export default CategorySelector.extend({
classNames: ["category-selector", "wizard-category-selector"],
content: computed(
"categories.[]",
"blacklist.[]",
"whitelist.[]",
function () {
return this._super().filter((category) => {
const whitelist = makeArray(this.whitelist);
return !whitelist.length || whitelist.indexOf(category.id) > -1;
});
}
),
});

Datei anzeigen

@ -0,0 +1,213 @@
import ComposerEditor from "discourse/components/composer-editor";
import {
bind,
default as discourseComputed,
on,
} from "discourse-common/utils/decorators";
import { findRawTemplate } from "discourse-common/lib/raw-templates";
import { scheduleOnce } from "@ember/runloop";
import { caretPosition, inCodeBlock } from "discourse/lib/utilities";
import highlightSyntax from "discourse/lib/highlight-syntax";
import { alias } from "@ember/object/computed";
import Site from "discourse/models/site";
import { uploadIcon } from "discourse/lib/uploads";
import { dasherize } from "@ember/string";
import InsertHyperlink from "discourse/components/modal/insert-hyperlink";
import { inject as service } from "@ember/service";
const IMAGE_MARKDOWN_REGEX =
/!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
export default ComposerEditor.extend({
modal: service(),
classNameBindings: ["fieldClass"],
allowUpload: true,
showLink: false,
topic: null,
showToolbar: true,
focusTarget: "reply",
canWhisper: false,
lastValidatedAt: "lastValidatedAt",
popupMenuOptions: [],
draftStatus: "null",
replyPlaceholder: alias("field.translatedPlaceholder"),
wizardEventFieldId: null,
composerEventPrefix: "wizard-editor",
@on("didInsertElement")
_composerEditorInit() {
const $input = $(this.element.querySelector(".d-editor-input"));
if (this.siteSettings.enable_mentions) {
$input.autocomplete({
template: findRawTemplate("user-selector-autocomplete"),
dataSource: (term) => this._userSearchTerm.call(this, term),
key: "@",
transformComplete: (v) => v.username || v.name,
afterComplete: (value) => {
this.composer.set("reply", value);
scheduleOnce("afterRender", () => $input.blur().focus());
},
triggerRule: (textarea) =>
!inCodeBlock(textarea.value, caretPosition(textarea)),
});
}
const siteSettings = this.siteSettings;
if (siteSettings.mentionables_enabled) {
Site.currentProp("mentionable_items", this.wizard.mentionable_items);
const { SEPARATOR } = requirejs(
"discourse/plugins/discourse-mentionables/discourse/lib/discourse-markdown/mentionable-items"
);
const { searchMentionableItem } = requirejs(
"discourse/plugins/discourse-mentionables/discourse/lib/mentionable-item-search"
);
$input.autocomplete({
template: findRawTemplate("javascripts/mentionable-item-autocomplete"),
key: SEPARATOR,
afterComplete: (value) => {
this.composer.set("reply", value);
scheduleOnce("afterRender", () => $input.blur().focus());
},
transformComplete: (item) => item.model.slug,
dataSource: (term) =>
term.match(/\s/) ? null : searchMentionableItem(term, siteSettings),
triggerRule: (textarea) =>
!inCodeBlock(textarea.value, caretPosition(textarea)),
});
}
$input.on("scroll", this._throttledSyncEditorAndPreviewScroll);
this._bindUploadTarget();
const field = this.field;
this.editorInputClass = `.${dasherize(field.type)}-${dasherize(
field.id
)} .d-editor-input`;
this._uppyInstance.on("file-added", () => {
this.session.set("wizardEventFieldId", field.id);
});
},
@discourseComputed("field.id")
fileUploadElementId(fieldId) {
return `file-uploader-${dasherize(fieldId)}`;
},
@discourseComputed
allowedFileTypes() {
return this.siteSettings.authorized_extensions
.split("|")
.map((ext) => "." + ext)
.join(",");
},
@discourseComputed()
uploadIcon() {
return uploadIcon(false, this.siteSettings);
},
@bind
_handleImageDeleteButtonClick(event) {
if (!event.target.classList.contains("delete-image-button")) {
return;
}
const index = parseInt(
event.target.closest(".button-wrapper").dataset.imageIndex,
10
);
const matchingPlaceholder =
this.get("composer.reply").match(IMAGE_MARKDOWN_REGEX);
this.session.set("wizardEventFieldId", this.field.id);
this.appEvents.trigger(
"composer:replace-text",
matchingPlaceholder[index],
"",
{ regex: IMAGE_MARKDOWN_REGEX, index }
);
},
actions: {
extraButtons(toolbar) {
const component = this;
if (this.allowUpload && this.uploadIcon) {
toolbar.addButton({
id: "upload",
group: "insertions",
icon: this.uploadIcon,
title: "upload",
sendAction: (event) => component.send("showUploadModal", event),
});
}
toolbar.addButton({
id: "link",
group: "insertions",
shortcut: "K",
trimLeading: true,
unshift: true,
sendAction: (event) => component.send("showLinkModal", event),
});
if (this.siteSettings.mentionables_enabled) {
const { SEPARATOR } = requirejs(
"discourse/plugins/discourse-mentionables/discourse/lib/discourse-markdown/mentionable-items"
);
toolbar.addButton({
id: "insert-mentionable",
group: "extras",
icon: this.siteSettings.mentionables_composer_button_icon,
title: "mentionables.composer.insert.title",
perform: () => {
this.appEvents.trigger("wizard-editor:insert-text", {
fieldId: this.field.id,
text: SEPARATOR,
});
const $textarea = $(
document.querySelector(
`.composer-field.${this.field.id} textarea.d-editor-input`
)
);
$textarea.trigger("keyup.autocomplete");
},
});
}
},
previewUpdated(preview) {
highlightSyntax(preview, this.siteSettings, this.session);
if (this.siteSettings.mentionables_enabled) {
const { linkSeenMentionableItems } = requirejs(
"discourse/plugins/discourse-mentionables/discourse/lib/mentionable-items-preview-styling"
);
linkSeenMentionableItems(preview, this.siteSettings);
}
this._super(...arguments);
},
showLinkModal(toolbarEvent) {
let linkText = "";
this._lastSel = toolbarEvent.selected;
if (this._lastSel) {
linkText = this._lastSel.value;
}
this.modal.show(InsertHyperlink, {
model: { linkText, toolbarEvent },
});
},
showUploadModal() {
this.session.set("wizardEventFieldId", this.field.id);
document.getElementById(this.fileUploadElementId).click();
},
},
});

Datei anzeigen

@ -0,0 +1,17 @@
import DateInput from "discourse/components/date-input";
import discourseComputed from "discourse-common/utils/decorators";
export default DateInput.extend({
useNativePicker: false,
classNameBindings: ["fieldClass"],
@discourseComputed()
placeholder() {
return this.format;
},
_opts() {
return {
format: this.format || "LL",
};
},
});

Datei anzeigen

@ -1,14 +1,16 @@
import DateTimeInput from "discourse/components/date-time-input"; import DateTimeInput from "discourse/components/date-time-input";
import discourseComputed from 'discourse-common/utils/decorators'; import discourseComputed from "discourse-common/utils/decorators";
export default DateTimeInput.extend({ export default DateTimeInput.extend({
@discourseComputed('timeFirst', 'tabindex') classNameBindings: ["fieldClass"],
@discourseComputed("timeFirst", "tabindex")
timeTabindex(timeFirst, tabindex) { timeTabindex(timeFirst, tabindex) {
return timeFirst ? tabindex : tabindex + 1; return timeFirst ? tabindex : tabindex + 1;
}, },
@discourseComputed('timeFirst', 'tabindex') @discourseComputed("timeFirst", "tabindex")
dateTabindex(timeFirst, tabindex) { dateTabindex(timeFirst, tabindex) {
return timeFirst ? tabindex + 1 : tabindex; return timeFirst ? tabindex + 1 : tabindex;
} },
}); });

Datei anzeigen

@ -0,0 +1,42 @@
import { observes } from "discourse-common/utils/decorators";
import Category from "discourse/models/category";
import Component from "@ember/component";
export default Component.extend({
didInsertElement() {
const property = this.field.property || "id";
const value = this.field.value;
if (value) {
this.set(
"categories",
[...value].reduce((result, v) => {
let val =
property === "id" ? Category.findById(v) : Category.findBySlug(v);
if (val) {
result.push(val);
}
return result;
}, [])
);
}
},
@observes("categories")
setValue() {
const categories = (this.categories || []).filter((c) => !!c);
const property = this.field.property || "id";
if (categories.length) {
this.set(
"field.value",
categories.reduce((result, c) => {
if (c && c[property]) {
result.push(c[property]);
}
return result;
}, [])
);
}
},
});

Datei anzeigen

@ -0,0 +1,3 @@
import Component from "@ember/component";
export default Component.extend({});

Datei anzeigen

@ -0,0 +1,49 @@
import Component from "@ember/component";
import { loadOneboxes } from "discourse/lib/load-oneboxes";
import { schedule } from "@ember/runloop";
import discourseDebounce from "discourse-common/lib/debounce";
import { resolveAllShortUrls } from "pretty-text/upload-short-url";
import { ajax } from "discourse/lib/ajax";
import { on } from "discourse-common/utils/decorators";
export default Component.extend({
@on("init")
updatePreview() {
if (this.isDestroyed) {
return;
}
schedule("afterRender", () => {
if (this._state !== "inDOM" || !this.element) {
return;
}
const $preview = $(this.element);
if ($preview.length === 0) {
return;
}
this.previewUpdated($preview);
});
},
previewUpdated($preview) {
// Paint oneboxes
const paintFunc = () => {
loadOneboxes(
$preview[0],
ajax,
null,
null,
this.siteSettings.max_oneboxes_per_post,
true // refresh on every load
);
};
discourseDebounce(this, paintFunc, 450);
// Short upload urls need resolution
resolveAllShortUrls(ajax, this.siteSettings, $preview[0]);
},
});

Datei anzeigen

@ -0,0 +1,48 @@
import {
default as computed,
observes,
} from "discourse-common/utils/decorators";
import EmberObject from "@ember/object";
import Component from "@ember/component";
export default Component.extend({
showPreview: false,
classNameBindings: [
":wizard-field-composer",
"showPreview:show-preview:hide-preview",
],
didInsertElement() {
this.set(
"composer",
EmberObject.create({
loading: false,
reply: this.get("field.value") || "",
})
);
},
@observes("composer.reply")
setField() {
this.set("field.value", this.get("composer.reply"));
},
@computed("showPreview")
togglePreviewLabel(showPreview) {
return showPreview
? "wizard_composer.hide_preview"
: "wizard_composer.show_preview";
},
actions: {
togglePreview() {
this.toggleProperty("showPreview");
},
groupsMentioned() {},
afterRefresh() {},
cannotSeeMention() {},
importQuote() {},
showUploadSelector() {},
},
});

Datei anzeigen

@ -0,0 +1,15 @@
import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
@observes("dateTime")
setValue() {
this.set("field.value", this.dateTime.format(this.field.format));
},
actions: {
onChange(value) {
this.set("dateTime", moment(value));
},
},
});

Datei anzeigen

@ -0,0 +1,15 @@
import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
@observes("date")
setValue() {
this.set("field.value", this.date.format(this.field.format));
},
actions: {
onChange(value) {
this.set("date", moment(value));
},
},
});

Datei anzeigen

@ -0,0 +1,13 @@
import Component from "@ember/component";
export default Component.extend({
keyPress(e) {
e.stopPropagation();
},
actions: {
onChangeValue(value) {
this.set("field.value", value);
},
},
});

Datei anzeigen

@ -0,0 +1,3 @@
import Component from "@ember/component";
export default Component.extend({});

Datei anzeigen

@ -0,0 +1,3 @@
import Component from "@ember/component";
export default Component.extend({});

Datei anzeigen

@ -0,0 +1,3 @@
import Component from "@ember/component";
export default Component.extend({});

Datei anzeigen

@ -0,0 +1,7 @@
import Component from "@ember/component";
export default Component.extend({
keyPress(e) {
e.stopPropagation();
},
});

Datei anzeigen

@ -0,0 +1,7 @@
import Component from "@ember/component";
export default Component.extend({
keyPress(e) {
e.stopPropagation();
},
});

Datei anzeigen

@ -0,0 +1,23 @@
import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
classNameBindings: ["fieldClass"],
@observes("time")
setValue() {
this.set("field.value", this.time.format(this.field.format));
},
actions: {
onChange(value) {
this.set(
"time",
moment({
hours: value.hours,
minutes: value.minutes,
})
);
},
},
});

Datei anzeigen

@ -0,0 +1,27 @@
import UppyUploadMixin from "discourse/mixins/uppy-upload";
import Component from "@ember/component";
import { computed } from "@ember/object";
export default Component.extend(UppyUploadMixin, {
classNames: ["wizard-field-upload"],
classNameBindings: ["isImage", "fieldClass"],
uploading: false,
type: computed(function () {
return `wizard_${this.field.id}`;
}),
id: computed(function () {
return `wizard_field_upload_${this.field.id}`;
}),
isImage: computed("field.value.extension", function () {
return (
this.field.value &&
this.siteSettings.wizard_recognised_image_upload_formats
.split("|")
.includes(this.field.value.extension)
);
}),
uploadDone(upload) {
this.set("field.value", upload);
},
});

Datei anzeigen

@ -0,0 +1,3 @@
import Component from "@ember/component";
export default Component.extend({});

Datei anzeigen

@ -0,0 +1,5 @@
import Component from "@ember/component";
export default Component.extend({
classNameBindings: ["fieldClass"],
});

Datei anzeigen

@ -0,0 +1,41 @@
import Component from "@ember/component";
import { dasherize } from "@ember/string";
import discourseComputed from "discourse-common/utils/decorators";
import { cookAsync } from "discourse/lib/text";
export default Component.extend({
classNameBindings: [
":wizard-field",
"typeClasses",
"field.invalid",
"field.id",
],
didReceiveAttrs() {
this._super(...arguments);
cookAsync(this.field.translatedDescription).then((cookedDescription) => {
this.set("cookedDescription", cookedDescription);
});
},
@discourseComputed("field.type", "field.id")
typeClasses: (type, id) =>
`${dasherize(type)}-field ${dasherize(type)}-${dasherize(id)}`,
@discourseComputed("field.id")
fieldClass: (id) => `field-${dasherize(id)} wizard-focusable`,
@discourseComputed("field.type", "field.id")
inputComponentName(type, id) {
if (["text_only"].includes(type)) {
return false;
}
return dasherize(type === "component" ? id : `custom-wizard-field-${type}`);
},
@discourseComputed("field.type")
textType(fieldType) {
return ["text", "textarea"].includes(fieldType);
},
});

Datei anzeigen

@ -0,0 +1,19 @@
import ComboBox from "select-kit/components/combo-box";
import { computed } from "@ember/object";
import { makeArray } from "discourse-common/lib/helpers";
export default ComboBox.extend({
content: computed("groups.[]", "field.content.[]", function () {
const whitelist = makeArray(this.field.content);
return this.groups
.filter((group) => {
return !whitelist.length || whitelist.indexOf(group.id) > -1;
})
.map((g) => {
return {
id: g.id,
name: g.full_name ? g.full_name : g.name,
};
});
}),
});

Datei anzeigen

@ -0,0 +1,29 @@
import CustomWizard from "../models/custom-wizard";
import discourseComputed from "discourse-common/utils/decorators";
import Component from "@ember/component";
import { dasherize } from "@ember/string";
import getURL from "discourse-common/lib/get-url";
export default Component.extend({
classNameBindings: [":wizard-no-access", "reasonClass"],
@discourseComputed("reason")
reasonClass(reason) {
return dasherize(reason);
},
@discourseComputed
siteName() {
return this.siteSettings.title || "";
},
actions: {
skip() {
if (this.currentUser) {
CustomWizard.skip(this.get("wizardId"));
} else {
window.location = getURL("/");
}
},
},
});

Datei anzeigen

@ -2,10 +2,10 @@ import Component from "@ember/component";
import { bind } from "@ember/runloop"; import { bind } from "@ember/runloop";
import { observes } from "discourse-common/utils/decorators"; import { observes } from "discourse-common/utils/decorators";
export default Component.extend({ export default Component.extend({
classNames: ['wizard-similar-topics'], classNames: ["wizard-similar-topics"],
showTopics: true, showTopics: true,
didInsertElement() { didInsertElement() {
$(document).on("click", bind(this, this.documentClick)); $(document).on("click", bind(this, this.documentClick));
}, },
@ -15,22 +15,24 @@ export default Component.extend({
}, },
documentClick(e) { documentClick(e) {
if (this._state == "destroying") return; if (this._state === "destroying") {
return;
}
let $target = $(e.target); let $target = $(e.target);
if (!$target.hasClass('show-topics')) { if (!$target.hasClass("show-topics")) {
this.set('showTopics', false); this.set("showTopics", false);
} }
}, },
@observes('topics') @observes("topics")
toggleShowWhenTopicsChange() { toggleShowWhenTopicsChange() {
this.set('showTopics', true); this.set("showTopics", true);
}, },
actions: { actions: {
toggleShowTopics() { toggleShowTopics() {
this.set('showTopics', true); this.set("showTopics", true);
} },
} },
}) });

Datei anzeigen

@ -0,0 +1,9 @@
import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";
export default Component.extend({
classNameBindings: [":wizard-step-form", "customStepClass"],
@discourseComputed("step.id")
customStepClass: (stepId) => `wizard-step-${stepId}`,
});

Datei anzeigen

@ -0,0 +1,227 @@
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import Component from "@ember/component";
import I18n from "I18n";
import getUrl from "discourse-common/lib/get-url";
import { htmlSafe } from "@ember/template";
import { schedule } from "@ember/runloop";
import { cookAsync } from "discourse/lib/text";
import CustomWizard, {
updateCachedWizard,
} from "discourse/plugins/discourse-custom-wizard/discourse/models/custom-wizard";
import { alias, not } from "@ember/object/computed";
import discourseLater from "discourse-common/lib/later";
const alreadyWarned = {};
export default Component.extend({
classNameBindings: [":wizard-step", "step.id"],
saving: null,
init() {
this._super(...arguments);
this.set("stylingDropdown", {});
},
didReceiveAttrs() {
this._super(...arguments);
cookAsync(this.step.translatedTitle).then((cookedTitle) => {
this.set("cookedTitle", cookedTitle);
});
cookAsync(this.step.translatedDescription).then((cookedDescription) => {
this.set("cookedDescription", cookedDescription);
});
},
didInsertElement() {
this._super(...arguments);
this.autoFocus();
},
@discourseComputed("step.index", "wizard.required")
showQuitButton: (index, required) => index === 0 && !required,
showNextButton: not("step.final"),
showDoneButton: alias("step.final"),
@discourseComputed(
"step.index",
"step.displayIndex",
"wizard.totalSteps",
"wizard.completed"
)
showFinishButton: (index, displayIndex, total, completed) => {
return index !== 0 && displayIndex !== total && completed;
},
@discourseComputed("step.index")
showBackButton: (index) => index > 0,
@discourseComputed("step.banner")
bannerImage(src) {
if (!src) {
return;
}
return getUrl(src);
},
@discourseComputed("step.id")
bannerAndDescriptionClass(id) {
return `wizard-banner-and-description wizard-banner-and-description-${id}`;
},
@discourseComputed("step.fields.[]")
primaryButtonIndex(fields) {
return fields.length + 1;
},
@discourseComputed("step.fields.[]")
secondaryButtonIndex(fields) {
return fields.length + 2;
},
@observes("step.id")
_stepChanged() {
this.set("saving", false);
this.autoFocus();
},
@observes("step.message")
_handleMessage: function () {
const message = this.get("step.message");
this.showMessage(message);
},
@discourseComputed("step.index", "wizard.totalSteps")
barStyle(displayIndex, totalSteps) {
let ratio = parseFloat(displayIndex) / parseFloat(totalSteps - 1);
if (ratio < 0) {
ratio = 0;
}
if (ratio > 1) {
ratio = 1;
}
return htmlSafe(`width: ${ratio * 200}px`);
},
@discourseComputed("step.fields")
includeSidebar(fields) {
return !!fields.findBy("show_in_sidebar");
},
autoFocus() {
discourseLater(() => {
schedule("afterRender", () => {
if ($(".invalid .wizard-focusable").length) {
this.animateInvalidFields();
}
});
});
},
animateInvalidFields() {
schedule("afterRender", () => {
let $invalid = $(".invalid .wizard-focusable");
if ($invalid.length) {
$([document.documentElement, document.body]).animate(
{
scrollTop: $invalid.offset().top - 200,
},
400
);
}
});
},
advance() {
this.set("saving", true);
this.get("step")
.save()
.then((response) => {
updateCachedWizard(CustomWizard.build(response["wizard"]));
if (response["final"]) {
CustomWizard.finished(response);
} else {
this.goNext(response);
}
})
.catch(() => this.animateInvalidFields())
.finally(() => this.set("saving", false));
},
actions: {
quit() {
this.get("wizard").skip();
},
done() {
this.send("nextStep");
},
showMessage(message) {
this.sendAction(message);
},
stylingDropdownChanged(id, value) {
this.set("stylingDropdown", { id, value });
},
exitEarly() {
const step = this.step;
step.validate();
if (step.get("valid")) {
this.set("saving", true);
step
.save()
.then(() => this.send("quit"))
.finally(() => this.set("saving", false));
} else {
this.autoFocus();
}
},
backStep() {
if (this.saving) {
return;
}
this.goBack();
},
nextStep() {
if (this.saving) {
return;
}
const step = this.step;
const result = step.validate();
if (result.warnings.length) {
const unwarned = result.warnings.filter((w) => !alreadyWarned[w]);
if (unwarned.length) {
unwarned.forEach((w) => (alreadyWarned[w] = true));
return window.bootbox.confirm(
unwarned.map((w) => I18n.t(`wizard.${w}`)).join("\n"),
I18n.t("no_value"),
I18n.t("yes_value"),
(confirmed) => {
if (confirmed) {
this.advance();
}
}
);
}
}
if (step.get("valid")) {
this.advance();
} else {
this.autoFocus();
}
},
},
});

Datei anzeigen

@ -0,0 +1,15 @@
import TagChooser from "select-kit/components/tag-chooser";
export default TagChooser.extend({
searchTags(url, data, callback) {
if (this.tagGroups) {
let tagGroupsString = this.tagGroups.join(",");
data.filterForInput = {
name: "custom-wizard-tag-chooser",
groups: tagGroupsString,
};
}
return this._super(url, data, callback);
},
});

Datei anzeigen

@ -1,4 +1,4 @@
import TagChooser from 'select-kit/components/tag-chooser'; import TagChooser from "select-kit/components/tag-chooser";
import { makeArray } from "discourse-common/lib/helpers"; import { makeArray } from "discourse-common/lib/helpers";
export default TagChooser.extend({ export default TagChooser.extend({
@ -7,5 +7,5 @@ export default TagChooser.extend({
const whitelist = makeArray(context.whitelist); const whitelist = makeArray(context.whitelist);
return !whitelist.length || whitelist.indexOf(tag.id) > 1; return !whitelist.length || whitelist.indexOf(tag.id) > 1;
}); });
} },
}) });

Datei anzeigen

@ -0,0 +1,44 @@
import computed from "discourse-common/utils/decorators";
import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction";
import I18n from "I18n";
import TextField from "discourse/components/text-field";
export default TextField.extend({
attributeBindings: [
"autocorrect",
"autocapitalize",
"autofocus",
"maxLength",
"dir",
],
@computed
dir() {
if (this.siteSettings.support_mixed_text_direction) {
let val = this.value;
if (val) {
return isRTL(val) ? "rtl" : "ltr";
} else {
return siteDir();
}
}
},
keyUp() {
if (this.siteSettings.support_mixed_text_direction) {
let val = this.value;
if (isRTL(val)) {
this.set("dir", "rtl");
} else if (isLTR(val)) {
this.set("dir", "ltr");
} else {
this.set("dir", siteDir());
}
}
},
@computed("placeholderKey")
placeholder(placeholderKey) {
return placeholderKey ? I18n.t(placeholderKey) : "";
},
});

Datei anzeigen

@ -1,3 +1,3 @@
import TimeInput from "discourse/components/time-input"; import TimeInput from "discourse/components/time-input";
export default TimeInput.extend(); export default TimeInput.extend({});

Datei anzeigen

@ -1,5 +1,5 @@
import Component from "@ember/component"; import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({ export default Component.extend({
actions: { actions: {
perform() { perform() {

Datei anzeigen

@ -0,0 +1,34 @@
<DModal @closeModal={{@closeModal}} @title={{this.title}}>
{{#if loading}}
<LoadingSpinner size="large" />
{{else}}
<div class="edit-directory-columns-container">
{{#each @model.columns as |column|}}
<div class="edit-directory-column">
<div class="left-content">
<label class="column-name">
<Input @type="checkbox" @checked={{column.enabled}} />
{{directory-table-header-title
field=column.label
translated=true
}}
</label>
</div>
</div>
{{/each}}
</div>
{{/if}}
<div class="modal-footer">
<DButton
class="btn-primary"
@label="directory.edit_columns.save"
@action={{action "save"}}
/>
<DButton
class="btn-secondary reset-to-default"
@label="directory.edit_columns.reset_to_default"
@action={{action "resetToDefault"}}
/>
</div>
</DModal>

Datei anzeigen

@ -0,0 +1,15 @@
import Component from "@glimmer/component";
import { action } from "@ember/object";
import I18n from "I18n";
export default class AdminWizardsColumnComponent extends Component {
title = I18n.t("admin.wizard.edit_columns");
@action save() {
this.args.closeModal();
}
@action resetToDefault() {
this.args.model.reset();
}
}

Datei anzeigen

@ -0,0 +1,20 @@
<DModal
@closeModal={{@closeModal}}
class="next-session-time-modal"
@title={{this.title}}
>
<DateTimeInput
@date={{this.bufferedDateTime}}
@onChange={{action "dateTimeChanged"}}
@showTime="true"
@clearable="true"
/>
<div class="modal-footer">
<DButton
@action={{action "submit"}}
class="btn-primary"
@label="admin.wizard.after_time_modal.done"
@disabled={{this.submitDisabled}}
/>
</div>
</DModal>

Datei anzeigen

@ -0,0 +1,30 @@
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import I18n from "I18n";
export default class NextSessionScheduledComponent extends Component {
@tracked bufferedDateTime;
title = I18n.t("admin.wizard.after_time_modal.title");
constructor() {
super(...arguments);
this.bufferedDateTime = this.args.model.dateTime
? moment(this.args.model.dateTime)
: moment(Date.now());
}
get submitDisabled() {
return moment().isAfter(this.bufferedDateTime);
}
@action submit() {
const dateTime = this.bufferedDateTime;
this.args.model.update(moment(dateTime).utc().toISOString());
this.args.closeModal();
}
@action dateTimeChanged(dateTime) {
this.bufferedDateTime = dateTime;
}
}

Datei anzeigen

@ -0,0 +1,160 @@
import WizardFieldValidator from "discourse/plugins/discourse-custom-wizard/discourse/components/validator";
import { deepMerge } from "discourse-common/lib/object";
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import { cancel, later } from "@ember/runloop";
import { A } from "@ember/array";
import EmberObject, { computed } from "@ember/object";
import { and, equal, notEmpty } from "@ember/object/computed";
import { categoryBadgeHTML } from "discourse/helpers/category-link";
import { dasherize } from "@ember/string";
export default WizardFieldValidator.extend({
classNames: ["similar-topics-validator"],
similarTopics: null,
hasInput: notEmpty("field.value"),
hasSimilarTopics: notEmpty("similarTopics"),
hasNotSearched: equal("similarTopics", null),
noSimilarTopics: computed("similarTopics", function () {
return this.similarTopics !== null && this.similarTopics.length === 0;
}),
showSimilarTopics: computed("typing", "hasSimilarTopics", function () {
return this.hasSimilarTopics && !this.typing;
}),
showNoSimilarTopics: computed("typing", "noSimilarTopics", function () {
return this.noSimilarTopics && !this.typing;
}),
hasValidationCategories: notEmpty("validationCategories"),
insufficientCharacters: computed("typing", "field.value", function () {
return this.hasInput && this.field.value.length < 5 && !this.typing;
}),
insufficientCharactersCategories: and(
"insufficientCharacters",
"hasValidationCategories"
),
@discourseComputed("validation.categories")
validationCategories(categoryIds) {
if (categoryIds) {
return categoryIds.map((id) => this.site.categoriesById[id]);
}
return A();
},
@discourseComputed("validationCategories")
catLinks(categories) {
return categories.map((category) => categoryBadgeHTML(category)).join("");
},
@discourseComputed(
"loading",
"showSimilarTopics",
"showNoSimilarTopics",
"insufficientCharacters",
"insufficientCharactersCategories"
)
currentState(
loading,
showSimilarTopics,
showNoSimilarTopics,
insufficientCharacters,
insufficientCharactersCategories
) {
switch (true) {
case loading:
return "loading";
case showSimilarTopics:
return "results";
case showNoSimilarTopics:
return "no_results";
case insufficientCharactersCategories:
return "insufficient_characters_categories";
case insufficientCharacters:
return "insufficient_characters";
default:
return false;
}
},
@discourseComputed("currentState")
currentStateClass(currentState) {
if (currentState) {
return `similar-topics-${dasherize(currentState)}`;
}
return "similar-topics";
},
@discourseComputed("currentState")
currentStateKey(currentState) {
if (currentState) {
return `realtime_validations.similar_topics.${currentState}`;
}
return false;
},
validate() {},
@observes("field.value")
customValidate() {
const field = this.field;
if (!field.value) {
this.set("similarTopics", null);
return;
}
const value = field.value;
this.set("typing", true);
const lastKeyUp = new Date();
this._lastKeyUp = lastKeyUp;
// One second from now, check to see if the last key was hit when
// we recorded it. If it was, the user paused typing.
cancel(this._lastKeyTimeout);
this._lastKeyTimeout = later(() => {
if (lastKeyUp !== this._lastKeyUp) {
return;
}
this.set("typing", false);
if (value && value.length < 5) {
this.set("similarTopics", null);
return;
}
this.updateSimilarTopics();
}, 1000);
},
updateSimilarTopics() {
this.set("similarTopics", null);
this.set("updating", true);
this.backendValidate({
title: this.get("field.value"),
categories: this.get("validation.categories"),
time_unit: this.get("validation.time_unit"),
time_n_value: this.get("validation.time_n_value"),
})
.then((result) => {
const similarTopics = A(
deepMerge(result["topics"], result["similar_topics"])
);
similarTopics.forEach(function (topic, index) {
similarTopics[index] = EmberObject.create(topic);
});
this.set("similarTopics", similarTopics);
})
.finally(() => this.set("updating", false));
},
actions: {
closeMessage() {
this.set("showMessage", false);
},
},
});

Datei anzeigen

@ -1,17 +1,15 @@
import Component from "@ember/component"; import Component from "@ember/component";
import { equal } from "@ember/object/computed"; import { equal } from "@ember/object/computed";
import { ajax } from "discourse/lib/ajax"; import { ajax, getToken } from "discourse/lib/ajax";
import { getToken } from "wizard/lib/ajax";
export default Component.extend({ export default Component.extend({
classNames: ['validator'], classNames: ["validator"],
classNameBindings: ["isValid", "isInvalid"], classNameBindings: ["isValid", "isInvalid"],
validMessageKey: null, validMessageKey: null,
invalidMessageKey: null, invalidMessageKey: null,
isValid: null, isValid: null,
isInvalid: equal("isValid", false), isInvalid: equal("isValid", false),
layoutName: "components/validator", // useful for sharing the template with extending components
init() { init() {
this._super(...arguments); this._super(...arguments);

Datei anzeigen

@ -1,19 +0,0 @@
import { default as discourseComputed } from 'discourse-common/utils/decorators';
import Component from '@ember/component';
export default Component.extend({
classNames: 'wizard-advanced-toggle',
@discourseComputed('showAdvanced')
toggleClass(showAdvanced) {
let classes = 'btn'
if (showAdvanced) classes += ' btn-primary';
return classes;
},
actions: {
toggleAdvanced() {
this.toggleProperty('showAdvanced');
}
}
})

Datei anzeigen

@ -1,89 +1,104 @@
import { default as discourseComputed } from 'discourse-common/utils/decorators'; import { default as discourseComputed } from "discourse-common/utils/decorators";
import { equal, empty, or, and } from "@ember/object/computed"; import { empty, equal, or } from "@ember/object/computed";
import { generateName, selectKitContent } from '../lib/wizard'; import { notificationLevels, selectKitContent } from "../lib/wizard";
import { computed } from "@ember/object"; import { computed } from "@ember/object";
import wizardSchema from '../lib/wizard-schema'; import UndoChanges from "../mixins/undo-changes";
import UndoChanges from '../mixins/undo-changes';
import Component from "@ember/component"; import Component from "@ember/component";
import { notificationLevels } from '../lib/wizard';
import I18n from "I18n"; import I18n from "I18n";
export default Component.extend(UndoChanges, { export default Component.extend(UndoChanges, {
componentType: 'action', componentType: "action",
classNameBindings: [':wizard-custom-action', 'visible'], classNameBindings: [":wizard-custom-action", "visible"],
visible: computed('currentActionId', function() { return this.action.id === this.currentActionId }), visible: computed("currentActionId", function () {
createTopic: equal('action.type', 'create_topic'), return this.action.id === this.currentActionId;
updateProfile: equal('action.type', 'update_profile'), }),
watchCategories: equal('action.type', 'watch_categories'), createTopic: equal("action.type", "create_topic"),
sendMessage: equal('action.type', 'send_message'), updateProfile: equal("action.type", "update_profile"),
openComposer: equal('action.type', 'open_composer'), watchCategories: equal("action.type", "watch_categories"),
sendToApi: equal('action.type', 'send_to_api'), watchTags: equal("action.type", "watch_tags"),
addToGroup: equal('action.type', 'add_to_group'), sendMessage: equal("action.type", "send_message"),
routeTo: equal('action.type', 'route_to'), openComposer: equal("action.type", "open_composer"),
createCategory: equal('action.type', 'create_category'), sendToApi: equal("action.type", "send_to_api"),
createGroup: equal('action.type', 'create_group'), addToGroup: equal("action.type", "add_to_group"),
apiEmpty: empty('action.api'), routeTo: equal("action.type", "route_to"),
groupPropertyTypes: selectKitContent(['id', 'name']), createCategory: equal("action.type", "create_category"),
hasAdvanced: or('hasCustomFields', 'routeTo'), createGroup: equal("action.type", "create_group"),
showAdvanced: and('hasAdvanced', 'action.type'), apiEmpty: empty("action.api"),
hasCustomFields: or('basicTopicFields', 'updateProfile', 'createGroup', 'createCategory'), groupPropertyTypes: selectKitContent(["id", "name"]),
basicTopicFields: or('createTopic', 'sendMessage', 'openComposer'), hasCustomFields: or(
publicTopicFields: or('createTopic', 'openComposer'), "basicTopicFields",
showPostAdvanced: or('createTopic', 'sendMessage'), "updateProfile",
actionTypes: Object.keys(wizardSchema.action.types).map(type => { "createGroup",
"createCategory"
),
basicTopicFields: or("createTopic", "sendMessage", "openComposer"),
publicTopicFields: or("createTopic", "openComposer"),
showPostAdvanced: or("createTopic", "sendMessage"),
availableNotificationLevels: notificationLevels.map((type) => {
return { return {
id: type, id: type,
name: I18n.t(`admin.wizard.action.${type}.label`) name: I18n.t(`admin.wizard.action.watch_x.notification_level.${type}`),
}; };
}), }),
availableNotificationLevels: notificationLevels.map((type, index) => {
return { messageUrl: "https://discourse.pluginmanager.org/t/action-settings",
id: type,
name: I18n.t(`admin.wizard.action.watch_categories.notification_level.${type}`) @discourseComputed("action.type")
};
}),
messageUrl: 'https://thepavilion.io/t/2810',
@discourseComputed('action.type')
messageKey(type) { messageKey(type) {
let key = 'type'; let key = "type";
if (type) { if (type) {
key = 'edit'; key = "edit";
} }
return key; return key;
}, },
@discourseComputed('wizard.steps') @discourseComputed("action.type")
customFieldsContext(type) {
return `action.${type}`;
},
@discourseComputed("wizard.steps")
runAfterContent(steps) { runAfterContent(steps) {
let content = steps.map(function(step) { let content = steps.map(function (step) {
return { return {
id: step.id, id: step.id,
name: step.title || step.id name: step.title || step.id,
}; };
}); });
content.unshift({ content.unshift({
id: 'wizard_completion', id: "wizard_completion",
name: I18n.t('admin.wizard.action.run_after.wizard_completion') name: I18n.t("admin.wizard.action.run_after.wizard_completion"),
}); });
return content; return content;
}, },
@discourseComputed('apis') @discourseComputed("apis")
availableApis(apis) { availableApis(apis) {
return apis.map(a => { return apis.map((a) => {
return { return {
id: a.name, id: a.name,
name: a.title name: a.title,
}; };
}); });
}, },
@discourseComputed('apis', 'action.api') @discourseComputed("apis", "action.api")
availableEndpoints(apis, api) { availableEndpoints(apis, api) {
if (!api) return []; if (!api) {
return apis.find(a => a.name === api).endpoints; return [];
} }
return apis.find((a) => a.name === api).endpoints;
},
@discourseComputed("fieldTypes")
hasEventField(fieldTypes) {
return fieldTypes.map((ft) => ft.id).includes("event");
},
@discourseComputed("fieldTypes")
hasLocationField(fieldTypes) {
return fieldTypes.map((ft) => ft.id).includes("location");
},
}); });

Datei anzeigen

@ -1,117 +1,159 @@
import { default as discourseComputed } from 'discourse-common/utils/decorators'; import { default as discourseComputed } from "discourse-common/utils/decorators";
import { equal, or, alias } from "@ember/object/computed"; import { equal, or } from "@ember/object/computed";
import { computed } from "@ember/object"; import { computed } from "@ember/object";
import { selectKitContent } from '../lib/wizard'; import { selectKitContent } from "../lib/wizard";
import UndoChanges from '../mixins/undo-changes'; import UndoChanges from "../mixins/undo-changes";
import Component from "@ember/component"; import Component from "@ember/component";
import wizardSchema from '../lib/wizard-schema'; import wizardSchema from "../lib/wizard-schema";
export default Component.extend(UndoChanges, { export default Component.extend(UndoChanges, {
componentType: 'field', componentType: "field",
classNameBindings: [':wizard-custom-field', 'visible'], classNameBindings: [":wizard-custom-field", "visible"],
visible: computed('currentFieldId', function() { return this.field.id === this.currentFieldId }), visible: computed("currentFieldId", function () {
isDropdown: equal('field.type', 'dropdown'), return this.field.id === this.currentFieldId;
isUpload: equal('field.type', 'upload'), }),
isCategory: equal('field.type', 'category'), isDropdown: equal("field.type", "dropdown"),
isGroup: equal('field.type', 'group'), isUpload: equal("field.type", "upload"),
isTag: equal('field.type', 'tag'), isCategory: equal("field.type", "category"),
isText: equal('field.type', 'text'), isGroup: equal("field.type", "group"),
isTextarea: equal('field.type', 'textarea'), isTag: equal("field.type", "tag"),
isUrl: equal('field.type', 'url'), isText: equal("field.type", "text"),
isComposer: equal('field.type', 'composer'), isTextarea: equal("field.type", "textarea"),
showPrefill: or('isText', 'isCategory', 'isTag', 'isGroup', 'isDropdown'), isUrl: equal("field.type", "url"),
showContent: or('isCategory', 'isTag', 'isGroup', 'isDropdown'), isComposer: equal("field.type", "composer"),
showLimit: or('isCategory', 'isTag'), showPrefill: or("isText", "isCategory", "isTag", "isGroup", "isDropdown"),
isTextType: or('isText', 'isTextarea', 'isComposer'), showContent: or("isCategory", "isTag", "isGroup", "isDropdown"),
categoryPropertyTypes: selectKitContent(['id', 'slug']), showLimit: or("isCategory", "isTag"),
showAdvanced: alias('field.type'), isTextType: or("isText", "isTextarea", "isComposer"),
messageUrl: 'https://thepavilion.io/t/2809', isComposerPreview: equal("field.type", "composer_preview"),
categoryPropertyTypes: selectKitContent(["id", "slug"]),
@discourseComputed('field.type') messageUrl: "https://discourse.pluginmanager.org/t/field-settings",
@discourseComputed("field.type")
validations(type) { validations(type) {
const applicableToField = []; const applicableToField = [];
for(let validation in wizardSchema.field.validations) { for (let validation in wizardSchema.field.validations) {
if ((wizardSchema.field.validations[validation]["types"]).includes(type)) { if (wizardSchema.field.validations[validation]["types"].includes(type)) {
applicableToField.push(validation) applicableToField.push(validation);
} }
} }
return applicableToField; return applicableToField;
}, },
@discourseComputed('field.type') @discourseComputed("field.type")
isDateTime(type) { isDateTime(type) {
return ['date_time', 'date', 'time'].indexOf(type) > -1; return ["date_time", "date", "time"].indexOf(type) > -1;
}, },
@discourseComputed('field.type') @discourseComputed("field.type")
messageKey(type) { messageKey(type) {
let key = 'type'; let key = "type";
if (type) { if (type) {
key = 'edit'; key = "edit";
} }
return key; return key;
}, },
setupTypeOutput(fieldType, options) { setupTypeOutput(fieldType, options) {
const selectionType = { const selectionType = {
category: 'category', category: "category",
tag: 'tag', tag: "tag",
group: 'group' group: "group",
}[fieldType]; }[fieldType];
if (selectionType) { if (selectionType) {
options[`${selectionType}Selection`] = 'output'; options[`${selectionType}Selection`] = "output";
options.outputDefaultSelection = selectionType; options.outputDefaultSelection = selectionType;
} }
return options; return options;
}, },
@discourseComputed('field.type') @discourseComputed("field.type")
contentOptions(fieldType) { contentOptions(fieldType) {
let options = { let options = {
wizardFieldSelection: true, wizardFieldSelection: true,
textSelection: 'key,value', textSelection: "key,value",
userFieldSelection: 'key,value', userFieldSelection: "key,value",
context: 'field' context: "field",
} };
options = this.setupTypeOutput(fieldType, options); options = this.setupTypeOutput(fieldType, options);
if (this.isDropdown) { if (this.isDropdown) {
options.wizardFieldSelection = 'key,value'; options.wizardFieldSelection = "key,value";
options.userFieldOptionsSelection = 'output'; options.userFieldOptionsSelection = "output";
options.textSelection = 'key,value,output'; options.textSelection = "key,value";
options.inputTypes = 'conditional,association,assignment'; options.inputTypes = "association,conditional,assignment";
options.pairConnector = 'association'; options.pairConnector = "association";
options.keyPlaceholder = 'admin.wizard.key'; options.keyPlaceholder = "admin.wizard.key";
options.valuePlaceholder = 'admin.wizard.value'; options.valuePlaceholder = "admin.wizard.value";
} }
return options; return options;
}, },
@discourseComputed('field.type') @discourseComputed("field.type")
prefillOptions(fieldType) { prefillOptions(fieldType) {
let options = { let options = {
wizardFieldSelection: true, wizardFieldSelection: true,
textSelection: true, textSelection: true,
userFieldSelection: 'key,value', userFieldSelection: "key,value",
context: 'field' context: "field",
} };
return this.setupTypeOutput(fieldType, options); return this.setupTypeOutput(fieldType, options);
}, },
actions: { @discourseComputed("step.index")
imageUploadDone(upload) { fieldConditionOptions(stepIndex) {
this.set("field.image", upload.url); const options = {
}, inputTypes: "validation",
context: "field",
imageUploadDeleted() { textSelection: "value",
this.set("field.image", null); userFieldSelection: true,
groupSelection: true,
};
if (stepIndex > 0) {
options.wizardFieldSelection = true;
options.wizardActionSelection = true;
} }
}
return options;
},
@discourseComputed("step.index")
fieldIndexOptions(stepIndex) {
const options = {
context: "field",
userFieldSelection: true,
groupSelection: true,
};
if (stepIndex > 0) {
options.wizardFieldSelection = true;
options.wizardActionSelection = true;
}
return options;
},
actions: {
imageUploadDone(upload) {
this.setProperties({
"field.image": upload.url,
"field.image_upload_id": upload.id,
});
},
imageUploadDeleted() {
this.setProperties({
"field.image": null,
"field.image_upload_id": null,
});
},
},
}); });

Datei anzeigen

@ -1,16 +1,40 @@
import Component from "@ember/component"; import Component from "@ember/component";
import { default as discourseComputed } from 'discourse-common/utils/decorators'; import discourseComputed from "discourse-common/utils/decorators";
export default Component.extend({ export default Component.extend({
classNames: 'wizard-custom-step', classNames: "wizard-custom-step",
@discourseComputed("step.index")
stepConditionOptions(stepIndex) {
const options = {
inputTypes: "validation",
context: "step",
textSelection: "value",
userFieldSelection: true,
groupSelection: true,
};
if (stepIndex > 0) {
options["wizardFieldSelection"] = true;
options["wizardActionSelection"] = true;
}
return options;
},
actions: { actions: {
bannerUploadDone(upload) { bannerUploadDone(upload) {
this.set("step.banner", upload.url); this.setProperties({
"step.banner": upload.url,
"step.banner_upload_id": upload.id,
});
}, },
bannerUploadDeleted() { bannerUploadDeleted() {
this.set("step.banner", null); this.setProperties({
} "step.banner": null,
} "step.banner_upload_id": null,
});
},
},
}); });

Datei anzeigen

@ -1,136 +1,150 @@
import { default as discourseComputed, on, observes } from 'discourse-common/utils/decorators'; import discourseComputed from "discourse-common/utils/decorators";
import { generateName } from '../lib/wizard'; import { generateName } from "../lib/wizard";
import { default as wizardSchema, setWizardDefaults } from '../lib/wizard-schema'; import {
setWizardDefaults,
default as wizardSchema,
} from "../lib/wizard-schema";
import { notEmpty } from "@ember/object/computed"; import { notEmpty } from "@ember/object/computed";
import { scheduleOnce, bind } from "@ember/runloop";
import EmberObject from "@ember/object"; import EmberObject from "@ember/object";
import Component from "@ember/component"; import Component from "@ember/component";
import { A } from "@ember/array"; import { A } from "@ember/array";
export default Component.extend({ export default Component.extend({
classNameBindings: [':wizard-links', 'itemType'], classNameBindings: [":wizard-links", "itemType"],
items: A(), items: A(),
anyLinks: notEmpty('links'), anyLinks: notEmpty("links"),
@on('didInsertElement')
@observes('links.[]')
setupSortable() {
scheduleOnce('afterRender', () => (this.applySortable()));
},
applySortable() {
$(this.element).find(".link-list")
.sortable({ tolerance: 'pointer' })
.on('sortupdate', (e, ui) => {
this.updateItemOrder(ui.item.data('id'), ui.item.index());
});
},
updateItemOrder(itemId, newIndex) { updateItemOrder(itemId, newIndex) {
const items = this.items; const items = this.items;
const item = items.findBy('id', itemId); const item = items.findBy("id", itemId);
items.removeObject(item); items.removeObject(item);
item.set("index", newIndex);
items.insertAt(newIndex, item); items.insertAt(newIndex, item);
scheduleOnce('afterRender', this, () => this.applySortable());
}, },
@discourseComputed('itemType') @discourseComputed("itemType")
header: (itemType) => `admin.wizard.${itemType}.header`, header: (itemType) => `admin.wizard.${itemType}.header`,
@discourseComputed('current', 'items.@each.id', 'items.@each.type', 'items.@each.label', 'items.@each.title') @discourseComputed(
"current",
"items.@each.id",
"items.@each.type",
"items.@each.label",
"items.@each.title"
)
links(current, items) { links(current, items) {
if (!items) return; if (!items) {
return;
}
return items.map((item) => { return items.map((item, index) => {
if (item) { if (item) {
let link = { let link = {
id: item.id id: item.id,
} };
let label = item.label || item.title || item.id; let label = item.label || item.title || item.id;
if (this.generateLabels && item.type) { if (this.generateLabels && item.type) {
label = generateName(item.type); label = generateName(item.type);
} }
link.label = `${label} (${item.id})`; link.label = `${label} (${item.id})`;
let classes = 'btn'; let classes = "btn";
if (current && item.id === current.id) { if (current && item.id === current.id) {
classes += ' btn-primary'; classes += " btn-primary";
}; }
link.classes = classes; link.classes = classes;
link.index = index;
if (index === 0) {
link.first = true;
}
if (index === items.length - 1) {
link.last = true;
}
return link; return link;
} }
}); });
}, },
getNextIndex() {
const items = this.items;
if (!items || items.length === 0) {
return 0;
}
const numbers = items
.map((i) => Number(i.id.split("_").pop()))
.sort((a, b) => a - b);
return numbers[numbers.length - 1];
},
actions: { actions: {
add() { add() {
const items = this.get('items'); const items = this.get("items");
const itemType = this.itemType; const itemType = this.itemType;
let params = setWizardDefaults({}, itemType); let params = setWizardDefaults({}, itemType);
params.isNew = true; params.isNew = true;
params.index = this.getNextIndex();
let next = 1;
let id = `${itemType}_${params.index + 1}`;
if (items.length) { if (itemType === "field") {
next = Math.max.apply(Math, items.map((i) => {
let parts = i.id.split('_');
let lastPart = parts[parts.length - 1];
return isNaN(lastPart) ? 0 : lastPart;
})) + 1;
}
let id = `${itemType}_${next}`;
if (itemType === 'field') {
id = `${this.parentId}_${id}`; id = `${this.parentId}_${id}`;
} }
params.id = id; params.id = id;
let objectArrays = wizardSchema[itemType].objectArrays; let objectArrays = wizardSchema[itemType].objectArrays;
if (objectArrays) { if (objectArrays) {
Object.keys(objectArrays).forEach(objectType => { Object.keys(objectArrays).forEach((objectType) => {
params[objectArrays[objectType].property] = A(); params[objectArrays[objectType].property] = A();
}); });
}; }
const newItem = EmberObject.create(params); const newItem = EmberObject.create(params);
items.pushObject(newItem); items.pushObject(newItem);
this.set('current', newItem); this.set("current", newItem);
},
back(item) {
this.updateItemOrder(item.id, item.index - 1);
},
forward(item) {
this.updateItemOrder(item.id, item.index + 1);
}, },
change(itemId) { change(itemId) {
this.set('current', this.items.findBy('id', itemId)); this.set("current", this.items.findBy("id", itemId));
}, },
remove(itemId) { remove(itemId) {
const items = this.items; const items = this.items;
let item; let item;
let index; let index;
items.forEach((it, ind) => { items.forEach((it, ind) => {
if (it.id === itemId) { if (it.id === itemId) {
item = it; item = it;
index = ind; index = ind;
} }
}); });
let nextIndex; let nextIndex;
if (this.current.id === itemId) { if (this.current.id === itemId) {
nextIndex = index < (items.length-2) ? (index+1) : (index-1); nextIndex = index < items.length - 2 ? index + 1 : index - 1;
} }
items.removeObject(item); items.removeObject(item);
if (nextIndex) { if (nextIndex) {
this.set('current', items[nextIndex]); this.set("current", items[nextIndex]);
} }
} },
} },
}); });

Datei anzeigen

@ -1,35 +1,38 @@
import Component from "@ember/component"; import Component from "@ember/component";
import { gt } from '@ember/object/computed'; import { gt } from "@ember/object/computed";
import { computed } from "@ember/object"; import { computed } from "@ember/object";
import { defaultConnector } from '../lib/wizard-mapper'; import { defaultConnector } from "../lib/wizard-mapper";
import { later } from "@ember/runloop"; import { later } from "@ember/runloop";
import { observes } from "discourse-common/utils/decorators";
import I18n from "I18n"; import I18n from "I18n";
export default Component.extend({ export default Component.extend({
classNameBindings: [':mapper-connector', ':mapper-block', 'hasMultiple::single'], classNameBindings: [
hasMultiple: gt('connectors.length', 1), ":mapper-connector",
connectorLabel: computed(function() { ":mapper-block",
"hasMultiple::single",
],
hasMultiple: gt("connectors.length", 1),
connectorLabel: computed(function () {
let key = this.connector; let key = this.connector;
let path = this.inputTypes ? `input.${key}.name` : `connector.${key}`; let path = this.inputTypes ? `input.${key}.name` : `connector.${key}`;
return I18n.t(`admin.wizard.${path}`); return I18n.t(`admin.wizard.${path}`);
}), }),
didReceiveAttrs() { didReceiveAttrs() {
if (!this.connector) { if (!this.connector) {
later(() => { later(() => {
this.set( this.set(
'connector', "connector",
defaultConnector(this.connectorType, this.inputType, this.options) defaultConnector(this.connectorType, this.inputType, this.options)
); );
}); });
} }
}, },
actions: { actions: {
changeConnector(value) { changeConnector(value) {
this.set('connector', value); this.set("connector", value);
this.onUpdate('connector', this.connectorType); this.onUpdate("connector", this.connectorType);
} },
} },
}); });

Datei anzeigen

@ -1,69 +1,78 @@
import { computed, set } from "@ember/object"; import { computed, set } from "@ember/object";
import { alias, equal, or, not } from "@ember/object/computed"; import { alias, equal, not, or } from "@ember/object/computed";
import { newPair, connectorContent, inputTypesContent, defaultSelectionType, defaultConnector } from '../lib/wizard-mapper'; import {
connectorContent,
defaultConnector,
defaultSelectionType,
inputTypesContent,
newPair,
} from "../lib/wizard-mapper";
import Component from "@ember/component"; import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators"; import { observes } from "discourse-common/utils/decorators";
import { A } from "@ember/array"; import { A } from "@ember/array";
export default Component.extend({ export default Component.extend({
classNameBindings: [':mapper-input', 'inputType'], classNameBindings: [":mapper-input", "inputType"],
inputType: alias('input.type'), inputType: alias("input.type"),
isConditional: equal('inputType', 'conditional'), isConditional: equal("inputType", "conditional"),
isAssignment: equal('inputType', 'assignment'), isAssignment: equal("inputType", "assignment"),
isAssociation: equal('inputType', 'association'), isAssociation: equal("inputType", "association"),
isValidation: equal('inputType', 'validation'), isValidation: equal("inputType", "validation"),
hasOutput: or('isConditional', 'isAssignment'), hasOutput: or("isConditional", "isAssignment"),
hasPairs: or('isConditional', 'isAssociation', 'isValidation'), hasPairs: or("isConditional", "isAssociation", "isValidation"),
canAddPair: not('isAssignment'), canAddPair: not("isAssignment"),
connectors: computed(function() { return connectorContent('output', this.input.type, this.options) }), connectors: computed(function () {
inputTypes: computed(function() { return inputTypesContent(this.options) }), return connectorContent("output", this.input.type, this.options);
}),
@observes('input.type') inputTypes: computed(function () {
return inputTypesContent(this.options);
}),
@observes("input.type")
setupType() { setupType() {
if (this.hasPairs && (!this.input.pairs || this.input.pairs.length < 1)) { if (this.hasPairs && (!this.input.pairs || this.input.pairs.length < 1)) {
this.send('addPair'); this.send("addPair");
} }
if (this.hasOutput) { if (this.hasOutput) {
this.set('input.output', null); this.set("input.output", null);
if (!this.input.outputConnector) { if (!this.input.outputConnector) {
const options = this.options; const options = this.options;
this.set('input.output_type', defaultSelectionType('output', options)); this.set("input.output_type", defaultSelectionType("output", options));
this.set('input.output_connector', defaultConnector('output', this.inputType, options)); this.set(
"input.output_connector",
defaultConnector("output", this.inputType, options)
);
} }
} }
}, },
actions: { actions: {
addPair() { addPair() {
if (!this.input.pairs) { if (!this.input.pairs) {
this.set('input.pairs', A()); this.set("input.pairs", A());
} }
const pairs = this.input.pairs; const pairs = this.input.pairs;
const pairCount = pairs.length + 1; const pairCount = pairs.length + 1;
pairs.forEach(p => (set(p, 'pairCount', pairCount))); pairs.forEach((p) => set(p, "pairCount", pairCount));
pairs.pushObject( pairs.pushObject(
newPair( newPair(
this.input.type, this.input.type,
Object.assign( Object.assign({}, this.options, { index: pairs.length, pairCount })
{},
this.options,
{ index: pairs.length, pairCount }
)
) )
); );
}, },
removePair(pair) { removePair(pair) {
const pairs = this.input.pairs; const pairs = this.input.pairs;
const pairCount = pairs.length - 1; const pairCount = pairs.length - 1;
pairs.forEach(p => (set(p, 'pairCount', pairCount))); pairs.forEach((p) => set(p, "pairCount", pairCount));
pairs.removeObject(pair); pairs.removeObject(pair);
} },
} },
}); });

Datei anzeigen

@ -1,12 +1,16 @@
import { connectorContent } from '../lib/wizard-mapper'; import { connectorContent } from "../lib/wizard-mapper";
import { gt, or, alias } from "@ember/object/computed"; import { alias, gt } from "@ember/object/computed";
import { computed, observes } from "@ember/object"; import { computed } from "@ember/object";
import Component from "@ember/component"; import Component from "@ember/component";
export default Component.extend({ export default Component.extend({
classNameBindings: [':mapper-pair', 'hasConnector::no-connector'], classNameBindings: [":mapper-pair", "hasConnector::no-connector"],
firstPair: gt('pair.index', 0), firstPair: gt("pair.index", 0),
showRemove: alias('firstPair'), showRemove: alias("firstPair"),
showJoin: computed('pair.pairCount', function() { return this.pair.index < (this.pair.pairCount - 1) }), showJoin: computed("pair.pairCount", function () {
connectors: computed(function() { return connectorContent('pair', this.inputType, this.options) }) return this.pair.index < this.pair.pairCount - 1;
}); }),
connectors: computed(function () {
return connectorContent("pair", this.inputType, this.options);
}),
});

Datei anzeigen

@ -1,14 +1,16 @@
import discourseComputed from 'discourse-common/utils/decorators'; import discourseComputed from "discourse-common/utils/decorators";
import Component from "@ember/component"; import Component from "@ember/component";
export default Component.extend({ export default Component.extend({
tagName: 'a', tagName: "a",
classNameBindings: ['active'], classNameBindings: ["active"],
@discourseComputed('item.type', 'activeType') @discourseComputed("item.type", "activeType")
active(type, activeType) { return type === activeType }, active(type, activeType) {
return type === activeType;
},
click() { click() {
this.toggle(this.item.type) this.toggle(this.item.type);
} },
}) });

Datei anzeigen

@ -1,51 +1,179 @@
import { alias, or, gt } from "@ember/object/computed"; import { alias, gt, or } from "@ember/object/computed";
import { computed } from "@ember/object"; import { computed } from "@ember/object";
import { default as discourseComputed, observes, on } from "discourse-common/utils/decorators"; import {
import { getOwner } from 'discourse-common/lib/get-owner'; default as discourseComputed,
import { defaultSelectionType, selectionTypes } from '../lib/wizard-mapper'; observes,
import { snakeCase, generateName, userProperties } from '../lib/wizard'; } from "discourse-common/utils/decorators";
import { getOwner } from "discourse-common/lib/get-owner";
import { defaultSelectionType, selectionTypes } from "../lib/wizard-mapper";
import {
generateName,
sentenceCase,
snakeCase,
userProperties,
} from "../lib/wizard";
import Component from "@ember/component"; import Component from "@ember/component";
import { bind, later } from "@ember/runloop"; import { bind, later } from "@ember/runloop";
import I18n from "I18n"; import I18n from "I18n";
import Subscription from "../mixins/subscription";
export default Component.extend({ const customFieldActionMap = {
classNameBindings: [':mapper-selector', 'activeType'], topic: ["create_topic", "send_message"],
post: ["create_topic", "send_message"],
showText: computed('activeType', function() { return this.showInput('text') }), category: ["create_category"],
showWizardField: computed('activeType', function() { return this.showInput('wizardField') }), group: ["create_group"],
showWizardAction: computed('activeType', function() { return this.showInput('wizardAction') }), user: ["update_profile"],
showUserField: computed('activeType', function() { return this.showInput('userField') }), };
showUserFieldOptions: computed('activeType', function() { return this.showInput('userFieldOptions') }),
showCategory: computed('activeType', function() { return this.showInput('category') }), const values = ["present", "true", "false"];
showTag: computed('activeType', function() { return this.showInput('tag') }),
showGroup: computed('activeType', function() { return this.showInput('group') }), export default Component.extend(Subscription, {
showUser: computed('activeType', function() { return this.showInput('user') }), classNameBindings: [":mapper-selector", "activeType"],
showList: computed('activeType', function() { return this.showInput('list') }),
showCustomField: computed('activeType', function() { return this.showInput('customField') }), showText: computed("activeType", function () {
textEnabled: computed('options.textSelection', 'inputType', function() { return this.optionEnabled('textSelection') }), return this.showInput("text");
wizardFieldEnabled: computed('options.wizardFieldSelection', 'inputType', function() { return this.optionEnabled('wizardFieldSelection') }), }),
wizardActionEnabled: computed('options.wizardActionSelection', 'inputType', function() { return this.optionEnabled('wizardActionSelection') }), showWizardField: computed("activeType", function () {
customFieldEnabled: computed('options.customFieldSelection', 'inputType', function() { return this.optionEnabled('customFieldSelection') }), return this.showInput("wizardField");
userFieldEnabled: computed('options.userFieldSelection', 'inputType', function() { return this.optionEnabled('userFieldSelection') }), }),
userFieldOptionsEnabled: computed('options.userFieldOptionsSelection', 'inputType', function() { return this.optionEnabled('userFieldOptionsSelection') }), showWizardAction: computed("activeType", function () {
categoryEnabled: computed('options.categorySelection', 'inputType', function() { return this.optionEnabled('categorySelection') }), return this.showInput("wizardAction");
tagEnabled: computed('options.tagSelection', 'inputType', function() { return this.optionEnabled('tagSelection') }), }),
groupEnabled: computed('options.groupSelection', 'inputType', function() { return this.optionEnabled('groupSelection') }), showUserField: computed("activeType", function () {
userEnabled: computed('options.userSelection', 'inputType', function() { return this.optionEnabled('userSelection') }), return this.showInput("userField");
listEnabled: computed('options.listSelection', 'inputType', function() { return this.optionEnabled('listSelection') }), }),
showUserFieldOptions: computed("activeType", function () {
groups: alias('site.groups'), return this.showInput("userFieldOptions");
categories: alias('site.categories'), }),
showComboBox: or('showWizardField', 'showWizardAction', 'showUserField', 'showUserFieldOptions', 'showCustomField'), showCategory: computed("activeType", function () {
showMultiSelect: or('showCategory', 'showGroup'), return this.showInput("category");
hasTypes: gt('selectorTypes.length', 1), }),
showTag: computed("activeType", function () {
return this.showInput("tag");
}),
showGroup: computed("activeType", function () {
return this.showInput("group");
}),
showUser: computed("activeType", function () {
return this.showInput("user");
}),
showList: computed("activeType", function () {
return this.showInput("list");
}),
showCustomField: computed("activeType", function () {
return this.showInput("customField");
}),
showValue: computed("activeType", function () {
return this.showInput("value");
}),
textEnabled: computed("options.textSelection", "inputType", function () {
return this.optionEnabled("textSelection");
}),
wizardFieldEnabled: computed(
"options.wizardFieldSelection",
"inputType",
function () {
return this.optionEnabled("wizardFieldSelection");
}
),
wizardActionEnabled: computed(
"options.wizardActionSelection",
"inputType",
function () {
return this.optionEnabled("wizardActionSelection");
}
),
customFieldEnabled: computed(
"options.customFieldSelection",
"inputType",
function () {
return this.optionEnabled("customFieldSelection");
}
),
userFieldEnabled: computed(
"options.userFieldSelection",
"inputType",
function () {
return this.optionEnabled("userFieldSelection");
}
),
userFieldOptionsEnabled: computed(
"options.userFieldOptionsSelection",
"inputType",
function () {
return this.optionEnabled("userFieldOptionsSelection");
}
),
categoryEnabled: computed(
"options.categorySelection",
"inputType",
function () {
return this.optionEnabled("categorySelection");
}
),
tagEnabled: computed("options.tagSelection", "inputType", function () {
return this.optionEnabled("tagSelection");
}),
groupEnabled: computed("options.groupSelection", "inputType", function () {
return this.optionEnabled("groupSelection");
}),
guestGroup: computed("options.guestGroup", "inputType", function () {
return this.optionEnabled("guestGroup");
}),
userEnabled: computed("options.userSelection", "inputType", function () {
return this.optionEnabled("userSelection");
}),
listEnabled: computed("options.listSelection", "inputType", function () {
return this.optionEnabled("listSelection");
}),
valueEnabled: computed("connector", function () {
return this.connector === "is";
}),
@discourseComputed("site.groups", "guestGroup", "subscriptionType")
groups(groups, guestGroup, subscriptionType) {
let result = groups;
if (!guestGroup) {
return result;
}
if (["standard", "business"].includes(subscriptionType)) {
let guestIndex;
result.forEach((r, index) => {
if (r.id === 0) {
r.name = I18n.t("admin.wizard.selector.label.users");
guestIndex = index;
}
});
result.splice(guestIndex, 0, {
id: -1,
name: I18n.t("admin.wizard.selector.label.guests"),
});
}
return result;
},
categories: alias("site.categories"),
showComboBox: or(
"showWizardField",
"showWizardAction",
"showUserField",
"showUserFieldOptions",
"showCustomField",
"showValue"
),
showMultiSelect: or("showCategory", "showGroup"),
hasTypes: gt("selectorTypes.length", 1),
showTypes: false, showTypes: false,
didInsertElement() { didInsertElement() {
if (!this.activeType || (this.activeType && !this[`${this.activeType}Enabled`])) { if (
!this.activeType ||
(this.activeType && !this[`${this.activeType}Enabled`])
) {
later(() => this.resetActiveType()); later(() => this.resetActiveType());
} }
$(document).on("click", bind(this, this.documentClick)); $(document).on("click", bind(this, this.documentClick));
}, },
@ -54,44 +182,49 @@ export default Component.extend({
}, },
documentClick(e) { documentClick(e) {
if (this._state == "destroying") return; if (this._state === "destroying") {
return;
}
let $target = $(e.target); let $target = $(e.target);
if (!$target.parents('.type-selector').length && this.showTypes) { if (!$target.parents(".type-selector").length && this.showTypes) {
this.set('showTypes', false); this.set("showTypes", false);
} }
}, },
@discourseComputed @discourseComputed("connector")
selectorTypes() { selectorTypes() {
return selectionTypes.filter(type => (this[`${type}Enabled`])) return selectionTypes
.map(type => ({ type, label: this.typeLabel(type) })); .filter((type) => this[`${type}Enabled`])
.map((type) => ({ type, label: this.typeLabel(type) }));
}, },
@discourseComputed('activeType') @discourseComputed("activeType")
activeTypeLabel(activeType) { activeTypeLabel(activeType) {
return this.typeLabel(activeType); return this.typeLabel(activeType);
}, },
typeLabel(type) { typeLabel(type) {
return type ? I18n.t(`admin.wizard.selector.label.${snakeCase(type)}`) : null; return type
? I18n.t(`admin.wizard.selector.label.${snakeCase(type)}`)
: null;
}, },
comboBoxAllowAny: or('showWizardField', 'showWizardAction'), comboBoxAllowAny: or("showWizardField", "showWizardAction"),
@discourseComputed @discourseComputed
showController() { showController() {
return getOwner(this).lookup('controller:admin-wizards-wizard-show'); return getOwner(this).lookup("controller:admin-wizards-wizard-show");
}, },
@discourseComputed( @discourseComputed(
'activeType', "activeType",
'showController.wizardFields.[]', "showController.wizardFields.[]",
'showController.wizard.actions.[]', "showController.wizard.actions.[]",
'showController.userFields.[]', "showController.userFields.[]",
'showController.currentField.id', "showController.currentField.id",
'showController.currentAction.id', "showController.currentAction.id",
'showController.customFields' "showController.customFields"
) )
comboBoxContent( comboBoxContent(
activeType, activeType,
@ -103,133 +236,175 @@ export default Component.extend({
customFields customFields
) { ) {
let content; let content;
let context;
if (activeType === 'wizardField') { let contextType;
if (this.options.context) {
let contextAttrs = this.options.context.split(".");
context = contextAttrs[0];
contextType = contextAttrs[1];
}
if (activeType === "wizardField") {
content = wizardFields; content = wizardFields;
if (this.options.context === 'field') { if (context === "field") {
content = content.filter(field => field.id !== currentFieldId); content = content.filter((field) => field.id !== currentFieldId);
} }
} }
if (activeType === 'wizardAction') { if (activeType === "wizardAction") {
content = wizardActions.map(a => ({ content = wizardActions.map((a) => ({
id: a.id, id: a.id,
label: `${generateName(a.type)} (${a.id})`, label: `${generateName(a.type)} (${a.id})`,
type: a.type type: a.type,
})); }));
if (this.options.context === 'action') { if (context === "action") {
content = content.filter(a => a.id !== currentActionId); content = content.filter((a) => a.id !== currentActionId);
} }
} }
if (activeType === 'userField') { if (activeType === "userField") {
content = userProperties.map((f) => ({ content = userProperties
id: f, .map((f) => ({
name: generateName(f) id: f,
})).concat((userFields || [])); name: generateName(f),
}))
if (this.options.context === 'action' && .concat(userFields || []);
this.inputType === 'association' &&
this.selectorType === 'key') { if (
context === "action" &&
const excludedFields = ['username','email', 'trust_level']; this.inputType === "association" &&
content = content.filter(userField => excludedFields.indexOf(userField.id) === -1); this.selectorType === "key"
) {
const excludedFields = ["username", "email", "trust_level"];
content = content.filter(
(userField) => excludedFields.indexOf(userField.id) === -1
);
} }
} }
if (activeType === 'userFieldOptions') { if (activeType === "userFieldOptions") {
content = userFields; content = userFields;
} }
if (activeType === 'customField') { if (activeType === "customField") {
content = customFields; content = customFields
.filter((f) => {
return (
f.type !== "json" &&
customFieldActionMap[f.klass].includes(contextType)
);
})
.map((f) => ({
id: f.name,
name: `${sentenceCase(f.klass)} ${f.name} (${f.type})`,
}));
} }
if (activeType === "value") {
content = values.map((value) => ({
id: value,
name: value,
}));
}
return content; return content;
}, },
@discourseComputed('activeType') @discourseComputed("activeType")
multiSelectContent(activeType) { multiSelectContent(activeType) {
return { return {
category: this.categories, category: this.categories,
group: this.groups, group: this.groups,
list: '' list: "",
}[activeType]; }[activeType];
}, },
@discourseComputed('activeType', 'inputType') @discourseComputed("activeType", "inputType")
placeholderKey(activeType, inputType) { placeholderKey(activeType) {
if (activeType === 'text' && this.options[`${this.selectorType}Placeholder`]) { if (
activeType === "text" &&
this.options[`${this.selectorType}Placeholder`]
) {
return this.options[`${this.selectorType}Placeholder`]; return this.options[`${this.selectorType}Placeholder`];
} else { } else {
return `admin.wizard.selector.placeholder.${snakeCase(activeType)}`; return `admin.wizard.selector.placeholder.${snakeCase(activeType)}`;
} }
}, },
@discourseComputed('activeType') @discourseComputed("activeType")
multiSelectOptions(activeType) { multiSelectOptions(activeType) {
let result = { let result = {
none: this.placeholderKey none: this.placeholderKey,
}; };
if (activeType === 'list') { if (activeType === "list") {
result.allowAny = true; result.allowAny = true;
} }
return result; return result;
}, },
optionEnabled(type) { optionEnabled(type) {
const options = this.options; const options = this.options;
if (!options) return false; if (!options) {
return false;
}
const option = options[type]; const option = options[type];
if (option === true) return true; if (option === true) {
if (typeof option !== 'string') return false; return true;
}
return option.split(',').filter(option => { if (typeof option !== "string") {
return [this.selectorType, this.inputType].indexOf(option) !== -1; return false;
}
return option.split(",").filter((o) => {
return [this.selectorType, this.inputType].indexOf(o) !== -1;
}).length; }).length;
}, },
showInput(type) { showInput(type) {
return this.activeType === type && this[`${type}Enabled`]; return this.activeType === type && this[`${type}Enabled`];
}, },
changeValue(value) { changeValue(value) {
this.set('value', value); this.set("value", value);
this.onUpdate('selector', this.activeType); this.onUpdate("selector", this.activeType);
}, },
@observes('inputType') @observes("inputType")
resetActiveType() { resetActiveType() {
this.set('activeType', defaultSelectionType(this.selectorType, this.options)); this.set(
"activeType",
defaultSelectionType(this.selectorType, this.options, this.connector)
);
}, },
actions: { actions: {
toggleType(type) { toggleType(type) {
this.set('activeType', type); this.set("activeType", type);
this.set('showTypes', false); this.set("showTypes", false);
this.set('value', null); this.set("value", null);
this.onUpdate('selector'); this.onUpdate("selector");
}, },
toggleTypes() { toggleTypes() {
this.toggleProperty('showTypes'); this.toggleProperty("showTypes");
}, },
changeValue(value) { changeValue(value) {
this.changeValue(value); this.changeValue(value);
}, },
changeInputValue(event) { changeInputValue(event) {
this.changeValue(event.target.value); this.changeValue(event.target.value);
}, },
changeUserValue(previousValue, value) { changeUserValue(value) {
this.changeValue(value); this.changeValue(value);
} },
} },
}) });

Datei anzeigen

@ -1,84 +1,86 @@
import { getOwner } from 'discourse-common/lib/get-owner'; import { newInput, selectionTypes } from "../lib/wizard-mapper";
import { newInput, selectionTypes } from '../lib/wizard-mapper'; import discourseComputed from "discourse-common/utils/decorators";
import { default as discourseComputed, observes, on } from 'discourse-common/utils/decorators';
import { later } from "@ember/runloop"; import { later } from "@ember/runloop";
import Component from "@ember/component"; import Component from "@ember/component";
import { A } from "@ember/array"; import { A } from "@ember/array";
export default Component.extend({ export default Component.extend({
classNames: 'wizard-mapper', classNames: "wizard-mapper",
didReceiveAttrs() { didReceiveAttrs() {
if (this.inputs && this.inputs.constructor !== Array) { if (this.inputs && this.inputs.constructor !== Array) {
later(() => this.set('inputs', null)); later(() => this.set("inputs", null));
} }
}, },
@discourseComputed('inputs.@each.type') @discourseComputed("inputs.@each.type")
canAdd(inputs) { canAdd(inputs) {
return !inputs || return (
inputs.constructor !== Array || !inputs ||
inputs.every(i => { inputs.constructor !== Array ||
return ['assignment','association'].indexOf(i.type) === -1; inputs.every((i) => {
}); return ["assignment", "association"].indexOf(i.type) === -1;
})
);
}, },
@discourseComputed('options.@each.inputType') @discourseComputed("options.@each.inputType")
inputOptions(options) { inputOptions(options) {
let result = { let result = {
inputTypes: options.inputTypes || 'assignment,conditional', inputTypes: options.inputTypes || "assignment,conditional",
inputConnector: options.inputConnector || 'or', inputConnector: options.inputConnector || "or",
pairConnector: options.pairConnector || null, pairConnector: options.pairConnector || null,
outputConnector: options.outputConnector || null, outputConnector: options.outputConnector || null,
context: options.context || null context: options.context || null,
} guestGroup: options.guestGroup || false,
};
let inputTypes = ['key', 'value', 'output'];
inputTypes.forEach(type => { let inputTypes = ["key", "value", "output"];
inputTypes.forEach((type) => {
result[`${type}Placeholder`] = options[`${type}Placeholder`] || null; result[`${type}Placeholder`] = options[`${type}Placeholder`] || null;
result[`${type}DefaultSelection`] = options[`${type}DefaultSelection`] || null; result[`${type}DefaultSelection`] =
options[`${type}DefaultSelection`] || null;
}); });
selectionTypes.forEach(type => { selectionTypes.forEach((type) => {
if (options[`${type}Selection`] !== undefined) { if (options[`${type}Selection`] !== undefined) {
result[`${type}Selection`] = options[`${type}Selection`] result[`${type}Selection`] = options[`${type}Selection`];
} else { } else {
result[`${type}Selection`] = type === 'text' ? true : false; result[`${type}Selection`] = type === "text" ? true : false;
} }
}); });
return result; return result;
}, },
onUpdate() { onUpdate() {},
},
actions: { actions: {
add() { add() {
if (!this.get('inputs')) { if (!this.get("inputs")) {
this.set('inputs', A()); this.set("inputs", A());
} }
this.get('inputs').pushObject( this.get("inputs").pushObject(
newInput(this.inputOptions, this.inputs.length) newInput(this.inputOptions, this.inputs.length)
); );
this.onUpdate(this.property, 'input'); this.onUpdate(this.property, "input");
}, },
remove(input) { remove(input) {
const inputs = this.inputs; const inputs = this.inputs;
inputs.removeObject(input); inputs.removeObject(input);
if (inputs.length) { if (inputs.length) {
inputs[0].set('connector', null); inputs[0].set("connector", null);
} }
this.onUpdate(this.property, 'input'); this.onUpdate(this.property, "input");
}, },
inputUpdated(component, type) { inputUpdated(component, type) {
this.onUpdate(this.property, component, type); this.onUpdate(this.property, component, type);
} },
} },
}); });

Datei anzeigen

@ -1,32 +1,33 @@
import { default as discourseComputed } from 'discourse-common/utils/decorators'; import { default as discourseComputed } from "discourse-common/utils/decorators";
import { not, notEmpty } from "@ember/object/computed"; import { not, notEmpty } from "@ember/object/computed";
import Component from "@ember/component"; import Component from "@ember/component";
import I18n from "I18n"; import I18n from "I18n";
const icons = { const icons = {
error: 'times-circle', error: "times-circle",
success: 'check-circle', success: "check-circle",
info: 'info-circle' warn: "exclamation-circle",
} info: "info-circle",
};
export default Component.extend({ export default Component.extend({
classNameBindings: [':wizard-message', 'type', 'loading'], classNameBindings: [":wizard-message", "type", "loading"],
showDocumentation: not('loading'), showDocumentation: not("loading"),
showIcon: not('loading'), showIcon: not("loading"),
hasItems: notEmpty('items'), hasItems: notEmpty("items"),
@discourseComputed('type') @discourseComputed("type")
icon(type) { icon(type) {
return icons[type] || 'info-circle'; return icons[type] || "info-circle";
}, },
@discourseComputed('key', 'component', 'opts') @discourseComputed("key", "component", "opts")
message(key, component, opts) { message(key, component, opts) {
return I18n.t(`admin.wizard.message.${component}.${key}`, opts || {}); return I18n.t(`admin.wizard.message.${component}.${key}`, opts || {});
}, },
@discourseComputed('component') @discourseComputed("component")
documentation(component) { documentation(component) {
return I18n.t(`admin.wizard.message.${component}.documentation`); return I18n.t(`admin.wizard.message.${component}.documentation`);
} },
}) });

Datei anzeigen

@ -6,29 +6,27 @@ import discourseComputed from "discourse-common/utils/decorators";
import I18n from "I18n"; import I18n from "I18n";
export default Component.extend({ export default Component.extend({
classNames: ["realtime-validations"], classNames: ["realtime-validations", "setting", "full", "subscription"],
@discourseComputed @discourseComputed
timeUnits() { timeUnits() {
return [ return ["days", "weeks", "months", "years"].map((unit) => {
"days", return {
"weeks", id: unit,
"months", name: I18n.t(`admin.wizard.field.validations.time_units.${unit}`),
"years" };
].map((unit) => { });
return {
id: unit,
name: I18n.t(`admin.wizard.field.validations.time_units.${unit}`)
}
});
}, },
init() { init() {
this._super(...arguments); this._super(...arguments);
if (!this.validations) return; if (!this.validations) {
return;
}
if (!this.field.validations) { if (!this.field.validations) {
const validations = {}; const validations = {};
this.validations.forEach((validation) => { this.validations.forEach((validation) => {
validations[validation] = {}; validations[validation] = {};
}); });

Datei anzeigen

@ -0,0 +1,30 @@
import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";
import Subscription from "../mixins/subscription";
import DiscourseURL from "discourse/lib/url";
import I18n from "I18n";
export default Component.extend(Subscription, {
tagName: "a",
classNameBindings: [":wizard-subscription-badge", "subscriptionType"],
attributeBindings: ["title"],
@discourseComputed("subscriptionType")
i18nKey(type) {
return `admin.wizard.subscription.type.${type ? type : "none"}`;
},
@discourseComputed("i18nKey")
title(i18nKey) {
return I18n.t(`${i18nKey}.title`);
},
@discourseComputed("i18nKey")
label(i18nKey) {
return I18n.t(`${i18nKey}.label`);
},
click() {
DiscourseURL.routeTo(this.subscriptionLink);
},
});

Datei anzeigen

@ -0,0 +1,26 @@
import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";
import Subscription from "../mixins/subscription";
export default Component.extend(Subscription, {
classNameBindings: [":wizard-subscription-container", "subscribed"],
@discourseComputed("subscribed")
subscribedIcon(subscribed) {
return subscribed ? "check" : "times";
},
@discourseComputed("subscribed")
subscribedLabel(subscribed) {
return `admin.wizard.subscription.${
subscribed ? "subscribed" : "not_subscribed"
}.label`;
},
@discourseComputed("subscribed")
subscribedTitle(subscribed) {
return `admin.wizard.subscription.${
subscribed ? "subscribed" : "not_subscribed"
}.title`;
},
});

Datei anzeigen

@ -0,0 +1,36 @@
import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";
import Subscription from "../mixins/subscription";
import I18n from "I18n";
export default Component.extend(Subscription, {
tagName: "a",
classNameBindings: [":btn", ":btn-pavilion-support", "subscriptionType"],
attributeBindings: ["title"],
@discourseComputed("subscribed")
i18nKey(subscribed) {
return `admin.wizard.subscription.cta.${
subscribed ? "subscribed" : "none"
}`;
},
@discourseComputed("subscribed")
icon(subscribed) {
return subscribed ? "far-life-ring" : "external-link-alt";
},
@discourseComputed("i18nKey")
title(i18nKey) {
return I18n.t(`${i18nKey}.title`);
},
@discourseComputed("i18nKey")
label(i18nKey) {
return I18n.t(`${i18nKey}.label`);
},
click() {
window.open(this.subscriptionCtaLink, "_blank").focus();
},
});

Datei anzeigen

@ -0,0 +1,96 @@
import SingleSelectComponent from "select-kit/components/single-select";
import Subscription from "../mixins/subscription";
import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
import discourseComputed from "discourse-common/utils/decorators";
import I18n from "I18n";
const nameKey = function (feature, attribute, value) {
if (feature === "action") {
return `admin.wizard.action.${value}.label`;
} else {
return `admin.wizard.${feature}.${attribute}.${value}`;
}
};
export default SingleSelectComponent.extend(Subscription, {
classNames: ["combo-box", "wizard-subscription-selector"],
selectKitOptions: {
autoFilterable: false,
filterable: false,
showFullTitle: true,
headerComponent:
"wizard-subscription-selector/wizard-subscription-selector-header",
caretUpIcon: "caret-up",
caretDownIcon: "caret-down",
},
allowedSubscriptionTypes(feature, attribute, value) {
let attributes = this.subscriptionAttributes[feature];
if (!attributes || !attributes[attribute]) {
return ["none"];
}
let allowedTypes = [];
Object.keys(attributes[attribute]).forEach((subscriptionType) => {
let values = attributes[attribute][subscriptionType];
if (values[0] === "*" || values.includes(value)) {
allowedTypes.push(subscriptionType);
}
});
return allowedTypes;
},
@discourseComputed("feature", "attribute", "wizard.allowGuests")
content(feature, attribute) {
return filterValues(this.wizard, feature, attribute)
.map((value) => {
let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
feature,
attribute,
value
);
let subscriptionRequired =
allowedSubscriptionTypes.length &&
!allowedSubscriptionTypes.includes("none");
let attrs = {
id: value,
name: I18n.t(nameKey(feature, attribute, value)),
subscriptionRequired,
};
if (subscriptionRequired) {
let subscribed = allowedSubscriptionTypes.includes(
this.subscriptionType
);
let selectorKey = subscribed ? "subscribed" : "not_subscribed";
let selectorLabel = `admin.wizard.subscription.${selectorKey}.selector`;
attrs.disabled = !subscribed;
attrs.selectorLabel = selectorLabel;
}
return attrs;
})
.sort(function (a, b) {
if (a.subscriptionType && !b.subscriptionType) {
return 1;
}
if (!a.subscriptionType && b.subscriptionType) {
return -1;
}
if (a.subscriptionType === b.subscriptionType) {
return a.subscriptionType
? a.subscriptionType.localeCompare(b.subscriptionType)
: 0;
} else {
return a.subscriptionType === "standard" ? -1 : 0;
}
});
},
modifyComponentForRow() {
return "wizard-subscription-selector/wizard-subscription-selector-row";
},
});

Datei anzeigen

@ -0,0 +1,17 @@
import SingleSelectHeaderComponent from "select-kit/components/select-kit/single-select-header";
import { computed } from "@ember/object";
import { reads } from "@ember/object/computed";
export default SingleSelectHeaderComponent.extend({
classNames: ["combo-box-header", "wizard-subscription-selector-header"],
caretUpIcon: reads("selectKit.options.caretUpIcon"),
caretDownIcon: reads("selectKit.options.caretDownIcon"),
caretIcon: computed(
"selectKit.isExpanded",
"caretUpIcon",
"caretDownIcon",
function () {
return this.selectKit.isExpanded ? this.caretUpIcon : this.caretDownIcon;
}
),
});

Datei anzeigen

@ -0,0 +1,20 @@
import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row";
import { default as discourseComputed } from "discourse-common/utils/decorators";
export default SelectKitRowComponent.extend({
classNameBindings: ["isDisabled:disabled"],
@discourseComputed("item")
isDisabled() {
return this.item.disabled;
},
click(event) {
event.preventDefault();
event.stopPropagation();
if (!this.item.disabled) {
this.selectKit.select(this.rowValue, this.item);
}
return false;
},
});

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen