diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
index b8ae5fe4..70b7db97 100644
--- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6
+++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
@@ -13,6 +13,9 @@ export default Ember.Component.extend({
@computed('field.type')
isInput: (type) => type === 'text' || type === 'textarea',
+ @computed('field.type')
+ isCategoryOrTag: (type) => type === 'tag' || type === 'category',
+
@computed()
presetChoices() {
return [
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
index e292371e..c52d1718 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
@@ -123,3 +123,14 @@
{{/if}}
+
+{{#if isCategoryOrTag}}
+
+
+
{{i18n 'admin.wizard.field.limit'}}
+
+
+ {{input type="number" value=field.limit}}
+
+
+{{/if}}
diff --git a/assets/javascripts/wizard-custom-lib.js b/assets/javascripts/wizard-custom-lib.js
index 4728e9b8..1752f4e8 100644
--- a/assets/javascripts/wizard-custom-lib.js
+++ b/assets/javascripts/wizard-custom-lib.js
@@ -1,12 +1,8 @@
-//= require discourse/lib/autocomplete
-//= require discourse/lib/utilities
-//= require discourse/lib/offset-calculator
-//= require discourse/lib/lock-on
-//= require discourse/lib/text-direction
-//= require discourse/lib/to-markdown
-//= require discourse/lib/load-script
-
-//= require markdown-it-bundle
-//= require pretty-text/engines/discourse-markdown-it
-//= require pretty-text/engines/discourse-markdown/helpers
-//= require pretty-text/pretty-text
+window.Discourse = {}
+window.Wizard = {};
+Wizard.SiteSettings = {};
+Wizard.RAW_TEMPLATES = {};
+Discourse.__widget_helpers = {};
+Discourse.SiteSettings = Wizard.SiteSettings;
+Discourse.Model = Ember.Object.extend();
+Discourse.Site = Ember.Object.extend();
\ No newline at end of file
diff --git a/assets/javascripts/wizard-custom.js b/assets/javascripts/wizard-custom.js
index c0b0ae2b..89796a27 100644
--- a/assets/javascripts/wizard-custom.js
+++ b/assets/javascripts/wizard-custom.js
@@ -1,3 +1,22 @@
+//= require discourse/lib/autocomplete
+//= require discourse/lib/utilities
+//= require discourse/lib/offset-calculator
+//= require discourse/lib/lock-on
+//= require discourse/lib/text-direction
+//= require discourse/lib/to-markdown
+//= require discourse/lib/load-script
+//= require discourse/lib/url
+//= require discourse/lib/ajax
+//= require discourse/lib/ajax-error
+//= require discourse/lib/page-visible
+//= require discourse/lib/logout
+//= require discourse/lib/render-tag
+
+//= require markdown-it-bundle
+//= require pretty-text/engines/discourse-markdown-it
+//= require pretty-text/engines/discourse-markdown/helpers
+//= require pretty-text/pretty-text
+
//= require ./wizard/custom-wizard
//= require_tree ./wizard/components
//= require_tree ./wizard/controllers
@@ -8,6 +27,12 @@
//= require_tree ./wizard/routes
//= require_tree ./wizard/templates
+//= require discourse/models/permission-type
+//= require discourse/models/rest
+//= require discourse/models/category
+//= require discourse/helpers/category-link
+//= require discourse/mixins/singleton
+
//= require discourse/components/user-selector
//= require discourse/helpers/user-avatar
//= require discourse/components/conditional-loading-spinner
@@ -16,10 +41,4 @@
//= require discourse/templates/components/d-button
//= require discourse/components/d-editor-modal
//= require lodash.js
-//= require mousetrap.js
-
-window.Discourse = {}
-window.Wizard = {};
-Wizard.SiteSettings = {};
-Wizard.RAW_TEMPLATES = {};
-Discourse.__widget_helpers = {};
+//= require mousetrap.js
\ No newline at end of file
diff --git a/assets/javascripts/wizard/helpers/dir-span.js.es6 b/assets/javascripts/wizard/helpers/dir-span.js.es6
new file mode 100644
index 00000000..bd9b2dfe
--- /dev/null
+++ b/assets/javascripts/wizard/helpers/dir-span.js.es6
@@ -0,0 +1,5 @@
+import { registerUnbound } from "discourse-common/lib/helpers";
+
+export default registerUnbound("dir-span", function(str) {
+ return new Handlebars.SafeString(str);
+});
\ No newline at end of file
diff --git a/assets/javascripts/wizard/initializers/custom.js.es6 b/assets/javascripts/wizard/initializers/custom.js.es6
index 225f1f0f..3882c6c5 100644
--- a/assets/javascripts/wizard/initializers/custom.js.es6
+++ b/assets/javascripts/wizard/initializers/custom.js.es6
@@ -1,7 +1,7 @@
export default {
name: 'custom-routes',
- initialize() {
+ initialize(app) {
if (window.location.pathname.indexOf('/w/') < 0) return;
const Router = requirejs('wizard/router').default;
@@ -15,6 +15,7 @@ export default {
const FieldModel = requirejs('wizard/models/wizard-field').default;
const autocomplete = requirejs('discourse/lib/autocomplete').default;
const cook = requirejs('discourse/plugins/discourse-custom-wizard/wizard/lib/text-lite').cook;
+ const Singleton = requirejs("discourse/mixins/singleton").default;
// IE11 Polyfill - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Polyfill
if (!Object.entries)
@@ -30,8 +31,23 @@ export default {
$.fn.autocomplete = autocomplete;
+ const targets = ["controller", "component", "route", "model", "adapter"];
+
+ const siteSettings = Wizard.SiteSettings;
+ app.register("site-settings:main", siteSettings, { instantiate: false });
+ targets.forEach(t => app.inject(t, "siteSettings", "site-settings:main"));
+
+ const site = Discourse.Site;
+ app.register("site:main", site);
+ targets.forEach(t => app.inject(t, "site", "site:main"));
+
+ site.reopenClass(Singleton);
+ site.currentProp('can_create_tag', false);
+
// this is for discourse/lib/utilities.avatarImg;
+ Discourse.__container__ = app.__container__;
Discourse.getURLWithCDN = getUrl;
+ Discourse.getURL = getUrl;
Router.reopen({
rootURL: getUrl('/w/')
@@ -188,7 +204,7 @@ export default {
}.property('field.type', 'field.id')
});
- const StandardFieldValidation = ['text', 'textarea', 'dropdown', 'image', 'checkbox', 'user-selector', 'text-only', 'composer'];
+ const StandardFieldValidation = ['text', 'textarea', 'dropdown', 'tag', 'category', 'image', 'checkbox', 'user-selector', 'text-only', 'composer'];
FieldModel.reopen({
hasCustomCheck: false,
diff --git a/assets/javascripts/wizard/models/custom.js.es6 b/assets/javascripts/wizard/models/custom.js.es6
index 4d12b169..003e80d5 100644
--- a/assets/javascripts/wizard/models/custom.js.es6
+++ b/assets/javascripts/wizard/models/custom.js.es6
@@ -12,7 +12,7 @@ const CustomWizard = Ember.Object.extend({
if (this.get('required') && (!this.get('completed') && this.get('permitted'))) return;
const id = this.get('id');
CustomWizard.skip(id);
- }
+ },
});
CustomWizard.reopenClass({
@@ -61,6 +61,36 @@ export function findCustomWizard(wizardId, params = {}) {
});
}
+ if (wizard.categories) {
+ let subcatMap = {};
+ let categoriesById = {};
+ let categories = wizard.categories.map(c => {
+ if (c.parent_category_id) {
+ subcatMap[c.parent_category_id] =
+ subcatMap[c.parent_category_id] || [];
+ subcatMap[c.parent_category_id].push(c.id);
+ }
+ return (categoriesById[c.id] = Ember.Object.create(c));
+ });
+
+ // Associate the categories with their parents
+ categories.forEach(c => {
+ let subcategoryIds = subcatMap[c.get("id")];
+ if (subcategoryIds) {
+ c.set("subcategories", subcategoryIds.map(id => categoriesById[id]));
+ }
+ if (c.get("parent_category_id")) {
+ c.set("parentCategory", categoriesById[c.get("parent_category_id")]);
+ }
+ });
+
+ Discourse.Site.currentProp('categoriesList', categories);
+ Discourse.Site.currentProp('sortedCategories', categories);
+ Discourse.Site.currentProp('listByActivity', categories);
+ Discourse.Site.currentProp('categoriesById', categoriesById);
+ Discourse.Site.currentProp('uncategorized_category_id', wizard.uncategorized_category_id);
+ }
+
return CustomWizard.create(wizard);
});
};
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-category.hbs b/assets/javascripts/wizard/templates/components/wizard-field-category.hbs
new file mode 100644
index 00000000..e9b0c41f
--- /dev/null
+++ b/assets/javascripts/wizard/templates/components/wizard-field-category.hbs
@@ -0,0 +1,2 @@
+{{category-selector categories=field.value maximum=field.limit}}
+
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs b/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs
new file mode 100644
index 00000000..16243d36
--- /dev/null
+++ b/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs
@@ -0,0 +1 @@
+{{tag-chooser value=field.value maximum=field.limit}}
diff --git a/assets/stylesheets/wizard/wizard_badges.scss b/assets/stylesheets/wizard/wizard_badges.scss
new file mode 100644
index 00000000..cc21503e
--- /dev/null
+++ b/assets/stylesheets/wizard/wizard_badges.scss
@@ -0,0 +1,148 @@
+@import 'wizard_variables';
+
+// Category badges
+// --------------------------------------------------
+
+.badge-wrapper {
+ font-size: $font-down-1;
+ font-weight: bold;
+ white-space: nowrap;
+ position: relative;
+ display: inline-flex;
+ align-items: baseline;
+
+ .badge-category {
+ display: inline-flex;
+ align-items: baseline;
+ .category-name {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+ .d-icon {
+ margin-right: 3px;
+ width: 0.74em;
+ height: 0.74em;
+ color: inherit;
+ }
+ }
+
+ // ----- Bullet
+
+ &.bullet {
+ margin-right: 12px;
+ span.badge-category {
+ color: $primary-high;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ .extra-info-wrapper & {
+ color: $header-primary;
+ }
+ }
+ .badge-category-parent-bg,
+ .badge-category-bg {
+ flex: 0 0 auto;
+ width: 9px;
+ height: 9px;
+ margin-right: 5px;
+ display: inline-block;
+ }
+ .badge-category-parent-bg {
+ // Subcategories
+ width: 5px;
+ margin-right: 0;
+ + .badge-category-bg {
+ width: 5px;
+ }
+ }
+ .d-icon {
+ color: $primary-medium;
+ }
+ }
+
+ // ----- Box
+
+ &.box {
+ margin-right: 5px;
+ padding: 2px 4px 2px 4px;
+ display: inline-flex;
+ span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ &.badge-category-bg,
+ &.badge-category-parent-bg {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ &.badge-category-parent-bg {
+ // Subcategories
+ width: calc(100% - 5px);
+ & + .badge-category-bg {
+ left: 5px;
+ width: calc(100% - 5px);
+ & + .badge-category {
+ margin-left: 5px;
+ }
+ }
+ }
+
+ &.badge-category {
+ position: relative;
+ }
+ }
+ + .topic-header-extra {
+ padding: 2px 4px 2px 4px;
+ }
+ }
+
+ // ----- Bar
+
+ &.bar {
+ margin-right: 5px;
+
+ span.badge-category {
+ color: $primary-high;
+ padding: 1px 3px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ .extra-info-wrapper & {
+ color: $header-primary;
+ }
+ }
+
+ .badge-category-parent-bg,
+ .badge-category-bg {
+ // Subcategories
+ display: inline-block;
+ padding: 0 1px;
+
+ &:before {
+ content: "\a0";
+ }
+ }
+ }
+
+ // ----- No category style
+
+ &.none {
+ color: $primary-high;
+ margin-right: 5px;
+ }
+}
+
+// Category badge dropdown
+// --------------------------------------------------
+
+.list-controls {
+ .category-breadcrumb {
+ a.badge-category {
+ display: inline-block;
+ padding: 6px 8px;
+ line-height: $line-height-medium;
+ }
+ }
+}
\ No newline at end of file
diff --git a/assets/stylesheets/wizard/wizard_variables.scss b/assets/stylesheets/wizard/wizard_variables.scss
index 72041265..045d8ef0 100644
--- a/assets/stylesheets/wizard/wizard_variables.scss
+++ b/assets/stylesheets/wizard/wizard_variables.scss
@@ -8,3 +8,279 @@ $highlight: #ffff4d !default;
$danger: #e45735 !default;
$success: #009900 !default;
$love: #fa6c8d !default;
+
+// --------------------------------------------------
+// Variables from Discourse
+// --------------------------------------------------
+
+// Layout dimensions
+// --------------------------------------------------
+
+$small-width: 800px !default;
+$medium-width: 995px !default;
+$large-width: 1110px !default;
+
+$input-padding: 4px 10px;
+$topic-body-width: 690px;
+$topic-body-width-padding: 11px;
+$topic-avatar-width: 45px;
+
+// Brand color variables
+// --------------------------------------------------
+
+$google: #ffffff !default;
+$instagram: #e1306c !default;
+$facebook: #4267b2 !default;
+$cas: #70ba61 !default;
+$twitter: #1da1f2 !default;
+$github: #100e0f !default;
+
+// Badge color variables
+// --------------------------------------------------
+
+$gold: rgb(231, 195, 0) !default;
+$silver: #c0c0c0 !default;
+$bronze: #cd7f32 !default;
+
+// Fonts
+// --------------------------------------------------
+
+$base-font-size-smaller: 14px !default;
+$base-font-size: 15px !default;
+$base-font-size-larger: 17px !default;
+$base-font-size-largest: 19px !default;
+$base-font-family: Helvetica, Arial, sans-serif !default;
+
+// Font-size defintions, multiplier ^ (step / interval)
+$font-up-6: 2.296em;
+$font-up-5: 2em;
+$font-up-4: 1.7511em;
+$font-up-3: 1.5157em;
+$font-up-2: 1.3195em;
+$font-up-1: 1.1487em; // 2^(1/5)
+$font-0: 1em;
+$font-down-1: 0.8706em; // 2^(-1/5)
+$font-down-2: 0.7579em; // Smallest size we use based on the 1em base
+$font-down-3: 0.6599em;
+$font-down-4: 0.5745em;
+$font-down-5: 0.5em;
+$font-down-6: 0.4355em;
+
+// inputs/textareas in iOS need to be at least 16px to avoid triggering zoom on focus
+// with base at 15px, the below gives 16.05px
+$font-size-ios-input: 1.07em;
+
+// Common line-heights
+$line-height-small: 1;
+$line-height-medium: 1.2; // Headings or large text
+$line-height-large: 1.4; // Normal or small text
+
+// Z-index
+// --------------------------------------------------
+
+$z-layers: (
+ "max": 9999,
+ "modal": (
+ "tooltip": 1600,
+ "popover": 1500,
+ "dropdown": 1400,
+ "content": 1300,
+ "overlay": 1200
+ ),
+ "fullscreen": 1150,
+ "mobile-composer": 1100,
+ "ipad-header-nav": 1020,
+ "header": 1000,
+ "footer-nav": 900,
+ "tooltip": 600,
+ "composer": (
+ "dropdown": 700,
+ "tooltip": 600,
+ "popover": 500,
+ "content": 400
+ ),
+ "dropdown": 300,
+ "usercard": 200,
+ "timeline": 100,
+ "base": 1
+);
+
+@function map-has-nested-keys($map, $keys...) {
+ @each $key in $keys {
+ @if not map-has-key($map, $key) {
+ @return false;
+ }
+ $map: map-get($map, $key);
+ }
+ @return true;
+}
+
+@function map-deep-get($map, $keys...) {
+ @each $key in $keys {
+ $map: map-get($map, $key);
+ }
+ @return $map;
+}
+
+@function z($layers...) {
+ @if not map-has-nested-keys($z-layers, $layers...) {
+ @warn "No layer defined for `#{inspect($layers...)}` in $z-layers map. Check variables.scss, property omitted.";
+ }
+ @return map-deep-get($z-layers, $layers...);
+}
+
+// Box-shadow
+// --------------------------------------------------
+
+$box-shadow: (
+ "modal": 0 8px 60px rgba(0, 0, 0, 0.6),
+ "composer": 0 -1px 40px rgba(0, 0, 0, 0.12),
+ "menu-panel": 0 12px 12px rgba(0, 0, 0, 0.15),
+ "card": 0 4px 14px rgba(0, 0, 0, 0.15),
+ "dropdown": 0 2px 3px 0 rgba(0, 0, 0, 0.2),
+ "header": 0 2px 4px -1px rgba(0, 0, 0, 0.25),
+ "footer-nav": 0 0 2px 0 rgba(0, 0, 0, 0.25),
+ "kbd": (
+ 0 2px 0 rgba(0, 0, 0, 0.2),
+ 0 0 0 1px dark-light-choose(#fff, #000) inset
+ ),
+ "focus": 0 0 6px 0 $tertiary,
+ "focus-danger": 0 0 6px 0 $danger
+);
+
+@function shadow($key) {
+ @return map-get($box-shadow, $key);
+}
+
+// Color utilities
+// --------------------------------------------------
+
+// w3c definition of color brightness https://www.w3.org/TR/AERT#color-contrast
+@function dc-color-brightness($color) {
+ @return (
+ (red($color) * 0.299) + (green($color) * 0.587) + (blue($color) * 0.114)
+ );
+}
+
+// Uses an approximation of sRGB blending, GAMMA=2 instead of GAMMA=2.2
+@function srgb-scale($foreground, $background, $percent) {
+ $ratio: ($percent / 100%);
+ $iratio: 1 - $ratio;
+ $f_r2: red($foreground) * red($foreground);
+ $f_g2: green($foreground) * green($foreground);
+ $f_b2: blue($foreground) * blue($foreground);
+ $b_r2: red($background) * red($background);
+ $b_g2: green($background) * green($background);
+ $b_b2: blue($background) * blue($background);
+ $r_r2: $f_r2 * $ratio + $b_r2 * $iratio;
+ $r_g2: $f_g2 * $ratio + $b_g2 * $iratio;
+ $r_b2: $f_b2 * $ratio + $b_b2 * $iratio;
+ $r_r: sqrt($r_r2);
+ $r_g: sqrt($r_g2);
+ $r_b: sqrt($r_b2);
+ @return rgb($r_r, $r_g, $r_b);
+}
+
+// Replaces dark-light-diff($primary, $secondary, 50%, -50%)
+@function blend-primary-secondary($percent) {
+ @return srgb-scale($primary, $secondary, $percent);
+}
+
+@function dark-light-diff(
+ $adjusted-color,
+ $comparison-color,
+ $lightness,
+ $darkness
+) {
+ @if dc-color-brightness($adjusted-color) <
+ dc-color-brightness($comparison-color)
+ {
+ @return scale-color($adjusted-color, $lightness: $lightness);
+ } @else {
+ @return scale-color($adjusted-color, $lightness: $darkness);
+ }
+}
+@function dark-light-choose($light-theme-result, $dark-theme-result) {
+ @if dc-color-brightness($primary) < dc-color-brightness($secondary) {
+ @return $light-theme-result;
+ } @else {
+ @return $dark-theme-result;
+ }
+}
+
+// standard color transformations, use these if possible, and add any new dark-light-diffs here
+
+//primary
+$primary-very-low: dark-light-diff($primary, $secondary, 97%, -82%);
+$primary-low: dark-light-diff($primary, $secondary, 90%, -78%);
+$primary-low-mid: dark-light-diff($primary, $secondary, 70%, -45%);
+$primary-medium: dark-light-diff($primary, $secondary, 50%, -35%);
+$primary-high: dark-light-diff($primary, $secondary, 30%, -25%);
+$primary-very-high: dark-light-diff($primary, $secondary, 15%, -10%);
+
+//header_primary
+$header_primary-low: dark-light-diff(
+ $header_primary,
+ $header_background,
+ 90%,
+ -78%
+);
+$header_primary-low-mid: dark-light-diff(
+ $header_primary,
+ $header_background,
+ 70%,
+ -45%
+);
+
+$header_primary-medium: dark-light-diff(
+ $header_primary,
+ $header_background,
+ 50%,
+ -35%
+);
+$header_primary-high: dark-light-diff(
+ $header_primary,
+ $header_background,
+ 30%,
+ -25%
+);
+$header_primary-very-high: dark-light-diff(
+ $header_primary,
+ $header_background,
+ 15%,
+ -10%
+);
+
+//secondary
+$secondary-low: dark-light-diff($secondary, $primary, 70%, -70%);
+$secondary-medium: dark-light-diff($secondary, $primary, 50%, -50%);
+$secondary-high: dark-light-diff($secondary, $primary, 30%, -35%);
+$secondary-very-high: dark-light-diff($secondary, $primary, 7%, -7%);
+
+//tertiary
+$tertiary-low: dark-light-diff($tertiary, $secondary, 85%, -65%);
+$tertiary-medium: dark-light-diff($tertiary, $secondary, 50%, -45%);
+$tertiary-high: dark-light-diff($tertiary, $secondary, 20%, -25%);
+
+//quaternary
+$quaternary-low: dark-light-diff($quaternary, $secondary, 70%, -70%);
+
+//highlight
+$highlight-low: dark-light-diff($highlight, $secondary, 70%, -80%);
+$highlight-medium: dark-light-diff($highlight, $secondary, 50%, -55%);
+$highlight-high: dark-light-diff($highlight, $secondary, -50%, -10%);
+
+//danger
+$danger-low: dark-light-diff($danger, $secondary, 85%, -64%);
+$danger-medium: dark-light-diff($danger, $secondary, 30%, -35%);
+
+//success
+$success-low: dark-light-diff($success, $secondary, 80%, -60%);
+$success-medium: dark-light-diff($success, $secondary, 50%, -40%);
+
+//love
+$love-low: dark-light-diff($love, $secondary, 85%, -60%);
+
+//wiki
+$wiki: green;
+
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 91c6ea75..1548647e 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -109,6 +109,9 @@ en:
min_length: "Min Length"
min_length_placeholder: "Minimum length in characters"
file_types: "File Types"
+ tag: "Tag"
+ category: "Category"
+ limit: "Limit"
action:
header: "Actions*"
include: "Include Fields"
@@ -257,7 +260,17 @@ en:
geo_location: "Search and select a result."
select_kit:
- filter_placeholder: "Search..."
+ default_header_text: Select...
+ no_content: No matches found
+ filter_placeholder: Search...
+ filter_placeholder_with_any: Search or create...
+ create: "Create: '{{content}}'"
+ max_content_reached:
+ one: "You can only select {{count}} item."
+ other: "You can only select {{count}} items."
+ min_content_not_reached:
+ one: "Select at least {{count}} item."
+ other: "Select at least {{count}} items."
wizard:
completed: "You have completed the {{name}} wizard."
diff --git a/lib/builder.rb b/lib/builder.rb
index a27c6fce..99624ad6 100644
--- a/lib/builder.rb
+++ b/lib/builder.rb
@@ -206,6 +206,10 @@ class CustomWizard::Builder
if field_template['type'] === 'upload'
params[:file_types] = field_template['file_types']
end
+
+ if field_template['type'] === 'category' || field_template['type'] === 'tag'
+ params[:limit] = field_template['limit']
+ end
field = step.add_field(params)
@@ -353,7 +357,7 @@ class CustomWizard::Builder
action['add_fields'].each do |field|
value = field['value_custom'].present? ? field['value_custom'] : data[field['value']]
key = field['key']
-
+
if key && (value.present? || value === false)
if key.include?('custom_fields')
keyArr = key.split('.')
@@ -447,7 +451,7 @@ class CustomWizard::Builder
user_field = pu['user_field']
key = pu['key']
-
+
if user_field || custom_field
custom_fields[user_field || custom_field] = data[key]
else
diff --git a/lib/field.rb b/lib/field.rb
index e59d4bba..c68379a6 100644
--- a/lib/field.rb
+++ b/lib/field.rb
@@ -1,6 +1,6 @@
class CustomWizard::Field
def self.types
- @types ||= ['checkbox', 'composer', 'dropdown', 'image', 'text', 'textarea', 'text-only', 'upload', 'user-selector']
+ @types ||= ['checkbox', 'composer', 'dropdown', 'tag', 'category', 'image', 'text', 'textarea', 'text-only', 'upload', 'user-selector']
end
def self.require_assets
diff --git a/lib/wizard_edits.rb b/lib/wizard_edits.rb
index dc6421ab..de4a1999 100644
--- a/lib/wizard_edits.rb
+++ b/lib/wizard_edits.rb
@@ -23,7 +23,7 @@ require_dependency 'wizard/step'
end
::Wizard::Field.class_eval do
- attr_reader :label, :description, :image, :key, :min_length, :file_types
+ attr_reader :label, :description, :image, :key, :min_length, :file_types, :limit
attr_accessor :dropdown_none
def initialize(attrs)
@@ -39,6 +39,7 @@ end
@choices = []
@dropdown_none = attrs[:dropdown_none]
@file_types = attrs[:file_types]
+ @limit = attrs[:limit]
end
def label
@@ -65,7 +66,16 @@ class ::Wizard::Step
end
::WizardSerializer.class_eval do
- attributes :id, :name, :background, :completed, :required, :min_trust, :permitted, :user
+ attributes :id,
+ :name,
+ :background,
+ :completed,
+ :required,
+ :min_trust,
+ :permitted,
+ :user,
+ :categories,
+ :uncategorized_category_id
def id
object.id
@@ -132,6 +142,19 @@ end
def user
object.user
end
+
+ def categories
+ begin
+ site = ::Site.new(scope)
+ ::ActiveModel::ArraySerializer.new(site.categories, each_serializer: BasicCategorySerializer)
+ rescue => e
+ puts "HERE IS THE ERROR: #{e.inspect}"
+ end
+ end
+
+ def uncategorized_category_id
+ SiteSetting.uncategorized_category_id
+ end
end
::WizardStepSerializer.class_eval do
@@ -153,7 +176,7 @@ end
end
::WizardFieldSerializer.class_eval do
- attributes :dropdown_none, :image, :file_types
+ attributes :dropdown_none, :image, :file_types, :limit
def label
return object.label if object.label.present?
@@ -184,4 +207,8 @@ end
def file_types
object.file_types
end
+
+ def limit
+ object.limit
+ end
end
diff --git a/views/layouts/wizard.html.erb b/views/layouts/wizard.html.erb
index ebbf7678..f70616cd 100644
--- a/views/layouts/wizard.html.erb
+++ b/views/layouts/wizard.html.erb
@@ -4,6 +4,7 @@
<%= stylesheet_link_tag "wizard_custom", media: "all", "data-turbolinks-track" => "reload" %>
<%= stylesheet_link_tag "wizard_composer", media: "all", "data-turbolinks-track" => "reload" %>
<%= stylesheet_link_tag "wizard_variables", media: "all", "data-turbolinks-track" => "reload" %>
+ <%= stylesheet_link_tag "wizard_badges", media: "all", "data-turbolinks-track" => "reload" %>
<%= stylesheet_link_tag "wizard_custom_mobile", media: "all", "data-turbolinks-track" => "reload" if mobile_view?%>
<%- if theme_ids %>
<%= discourse_stylesheet_link_tag (mobile_view? ? :mobile_theme : :desktop_theme) %>