formstrap 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/assets/javascripts/formstrap/controllers/redactor_controller.js +18 -0
  4. data/app/assets/javascripts/formstrap/controllers/select_controller.js +22 -18
  5. data/app/assets/javascripts/formstrap/index.js +5 -2
  6. data/app/assets/javascripts/formstrap/vendor/redactor/i18n/de.js +214 -0
  7. data/app/assets/javascripts/formstrap/vendor/redactor/i18n/en.js +214 -0
  8. data/app/assets/javascripts/formstrap/vendor/redactor/i18n/fr.js +214 -0
  9. data/app/assets/javascripts/formstrap/vendor/redactor/i18n/nl.js +214 -0
  10. data/app/assets/javascripts/formstrap/vendor/redactor/index.js +5 -0
  11. data/app/assets/javascripts/formstrap/vendor/redactor/plugins/emoji.js +332 -0
  12. data/app/assets/javascripts/formstrap/vendor/redactor/plugins/linkstyles.js +124 -0
  13. data/app/assets/javascripts/formstrap.js +1295 -148
  14. data/app/assets/stylesheets/formstrap/general.scss +0 -6
  15. data/app/assets/stylesheets/formstrap/vendor/overrides/redactor.scss +151 -0
  16. data/app/assets/stylesheets/formstrap/vendor/redactor.css +2535 -0
  17. data/app/assets/stylesheets/formstrap.css +2650 -5
  18. data/app/assets/stylesheets/formstrap.scss +4 -0
  19. data/app/models/formstrap/redactor_view.rb +57 -0
  20. data/app/models/formstrap/wysiwyg_view.rb +9 -1
  21. data/app/views/formstrap/{_redactorx.html.erb → _redactor.html.erb} +4 -7
  22. data/app/views/formstrap/_wysiwyg.html.erb +3 -5
  23. data/lib/formstrap/form_builder.rb +12 -4
  24. data/lib/formstrap/version.rb +1 -1
  25. data/package.json +2 -2
  26. data/yarn.lock +4 -4
  27. metadata +14 -5
  28. data/app/assets/javascripts/formstrap/controllers/redactorx_controller.js +0 -40
  29. data/app/models/formstrap/redactorx_view.rb +0 -57
@@ -1009,6 +1009,7 @@ var require_tom_select_complete = __commonJS({
1009
1009
  selectOnTab: false,
1010
1010
  preload: null,
1011
1011
  allowEmptyOption: false,
1012
+ refreshThrottle: 300,
1012
1013
  loadThrottle: 300,
1013
1014
  loadingClass: "loading",
1014
1015
  dataAttr: null,
@@ -1052,16 +1053,23 @@ var require_tom_select_complete = __commonJS({
1052
1053
  const escape_html = (str) => {
1053
1054
  return (str + "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
1054
1055
  };
1056
+ const timeout = (fn2, timeout2) => {
1057
+ if (timeout2 > 0) {
1058
+ return setTimeout(fn2, timeout2);
1059
+ }
1060
+ fn2.call(null);
1061
+ return null;
1062
+ };
1055
1063
  const loadDebounce = (fn2, delay) => {
1056
- var timeout;
1064
+ var timeout2;
1057
1065
  return function(value, callback) {
1058
1066
  var self2 = this;
1059
- if (timeout) {
1067
+ if (timeout2) {
1060
1068
  self2.loading = Math.max(self2.loading - 1, 0);
1061
- clearTimeout(timeout);
1069
+ clearTimeout(timeout2);
1062
1070
  }
1063
- timeout = setTimeout(function() {
1064
- timeout = null;
1071
+ timeout2 = setTimeout(function() {
1072
+ timeout2 = null;
1065
1073
  self2.loadedSearches[value] = true;
1066
1074
  fn2.call(self2, value, callback);
1067
1075
  }, delay);
@@ -1161,6 +1169,7 @@ var require_tom_select_complete = __commonJS({
1161
1169
  var options = settings_element.options;
1162
1170
  var optionsMap = {};
1163
1171
  var group_count = 1;
1172
+ let $order = 0;
1164
1173
  var readData = (el) => {
1165
1174
  var data = Object.assign({}, el.dataset);
1166
1175
  var json = attr_data && data[attr_data];
@@ -1193,6 +1202,7 @@ var require_tom_select_complete = __commonJS({
1193
1202
  option_data[field_disabled] = option_data[field_disabled] || option2.disabled;
1194
1203
  option_data[field_optgroup] = option_data[field_optgroup] || group;
1195
1204
  option_data.$option = option2;
1205
+ option_data.$order = option_data.$order || ++$order;
1196
1206
  optionsMap[value] = option_data;
1197
1207
  options.push(option_data);
1198
1208
  }
@@ -1206,6 +1216,7 @@ var require_tom_select_complete = __commonJS({
1206
1216
  optgroup_data[field_optgroup_label] = optgroup_data[field_optgroup_label] || optgroup.getAttribute("label") || "";
1207
1217
  optgroup_data[field_optgroup_value] = optgroup_data[field_optgroup_value] || group_count++;
1208
1218
  optgroup_data[field_disabled] = optgroup_data[field_disabled] || optgroup.disabled;
1219
+ optgroup_data.$order = optgroup_data.$order || ++$order;
1209
1220
  settings_element.optgroups.push(optgroup_data);
1210
1221
  id = optgroup_data[field_optgroup_value];
1211
1222
  iterate(optgroup.children, (option2) => {
@@ -1271,6 +1282,7 @@ var require_tom_select_complete = __commonJS({
1271
1282
  this.sifter = void 0;
1272
1283
  this.isOpen = false;
1273
1284
  this.isDisabled = false;
1285
+ this.isReadOnly = false;
1274
1286
  this.isRequired = void 0;
1275
1287
  this.isInvalid = false;
1276
1288
  this.isValid = true;
@@ -1292,6 +1304,7 @@ var require_tom_select_complete = __commonJS({
1292
1304
  this.options = {};
1293
1305
  this.userOptions = {};
1294
1306
  this.items = [];
1307
+ this.refreshTimeout = null;
1295
1308
  instance_i++;
1296
1309
  var dir;
1297
1310
  var input = getDom(input_arg);
@@ -1354,7 +1367,7 @@ var require_tom_select_complete = __commonJS({
1354
1367
  getDom(settings.dropdownParent || wrapper).appendChild(dropdown);
1355
1368
  if (isHtmlString(settings.controlInput)) {
1356
1369
  control_input = getDom(settings.controlInput);
1357
- var attrs = ["autocorrect", "autocapitalize", "autocomplete"];
1370
+ var attrs = ["autocorrect", "autocapitalize", "autocomplete", "spellcheck"];
1358
1371
  iterate$1(attrs, (attr) => {
1359
1372
  if (input.getAttribute(attr)) {
1360
1373
  setAttr(control_input, {
@@ -1440,7 +1453,6 @@ var require_tom_select_complete = __commonJS({
1440
1453
  if (settings.load && settings.loadThrottle) {
1441
1454
  settings.load = loadDebounce(settings.load, settings.loadThrottle);
1442
1455
  }
1443
- self2.control_input.type = input.type;
1444
1456
  addEvent(dropdown, "mousemove", () => {
1445
1457
  self2.ignoreHover = false;
1446
1458
  });
@@ -1530,6 +1542,8 @@ var require_tom_select_complete = __commonJS({
1530
1542
  self2.isSetup = true;
1531
1543
  if (input.disabled) {
1532
1544
  self2.disable();
1545
+ } else if (input.readOnly) {
1546
+ self2.setReadOnly(true);
1533
1547
  } else {
1534
1548
  self2.enable();
1535
1549
  }
@@ -1760,19 +1774,32 @@ var require_tom_select_complete = __commonJS({
1760
1774
  }
1761
1775
  }
1762
1776
  onInput(e) {
1763
- var self2 = this;
1764
- if (self2.isLocked) {
1777
+ if (this.isLocked) {
1765
1778
  return;
1766
1779
  }
1767
- var value = self2.inputValue();
1768
- if (self2.lastValue !== value) {
1769
- self2.lastValue = value;
1770
- if (self2.settings.shouldLoad.call(self2, value)) {
1771
- self2.load(value);
1772
- }
1773
- self2.refreshOptions();
1774
- self2.trigger("type", value);
1780
+ const value = this.inputValue();
1781
+ if (this.lastValue === value)
1782
+ return;
1783
+ this.lastValue = value;
1784
+ if (value == "") {
1785
+ this._onInput();
1786
+ return;
1775
1787
  }
1788
+ if (this.refreshTimeout) {
1789
+ clearTimeout(this.refreshTimeout);
1790
+ }
1791
+ this.refreshTimeout = timeout(() => {
1792
+ this.refreshTimeout = null;
1793
+ this._onInput();
1794
+ }, this.settings.refreshThrottle);
1795
+ }
1796
+ _onInput() {
1797
+ const value = this.lastValue;
1798
+ if (this.settings.shouldLoad.call(this, value)) {
1799
+ this.load(value);
1800
+ }
1801
+ this.refreshOptions();
1802
+ this.trigger("type", value);
1776
1803
  }
1777
1804
  onOptionHover(evt, option2) {
1778
1805
  if (this.ignoreHover)
@@ -1782,7 +1809,7 @@ var require_tom_select_complete = __commonJS({
1782
1809
  onFocus(e) {
1783
1810
  var self2 = this;
1784
1811
  var wasFocused = self2.isFocused;
1785
- if (self2.isDisabled) {
1812
+ if (self2.isDisabled || self2.isReadOnly) {
1786
1813
  self2.blur();
1787
1814
  preventDefault(e);
1788
1815
  return;
@@ -1795,7 +1822,7 @@ var require_tom_select_complete = __commonJS({
1795
1822
  if (!wasFocused)
1796
1823
  self2.trigger("focus");
1797
1824
  if (!self2.activeItems.length) {
1798
- self2.showInput();
1825
+ self2.inputState();
1799
1826
  self2.refreshOptions(!!self2.settings.openOnFocus);
1800
1827
  }
1801
1828
  self2.refreshState();
@@ -1933,7 +1960,7 @@ var require_tom_select_complete = __commonJS({
1933
1960
  if (!item) {
1934
1961
  self2.clearActiveItems();
1935
1962
  if (self2.isFocused) {
1936
- self2.showInput();
1963
+ self2.inputState();
1937
1964
  }
1938
1965
  return;
1939
1966
  }
@@ -1964,7 +1991,7 @@ var require_tom_select_complete = __commonJS({
1964
1991
  self2.clearActiveItems();
1965
1992
  self2.setActiveItemClass(item);
1966
1993
  }
1967
- self2.hideInput();
1994
+ self2.inputState();
1968
1995
  if (!self2.isFocused) {
1969
1996
  self2.focus();
1970
1997
  }
@@ -2048,7 +2075,7 @@ var require_tom_select_complete = __commonJS({
2048
2075
  const activeItems = self2.controlChildren();
2049
2076
  if (!activeItems.length)
2050
2077
  return;
2051
- self2.hideInput();
2078
+ self2.inputState();
2052
2079
  self2.close();
2053
2080
  self2.activeItems = activeItems;
2054
2081
  iterate$1(activeItems, (item) => {
@@ -2075,18 +2102,12 @@ var require_tom_select_complete = __commonJS({
2075
2102
  }
2076
2103
  self2.wrapper.classList.toggle("input-hidden", self2.isInputHidden);
2077
2104
  }
2078
- hideInput() {
2079
- this.inputState();
2080
- }
2081
- showInput() {
2082
- this.inputState();
2083
- }
2084
2105
  inputValue() {
2085
2106
  return this.control_input.value.trim();
2086
2107
  }
2087
2108
  focus() {
2088
2109
  var self2 = this;
2089
- if (self2.isDisabled)
2110
+ if (self2.isDisabled || self2.isReadOnly)
2090
2111
  return;
2091
2112
  self2.ignoreFocus = true;
2092
2113
  if (self2.control_input.offsetWidth) {
@@ -2173,6 +2194,23 @@ var require_tom_select_complete = __commonJS({
2173
2194
  if (n > 0) {
2174
2195
  show_dropdown = true;
2175
2196
  }
2197
+ const getGroupFragment = (optgroup2, order2) => {
2198
+ let group_order_i = groups[optgroup2];
2199
+ if (group_order_i !== void 0) {
2200
+ let order_group = groups_order[group_order_i];
2201
+ if (order_group !== void 0) {
2202
+ return [group_order_i, order_group.fragment];
2203
+ }
2204
+ }
2205
+ let group_fragment = document.createDocumentFragment();
2206
+ group_order_i = groups_order.length;
2207
+ groups_order.push({
2208
+ fragment: group_fragment,
2209
+ order: order2,
2210
+ optgroup: optgroup2
2211
+ });
2212
+ return [group_order_i, group_fragment];
2213
+ };
2176
2214
  for (i = 0; i < n; i++) {
2177
2215
  let item = results.items[i];
2178
2216
  if (!item)
@@ -2190,14 +2228,14 @@ var require_tom_select_complete = __commonJS({
2190
2228
  optgroups = Array.isArray(optgroup) ? optgroup : [optgroup];
2191
2229
  for (j = 0, k = optgroups && optgroups.length; j < k; j++) {
2192
2230
  optgroup = optgroups[j];
2193
- if (!self2.optgroups.hasOwnProperty(optgroup)) {
2231
+ let order2 = option2.$order;
2232
+ let self_optgroup = self2.optgroups[optgroup];
2233
+ if (self_optgroup === void 0) {
2194
2234
  optgroup = "";
2235
+ } else {
2236
+ order2 = self_optgroup.$order;
2195
2237
  }
2196
- let group_fragment = groups[optgroup];
2197
- if (group_fragment === void 0) {
2198
- group_fragment = document.createDocumentFragment();
2199
- groups_order.push(optgroup);
2200
- }
2238
+ const [group_order_i, group_fragment] = getGroupFragment(optgroup, order2);
2201
2239
  if (j > 0) {
2202
2240
  option_el = option_el.cloneNode(true);
2203
2241
  setAttr(option_el, {
@@ -2213,21 +2251,20 @@ var require_tom_select_complete = __commonJS({
2213
2251
  }
2214
2252
  }
2215
2253
  group_fragment.appendChild(option_el);
2216
- groups[optgroup] = group_fragment;
2254
+ if (optgroup != "") {
2255
+ groups[optgroup] = group_order_i;
2256
+ }
2217
2257
  }
2218
2258
  }
2219
2259
  if (self2.settings.lockOptgroupOrder) {
2220
2260
  groups_order.sort((a, b) => {
2221
- const grp_a = self2.optgroups[a];
2222
- const grp_b = self2.optgroups[b];
2223
- const a_order = grp_a && grp_a.$order || 0;
2224
- const b_order = grp_b && grp_b.$order || 0;
2225
- return a_order - b_order;
2261
+ return a.order - b.order;
2226
2262
  });
2227
2263
  }
2228
2264
  html = document.createDocumentFragment();
2229
- iterate$1(groups_order, (optgroup2) => {
2230
- let group_fragment = groups[optgroup2];
2265
+ iterate$1(groups_order, (group_order) => {
2266
+ let group_fragment = group_order.fragment;
2267
+ let optgroup2 = group_order.optgroup;
2231
2268
  if (!group_fragment || !group_fragment.children.length)
2232
2269
  return;
2233
2270
  let group_heading = self2.optgroups[optgroup2];
@@ -2638,6 +2675,7 @@ var require_tom_select_complete = __commonJS({
2638
2675
  const wrap_classList = self2.wrapper.classList;
2639
2676
  wrap_classList.toggle("focus", self2.isFocused);
2640
2677
  wrap_classList.toggle("disabled", self2.isDisabled);
2678
+ wrap_classList.toggle("readonly", self2.isReadOnly);
2641
2679
  wrap_classList.toggle("required", self2.isRequired);
2642
2680
  wrap_classList.toggle("invalid", !self2.isValid);
2643
2681
  wrap_classList.toggle("locked", isLocked);
@@ -2731,7 +2769,7 @@ var require_tom_select_complete = __commonJS({
2731
2769
  if (setTextboxValue) {
2732
2770
  self2.setTextboxValue();
2733
2771
  if (self2.settings.mode === "single" && self2.items.length) {
2734
- self2.hideInput();
2772
+ self2.inputState();
2735
2773
  }
2736
2774
  }
2737
2775
  self2.isOpen = false;
@@ -2770,7 +2808,7 @@ var require_tom_select_complete = __commonJS({
2770
2808
  iterate$1(items, (item) => {
2771
2809
  self2.removeItem(item, true);
2772
2810
  });
2773
- self2.showInput();
2811
+ self2.inputState();
2774
2812
  if (!silent)
2775
2813
  self2.updateOriginalInput();
2776
2814
  self2.trigger("clear");
@@ -2817,7 +2855,7 @@ var require_tom_select_complete = __commonJS({
2817
2855
  while (rm_items.length) {
2818
2856
  self2.removeItem(rm_items.pop());
2819
2857
  }
2820
- self2.showInput();
2858
+ self2.inputState();
2821
2859
  self2.positionDropdown();
2822
2860
  self2.refreshOptions(false);
2823
2861
  return true;
@@ -2877,29 +2915,34 @@ var require_tom_select_complete = __commonJS({
2877
2915
  return Array.from(this.control.querySelectorAll("[data-ts-item]"));
2878
2916
  }
2879
2917
  lock() {
2880
- this.isLocked = true;
2881
- this.refreshState();
2918
+ this.setLocked(true);
2882
2919
  }
2883
2920
  unlock() {
2884
- this.isLocked = false;
2921
+ this.setLocked(false);
2922
+ }
2923
+ setLocked(lock = this.isReadOnly || this.isDisabled) {
2924
+ this.isLocked = lock;
2885
2925
  this.refreshState();
2886
2926
  }
2887
2927
  disable() {
2888
- var self2 = this;
2889
- self2.input.disabled = true;
2890
- self2.control_input.disabled = true;
2891
- self2.focus_node.tabIndex = -1;
2892
- self2.isDisabled = true;
2928
+ this.setDisabled(true);
2893
2929
  this.close();
2894
- self2.lock();
2895
2930
  }
2896
2931
  enable() {
2897
- var self2 = this;
2898
- self2.input.disabled = false;
2899
- self2.control_input.disabled = false;
2900
- self2.focus_node.tabIndex = self2.tabIndex;
2901
- self2.isDisabled = false;
2902
- self2.unlock();
2932
+ this.setDisabled(false);
2933
+ }
2934
+ setDisabled(disabled) {
2935
+ this.focus_node.tabIndex = disabled ? -1 : this.tabIndex;
2936
+ this.isDisabled = disabled;
2937
+ this.input.disabled = disabled;
2938
+ this.control_input.disabled = disabled;
2939
+ this.setLocked();
2940
+ }
2941
+ setReadOnly(isReadOnly) {
2942
+ this.isReadOnly = isReadOnly;
2943
+ this.input.readOnly = isReadOnly;
2944
+ this.control_input.readOnly = isReadOnly;
2945
+ this.setLocked();
2903
2946
  }
2904
2947
  destroy() {
2905
2948
  var self2 = this;
@@ -3015,19 +3058,39 @@ var require_tom_select_complete = __commonJS({
3015
3058
  this.sync();
3016
3059
  });
3017
3060
  }
3018
- function checkbox_options() {
3061
+ function checkbox_options(userOptions) {
3019
3062
  var self2 = this;
3020
3063
  var orig_onOptionSelect = self2.onOptionSelect;
3021
3064
  self2.settings.hideSelected = false;
3065
+ const cbOptions = Object.assign({
3066
+ className: "tomselect-checkbox",
3067
+ checkedClassNames: void 0,
3068
+ uncheckedClassNames: void 0
3069
+ }, userOptions);
3070
+ var UpdateChecked = function UpdateChecked2(checkbox, toCheck) {
3071
+ if (toCheck) {
3072
+ checkbox.checked = true;
3073
+ if (cbOptions.uncheckedClassNames) {
3074
+ checkbox.classList.remove(...cbOptions.uncheckedClassNames);
3075
+ }
3076
+ if (cbOptions.checkedClassNames) {
3077
+ checkbox.classList.add(...cbOptions.checkedClassNames);
3078
+ }
3079
+ } else {
3080
+ checkbox.checked = false;
3081
+ if (cbOptions.checkedClassNames) {
3082
+ checkbox.classList.remove(...cbOptions.checkedClassNames);
3083
+ }
3084
+ if (cbOptions.uncheckedClassNames) {
3085
+ checkbox.classList.add(...cbOptions.uncheckedClassNames);
3086
+ }
3087
+ }
3088
+ };
3022
3089
  var UpdateCheckbox = function UpdateCheckbox2(option2) {
3023
3090
  setTimeout(() => {
3024
- var checkbox = option2.querySelector("input");
3091
+ var checkbox = option2.querySelector("input." + cbOptions.className);
3025
3092
  if (checkbox instanceof HTMLInputElement) {
3026
- if (option2.classList.contains("selected")) {
3027
- checkbox.checked = true;
3028
- } else {
3029
- checkbox.checked = false;
3030
- }
3093
+ UpdateChecked(checkbox, option2.classList.contains("selected"));
3031
3094
  }
3032
3095
  }, 1);
3033
3096
  };
@@ -3036,14 +3099,15 @@ var require_tom_select_complete = __commonJS({
3036
3099
  self2.settings.render.option = (data, escape_html2) => {
3037
3100
  var rendered = getDom(orig_render_option.call(self2, data, escape_html2));
3038
3101
  var checkbox = document.createElement("input");
3102
+ if (cbOptions.className) {
3103
+ checkbox.classList.add(cbOptions.className);
3104
+ }
3039
3105
  checkbox.addEventListener("click", function(evt) {
3040
3106
  preventDefault(evt);
3041
3107
  });
3042
3108
  checkbox.type = "checkbox";
3043
3109
  const hashed = hash_key(data[self2.settings.valueField]);
3044
- if (hashed && self2.items.indexOf(hashed) > -1) {
3045
- checkbox.checked = true;
3046
- }
3110
+ UpdateChecked(checkbox, !!(hashed && self2.items.indexOf(hashed) > -1));
3047
3111
  rendered.prepend(checkbox);
3048
3112
  return rendered;
3049
3113
  };
@@ -3085,9 +3149,8 @@ var require_tom_select_complete = __commonJS({
3085
3149
  self2.on("initialize", () => {
3086
3150
  var button = getDom(options.html(options));
3087
3151
  button.addEventListener("click", (evt) => {
3088
- if (self2.isDisabled) {
3152
+ if (self2.isLocked)
3089
3153
  return;
3090
- }
3091
3154
  self2.clear();
3092
3155
  if (self2.settings.mode === "single" && self2.settings.allowEmptyOption) {
3093
3156
  self2.addItem("");
@@ -3098,50 +3161,100 @@ var require_tom_select_complete = __commonJS({
3098
3161
  self2.control.appendChild(button);
3099
3162
  });
3100
3163
  }
3164
+ const insertAfter = (referenceNode, newNode) => {
3165
+ var _referenceNode$parent;
3166
+ (_referenceNode$parent = referenceNode.parentNode) == null || _referenceNode$parent.insertBefore(newNode, referenceNode.nextSibling);
3167
+ };
3168
+ const insertBefore = (referenceNode, newNode) => {
3169
+ var _referenceNode$parent2;
3170
+ (_referenceNode$parent2 = referenceNode.parentNode) == null || _referenceNode$parent2.insertBefore(newNode, referenceNode);
3171
+ };
3172
+ const isBefore = (referenceNode, newNode) => {
3173
+ do {
3174
+ var _newNode;
3175
+ newNode = (_newNode = newNode) == null ? void 0 : _newNode.previousElementSibling;
3176
+ if (referenceNode == newNode) {
3177
+ return true;
3178
+ }
3179
+ } while (newNode && newNode.previousElementSibling);
3180
+ return false;
3181
+ };
3101
3182
  function drag_drop() {
3102
3183
  var self2 = this;
3103
- if (!$.fn.sortable)
3104
- throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');
3105
3184
  if (self2.settings.mode !== "multi")
3106
3185
  return;
3107
3186
  var orig_lock = self2.lock;
3108
3187
  var orig_unlock = self2.unlock;
3188
+ let sortable = true;
3189
+ let drag_item;
3190
+ self2.hook("after", "setupTemplates", () => {
3191
+ var orig_render_item = self2.settings.render.item;
3192
+ self2.settings.render.item = (data, escape) => {
3193
+ const item = getDom(orig_render_item.call(self2, data, escape));
3194
+ setAttr(item, {
3195
+ "draggable": "true"
3196
+ });
3197
+ const mousedown = (evt) => {
3198
+ if (!sortable)
3199
+ preventDefault(evt);
3200
+ evt.stopPropagation();
3201
+ };
3202
+ const dragStart2 = (evt) => {
3203
+ drag_item = item;
3204
+ setTimeout(() => {
3205
+ item.classList.add("ts-dragging");
3206
+ }, 0);
3207
+ };
3208
+ const dragOver = (evt) => {
3209
+ evt.preventDefault();
3210
+ item.classList.add("ts-drag-over");
3211
+ moveitem(item, drag_item);
3212
+ };
3213
+ const dragLeave = () => {
3214
+ item.classList.remove("ts-drag-over");
3215
+ };
3216
+ const moveitem = (targetitem, dragitem) => {
3217
+ if (dragitem === void 0)
3218
+ return;
3219
+ if (isBefore(dragitem, item)) {
3220
+ insertAfter(targetitem, dragitem);
3221
+ } else {
3222
+ insertBefore(targetitem, dragitem);
3223
+ }
3224
+ };
3225
+ const dragend = () => {
3226
+ var _drag_item;
3227
+ document.querySelectorAll(".ts-drag-over").forEach((el) => el.classList.remove("ts-drag-over"));
3228
+ (_drag_item = drag_item) == null || _drag_item.classList.remove("ts-dragging");
3229
+ drag_item = void 0;
3230
+ var values = [];
3231
+ self2.control.querySelectorAll(`[data-value]`).forEach((el) => {
3232
+ if (el.dataset.value) {
3233
+ let value = el.dataset.value;
3234
+ if (value) {
3235
+ values.push(value);
3236
+ }
3237
+ }
3238
+ });
3239
+ self2.setValue(values);
3240
+ };
3241
+ addEvent(item, "mousedown", mousedown);
3242
+ addEvent(item, "dragstart", dragStart2);
3243
+ addEvent(item, "dragenter", dragOver);
3244
+ addEvent(item, "dragover", dragOver);
3245
+ addEvent(item, "dragleave", dragLeave);
3246
+ addEvent(item, "dragend", dragend);
3247
+ return item;
3248
+ };
3249
+ });
3109
3250
  self2.hook("instead", "lock", () => {
3110
- var sortable = $(self2.control).data("sortable");
3111
- if (sortable)
3112
- sortable.disable();
3251
+ sortable = false;
3113
3252
  return orig_lock.call(self2);
3114
3253
  });
3115
3254
  self2.hook("instead", "unlock", () => {
3116
- var sortable = $(self2.control).data("sortable");
3117
- if (sortable)
3118
- sortable.enable();
3255
+ sortable = true;
3119
3256
  return orig_unlock.call(self2);
3120
3257
  });
3121
- self2.on("initialize", () => {
3122
- var $control = $(self2.control).sortable({
3123
- items: "[data-value]",
3124
- forcePlaceholderSize: true,
3125
- disabled: self2.isLocked,
3126
- start: (e, ui) => {
3127
- ui.placeholder.css("width", ui.helper.css("width"));
3128
- $control.css({
3129
- overflow: "visible"
3130
- });
3131
- },
3132
- stop: () => {
3133
- $control.css({
3134
- overflow: "hidden"
3135
- });
3136
- var values = [];
3137
- $control.children("[data-value]").each(function() {
3138
- if (this.dataset.value)
3139
- values.push(this.dataset.value);
3140
- });
3141
- self2.setValue(values);
3142
- }
3143
- });
3144
- });
3145
3258
  }
3146
3259
  function dropdown_header(userOptions) {
3147
3260
  const self2 = this;
@@ -3341,6 +3454,8 @@ var require_tom_select_complete = __commonJS({
3341
3454
  preventDefault(evt, true);
3342
3455
  });
3343
3456
  addEvent(close_button, "click", (evt) => {
3457
+ if (self2.isLocked)
3458
+ return;
3344
3459
  preventDefault(evt, true);
3345
3460
  if (self2.isLocked)
3346
3461
  return;
@@ -3431,9 +3546,12 @@ var require_tom_select_complete = __commonJS({
3431
3546
  pagination[query] = false;
3432
3547
  return next_url;
3433
3548
  }
3434
- pagination = {};
3549
+ self2.clearPagination();
3435
3550
  return self2.settings.firstUrl.call(self2, query);
3436
3551
  };
3552
+ self2.clearPagination = () => {
3553
+ pagination = {};
3554
+ };
3437
3555
  self2.hook("instead", "clearActiveOption", () => {
3438
3556
  if (loading_more) {
3439
3557
  return;
@@ -9185,11 +9303,11 @@ function scrollBy(el, x, y) {
9185
9303
  }
9186
9304
  function clone(el) {
9187
9305
  var Polymer = window.Polymer;
9188
- var $2 = window.jQuery || window.Zepto;
9306
+ var $ = window.jQuery || window.Zepto;
9189
9307
  if (Polymer && Polymer.dom) {
9190
9308
  return Polymer.dom(el).cloneNode(true);
9191
- } else if ($2) {
9192
- return $2(el).clone(true)[0];
9309
+ } else if ($) {
9310
+ return $(el).clone(true)[0];
9193
9311
  } else {
9194
9312
  return el.cloneNode(true);
9195
9313
  }
@@ -13110,33 +13228,18 @@ __publicField(preview_controller_default, "values", {
13110
13228
  url: String
13111
13229
  });
13112
13230
 
13113
- // app/assets/javascripts/formstrap/controllers/redactorx_controller.js
13114
- var redactorx_controller_default = class extends Controller {
13231
+ // app/assets/javascripts/formstrap/controllers/redactor_controller.js
13232
+ var redactor_controller_default = class extends Controller {
13115
13233
  connect() {
13116
13234
  this.initRedactor();
13117
13235
  }
13118
13236
  initRedactor() {
13119
- if (typeof RedactorX === "undefined") {
13120
- console.error("RedactorX is a paid module and is not included in Headmin. Please purchase it and import it as a JS module");
13237
+ if (typeof Redactor === "undefined") {
13238
+ console.error("Redactor is a paid module and is not included in Headmin. Please purchase it and import it as a JS module");
13121
13239
  return false;
13122
13240
  }
13123
- const defaultOptions = {
13124
- editor: {
13125
- minHeight: "57px"
13126
- },
13127
- subscribe: {
13128
- "app.start": () => {
13129
- this.stylize();
13130
- }
13131
- }
13132
- };
13133
13241
  const options = JSON.parse(this.element.getAttribute("data-redactor-options"));
13134
- RedactorX(this.element, { ...defaultOptions, ...options });
13135
- }
13136
- stylize() {
13137
- const container = this.element.nextElementSibling;
13138
- const inputClasses = this.element.classList;
13139
- container.classList.add(...inputClasses);
13242
+ Redactor(this.element, options);
13140
13243
  }
13141
13244
  };
13142
13245
 
@@ -13288,36 +13391,39 @@ var select_controller_default = class extends Controller {
13288
13391
  this.initTomSelect();
13289
13392
  }
13290
13393
  }
13291
- defaultOptions(locale) {
13292
- const defaultOptions = {
13394
+ defaultOptions() {
13395
+ return {
13396
+ plugins: ["drag_drop", "caret_position", "input_autogrow"],
13397
+ persist: false,
13398
+ create: true,
13399
+ render: this.renderOptions()[i18n_default.locale]
13400
+ };
13401
+ }
13402
+ renderOptions() {
13403
+ return {
13293
13404
  en: {
13294
- render: {
13295
- option_create: function(data, escape) {
13296
- return '<div class="create">Add <strong>' + escape(data.input) + "</strong>&hellip;</div>";
13297
- },
13298
- no_results: function(data, escape) {
13299
- return '<div class="no-results">No results found</div>';
13300
- }
13405
+ option_create: function(data, escape) {
13406
+ return '<div class="create">Add <strong>' + escape(data.input) + "</strong>&hellip;</div>";
13407
+ },
13408
+ no_results: function(data, escape) {
13409
+ return '<div class="no-results">No results found</div>';
13301
13410
  }
13302
13411
  },
13303
13412
  nl: {
13304
- render: {
13305
- option_create: function(data, escape) {
13306
- return '<div class="create">Voeg <strong>' + escape(data.input) + "</strong> toe &hellip;</div>";
13307
- },
13308
- no_results: function(data, escape) {
13309
- return '<div class="no-results">Geen resultaten gevonden</div>';
13310
- }
13413
+ option_create: function(data, escape) {
13414
+ return '<div class="create">Voeg <strong>' + escape(data.input) + "</strong> toe &hellip;</div>";
13415
+ },
13416
+ no_results: function(data, escape) {
13417
+ return '<div class="no-results">Geen resultaten gevonden</div>';
13311
13418
  }
13312
13419
  }
13313
13420
  };
13314
- return defaultOptions[locale];
13315
13421
  }
13316
13422
  hasTags() {
13317
13423
  return this.element.dataset.tags === "true";
13318
13424
  }
13319
13425
  initTomSelect() {
13320
- const defaultOptions = this.defaultOptions(i18n_default.locale);
13426
+ const defaultOptions = this.defaultOptions();
13321
13427
  const options = { create: this.hasTags() };
13322
13428
  new import_tom_select.default(this.element, { ...defaultOptions, ...options });
13323
13429
  }
@@ -13363,6 +13469,1047 @@ function onVisible(element, callback) {
13363
13469
  }).observe(element);
13364
13470
  }
13365
13471
 
13472
+ // app/assets/javascripts/formstrap/vendor/redactor/i18n/nl.js
13473
+ Redactor.lang.nl = {
13474
+ accessibility: {
13475
+ "help-label": "Rijke teksteditor"
13476
+ },
13477
+ placeholders: {
13478
+ figcaption: "Type onderschrift (optioneel)"
13479
+ },
13480
+ modal: {
13481
+ link: "Link",
13482
+ image: "Afbeelding",
13483
+ "add-image": "Afbeelding toevoegen"
13484
+ },
13485
+ embed: {
13486
+ embed: "Insluiten",
13487
+ caption: "Onderschrift",
13488
+ description: "Plak een embed/html-code of voer de url in (alleen vimeo of youtube-video)",
13489
+ "responsive-video": "Responsieve video"
13490
+ },
13491
+ image: {
13492
+ or: "of",
13493
+ "alt-text": "Alt-tekst",
13494
+ link: "Link",
13495
+ width: "Breedte",
13496
+ caption: "Onderschrift",
13497
+ "link-in-new-tab": "Link openen in een nieuw tabblad",
13498
+ "url-placeholder": "Plak url van afbeelding...",
13499
+ "upload-new-placeholder": "Sleep om een nieuwe afbeelding te uploaden<br>of klik om te selecteren"
13500
+ },
13501
+ link: {
13502
+ link: "Link",
13503
+ "edit-link": "Link bewerken",
13504
+ unlink: "Link verwijderen",
13505
+ "link-in-new-tab": "Link openen in een nieuw tabblad",
13506
+ text: "Tekst",
13507
+ url: "URL"
13508
+ },
13509
+ table: {
13510
+ width: "Breedte",
13511
+ nowrap: "Niet afbreken",
13512
+ "table-cell": "Tabelcel",
13513
+ "select-table": "Selecteer tabel",
13514
+ "select-cell": "Selecteer cel",
13515
+ "cell-setting": "Celinstelling",
13516
+ "add-head": "Kop toevoegen",
13517
+ "remove-head": "Kop verwijderen",
13518
+ "add-row-below": "Rij hieronder toevoegen",
13519
+ "add-row-above": "Rij hierboven toevoegen",
13520
+ "remove-row": "Rij verwijderen",
13521
+ "add-column-after": "Kolom rechts toevoegen",
13522
+ "add-column-before": "Kolom links toevoegen",
13523
+ "remove-column": "Kolom verwijderen",
13524
+ "delete-table": "Tabel verwijderen"
13525
+ },
13526
+ buttons: {
13527
+ add: "Toevoegen",
13528
+ insert: "Invoegen",
13529
+ save: "Opslaan",
13530
+ cancel: "Annuleren",
13531
+ delete: "Verwijderen",
13532
+ "ai-tools": "AI-tools",
13533
+ "ai-image": "AI-afbeelding",
13534
+ html: "HTML",
13535
+ format: "Formaat",
13536
+ bold: "Vet",
13537
+ italic: "Cursief",
13538
+ deleted: "Verwijderd",
13539
+ "more-formatting": "Meer opmaak",
13540
+ link: "Link",
13541
+ "link-text": "Linktekst",
13542
+ unlink: "Link verwijderen",
13543
+ image: "Afbeelding",
13544
+ unwrap: "Uitpakken",
13545
+ outset: "Uitspringen",
13546
+ "wrap-image": "Afbeelding omwikkelen",
13547
+ "move-up": "Naar boven verplaatsen",
13548
+ "move-down": "Naar beneden verplaatsen",
13549
+ list: "Lijst",
13550
+ "numbered-list": "Genummerde lijst",
13551
+ "bullet-list": "Lijst met opsommingstekens",
13552
+ indent: "Inspringen",
13553
+ outdent: "Uitspringen",
13554
+ "definition-list": "Definitielijst",
13555
+ hotkeys: "Sneltoetsen",
13556
+ undo: "Ongedaan maken",
13557
+ redo: "Opnieuw doen",
13558
+ toggle: "Schakelen",
13559
+ duplicate: "Dupliceren",
13560
+ table: "Tabel",
13561
+ embed: "Insluiten",
13562
+ quote: "Citaat",
13563
+ layout: "Lay-out",
13564
+ wrapper: "Wrapper",
13565
+ todo: "Takenlijst",
13566
+ "code-snippet": "Codefragment",
13567
+ line: "Lijn",
13568
+ parent: "Bovenliggend",
13569
+ code: "Code",
13570
+ underline: "Onderstrepen",
13571
+ highlight: "Markeren",
13572
+ superscript: "Superscript",
13573
+ subscript: "Subscript",
13574
+ "clear-all-styles": "Alle stijlen verwijderen",
13575
+ heading: "Kop",
13576
+ text: "Tekst",
13577
+ address: "Adres"
13578
+ },
13579
+ colorpicker: {
13580
+ "remove-color": "Kleur verwijderen",
13581
+ "remove-background": "Achtergrondkleur verwijderen",
13582
+ color: "Kleur",
13583
+ background: "Achtergrond",
13584
+ "set-color": "Kleur instellen"
13585
+ },
13586
+ ai: {
13587
+ "placeholder-image": "Beschrijf de afbeelding die je wilt genereren.",
13588
+ "placeholder-text": "Vertel me wat je wilt schrijven.",
13589
+ send: "Versturen",
13590
+ stop: "Stoppen",
13591
+ discard: "Verwerpen",
13592
+ insert: "Invoegen",
13593
+ prompt: "Prompt"
13594
+ },
13595
+ pathbar: {
13596
+ title: "Inhoud"
13597
+ },
13598
+ layout: {
13599
+ "single-column": "E\xE9n kolom",
13600
+ "two-columns": "Twee kolommen",
13601
+ "three-columns": "Drie kolommen",
13602
+ "four-columns": "Vier kolommen"
13603
+ },
13604
+ outset: {
13605
+ "outset-none": "Geen uitspringen",
13606
+ "outset-left": "Uitspringen links",
13607
+ "outset-both": "Aan beide zijden uitspringen",
13608
+ "outset-right": "Uitspringen rechts"
13609
+ },
13610
+ wrap: {
13611
+ "wrap-none": "Geen omwikkelen",
13612
+ "wrap-left": "Links omwikkelen",
13613
+ "wrap-center": "Centraal omwikkelen",
13614
+ "wrap-right": "Rechts omwikkelen"
13615
+ },
13616
+ blocks: {
13617
+ address: "Adres",
13618
+ cell: "Cel",
13619
+ column: "Kolom",
13620
+ dlist: "Definitielijst",
13621
+ embed: "Insluiten",
13622
+ figcaption: "Figcaption",
13623
+ heading: "Kop",
13624
+ image: "Afbeelding",
13625
+ wrapper: "Wrapper",
13626
+ layout: "Lay-out",
13627
+ line: "Lijn",
13628
+ list: "Lijst",
13629
+ listitem: "Item",
13630
+ noneditable: "Niet-bewerkbaar",
13631
+ pre: "Pre",
13632
+ quote: "Citaat",
13633
+ row: "Rij",
13634
+ table: "Tabel",
13635
+ text: "Tekst",
13636
+ todo: "Takenlijst",
13637
+ todoitem: "Item",
13638
+ mergetag: "Samenvoegtag"
13639
+ },
13640
+ hotkeys: {
13641
+ "meta-shift-a": "Tekst in het blok selecteren",
13642
+ "meta-a": "Alle blokken selecteren",
13643
+ "meta-z": "Ongedaan maken",
13644
+ "meta-shift-z": "Opnieuw doen",
13645
+ "meta-shift-m": "Inline opmaak verwijderen",
13646
+ "meta-b": "Vet",
13647
+ "meta-i": "Cursief",
13648
+ "meta-u": "Onderstrepen",
13649
+ "meta-h": "Superscript",
13650
+ "meta-l": "Subscript",
13651
+ "meta-k": "Link",
13652
+ "meta-alt-0": "Normale tekst",
13653
+ "meta-alt-1": "Kop 1",
13654
+ "meta-alt-2": "Kop 2",
13655
+ "meta-alt-3": "Kop 3",
13656
+ "meta-alt-4": "Kop 4",
13657
+ "meta-alt-5": "Kop 5",
13658
+ "meta-alt-6": "Kop 6",
13659
+ "meta-shift-7": "Genummerde lijst",
13660
+ "meta-shift-8": "Lijst met opsommingstekens",
13661
+ "meta-indent": "Inspringen",
13662
+ "meta-outdent": "Uitspringen",
13663
+ "meta-shift-backspace": "Blok verwijderen",
13664
+ "meta-shift-o": "Blok toevoegen",
13665
+ "meta-shift-d": "Blok dupliceren",
13666
+ "meta-shift-up": "Lijn omhoog verplaatsen",
13667
+ "meta-shift-down": "Lijn omlaag verplaatsen"
13668
+ },
13669
+ emoji: {
13670
+ emoji: "Emoji",
13671
+ favorites: "Favorieten",
13672
+ smileys: "Smiley's",
13673
+ gestures: "Gebaren",
13674
+ animals: "Dieren",
13675
+ food: "Eten",
13676
+ activities: "Activiteiten",
13677
+ travel: "Reizen"
13678
+ },
13679
+ linkstyles: {
13680
+ label: "Stijlen",
13681
+ link: "Link",
13682
+ primary: "Primaire knop",
13683
+ secondary: "Secundaire knop"
13684
+ }
13685
+ };
13686
+
13687
+ // app/assets/javascripts/formstrap/vendor/redactor/i18n/fr.js
13688
+ Redactor.lang.fr = {
13689
+ accessibility: {
13690
+ "help-label": "\xC9diteur de texte enrichi"
13691
+ },
13692
+ placeholders: {
13693
+ figcaption: "Entrez la l\xE9gende (facultatif)"
13694
+ },
13695
+ modal: {
13696
+ link: "Lien",
13697
+ image: "Image",
13698
+ "add-image": "Ajouter une image"
13699
+ },
13700
+ embed: {
13701
+ embed: "Int\xE9grer",
13702
+ caption: "L\xE9gende",
13703
+ description: "Collez un code d'int\xE9gration/html ou saisissez l'URL (vid\xE9o Vimeo ou YouTube uniquement)",
13704
+ "responsive-video": "Vid\xE9o responsive"
13705
+ },
13706
+ image: {
13707
+ or: "ou",
13708
+ "alt-text": "Texte alternatif",
13709
+ link: "Lien",
13710
+ width: "Largeur",
13711
+ caption: "L\xE9gende",
13712
+ "link-in-new-tab": "Ouvrir le lien dans un nouvel onglet",
13713
+ "url-placeholder": "Collez l'URL de l'image...",
13714
+ "upload-new-placeholder": "Glissez pour t\xE9l\xE9charger une nouvelle image<br>ou cliquez pour s\xE9lectionner"
13715
+ },
13716
+ link: {
13717
+ link: "Lien",
13718
+ "edit-link": "Modifier le lien",
13719
+ unlink: "Supprimer le lien",
13720
+ "link-in-new-tab": "Ouvrir le lien dans un nouvel onglet",
13721
+ text: "Texte",
13722
+ url: "URL"
13723
+ },
13724
+ table: {
13725
+ width: "Largeur",
13726
+ nowrap: "Pas de retour \xE0 la ligne",
13727
+ "table-cell": "Cellule de tableau",
13728
+ "select-table": "S\xE9lectionner le tableau",
13729
+ "select-cell": "S\xE9lectionner la cellule",
13730
+ "cell-setting": "Param\xE8tres de la cellule",
13731
+ "add-head": "Ajouter une en-t\xEAte",
13732
+ "remove-head": "Supprimer l'en-t\xEAte",
13733
+ "add-row-below": "Ajouter une ligne en dessous",
13734
+ "add-row-above": "Ajouter une ligne au-dessus",
13735
+ "remove-row": "Supprimer la ligne",
13736
+ "add-column-after": "Ajouter une colonne apr\xE8s",
13737
+ "add-column-before": "Ajouter une colonne avant",
13738
+ "remove-column": "Supprimer la colonne",
13739
+ "delete-table": "Supprimer le tableau"
13740
+ },
13741
+ buttons: {
13742
+ add: "Ajouter",
13743
+ insert: "Ins\xE9rer",
13744
+ save: "Enregistrer",
13745
+ cancel: "Annuler",
13746
+ delete: "Supprimer",
13747
+ "ai-tools": "Outils IA",
13748
+ "ai-image": "Image IA",
13749
+ html: "HTML",
13750
+ format: "Format",
13751
+ bold: "Gras",
13752
+ italic: "Italique",
13753
+ deleted: "Barr\xE9",
13754
+ "more-formatting": "Plus de mise en forme",
13755
+ link: "Lien",
13756
+ "link-text": "Texte du lien",
13757
+ unlink: "Supprimer le lien",
13758
+ image: "Image",
13759
+ unwrap: "D\xE9faire",
13760
+ outset: "Souligner",
13761
+ "wrap-image": "Envelopper l'image",
13762
+ "move-up": "D\xE9placer vers le haut",
13763
+ "move-down": "D\xE9placer vers le bas",
13764
+ list: "Liste",
13765
+ "numbered-list": "Liste num\xE9rot\xE9e",
13766
+ "bullet-list": "Liste \xE0 puces",
13767
+ indent: "Retrait",
13768
+ outdent: "D\xE9calage n\xE9gatif",
13769
+ "definition-list": "Liste de d\xE9finition",
13770
+ hotkeys: "Raccourcis clavier",
13771
+ undo: "Annuler",
13772
+ redo: "Refaire",
13773
+ toggle: "Basculer",
13774
+ duplicate: "Dupliquer",
13775
+ table: "Tableau",
13776
+ embed: "Int\xE9grer",
13777
+ quote: "Citation",
13778
+ layout: "Disposition",
13779
+ wrapper: "Enveloppe",
13780
+ todo: "\xC0 faire",
13781
+ "code-snippet": "Extrait de code",
13782
+ line: "Ligne",
13783
+ parent: "Parent",
13784
+ code: "Code",
13785
+ underline: "Souligner",
13786
+ highlight: "Surligner",
13787
+ superscript: "Exposant",
13788
+ subscript: "Indice",
13789
+ "clear-all-styles": "Effacer tous les styles",
13790
+ heading: "Titre",
13791
+ text: "Texte",
13792
+ address: "Adresse"
13793
+ },
13794
+ colorpicker: {
13795
+ "remove-color": "Supprimer la couleur",
13796
+ "remove-background": "Supprimer la couleur de fond",
13797
+ color: "Couleur",
13798
+ background: "Arri\xE8re-plan",
13799
+ "set-color": "D\xE9finir la couleur"
13800
+ },
13801
+ ai: {
13802
+ "placeholder-image": "D\xE9crivez l'image que vous souhaitez g\xE9n\xE9rer.",
13803
+ "placeholder-text": "Dites-moi ce que vous voulez \xE9crire.",
13804
+ send: "Envoyer",
13805
+ stop: "Arr\xEAter",
13806
+ discard: "Ignorer",
13807
+ insert: "Ins\xE9rer",
13808
+ prompt: "Invite"
13809
+ },
13810
+ pathbar: {
13811
+ title: "Corps"
13812
+ },
13813
+ layout: {
13814
+ "single-column": "Une colonne",
13815
+ "two-columns": "Deux colonnes",
13816
+ "three-columns": "Trois colonnes",
13817
+ "four-columns": "Quatre colonnes"
13818
+ },
13819
+ outset: {
13820
+ "outset-none": "Aucun soulignement",
13821
+ "outset-left": "Souligner \xE0 gauche",
13822
+ "outset-both": "Souligner des deux c\xF4t\xE9s",
13823
+ "outset-right": "Souligner \xE0 droite"
13824
+ },
13825
+ wrap: {
13826
+ "wrap-none": "Aucune enveloppe",
13827
+ "wrap-left": "Envelopper \xE0 gauche",
13828
+ "wrap-center": "Envelopper au centre",
13829
+ "wrap-right": "Envelopper \xE0 droite"
13830
+ },
13831
+ blocks: {
13832
+ address: "Adresse",
13833
+ cell: "Cellule",
13834
+ column: "Colonne",
13835
+ dlist: "Liste de d\xE9finition",
13836
+ embed: "Int\xE9grer",
13837
+ figcaption: "L\xE9gende",
13838
+ heading: "Titre",
13839
+ image: "Image",
13840
+ wrapper: "Enveloppe",
13841
+ layout: "Disposition",
13842
+ line: "Ligne",
13843
+ list: "Liste",
13844
+ listitem: "\xC9l\xE9ment",
13845
+ noneditable: "Non \xE9ditable",
13846
+ pre: "Pr\xE9format\xE9",
13847
+ quote: "Citation",
13848
+ row: "Ligne",
13849
+ table: "Tableau",
13850
+ text: "Texte",
13851
+ todo: "\xC0 faire",
13852
+ todoitem: "\xC9l\xE9ment \xE0 faire",
13853
+ mergetag: "Balise de fusion"
13854
+ },
13855
+ hotkeys: {
13856
+ "meta-shift-a": "S\xE9lectionner le texte dans le bloc",
13857
+ "meta-a": "S\xE9lectionner tous les blocs",
13858
+ "meta-z": "Annuler",
13859
+ "meta-shift-z": "R\xE9tablir",
13860
+ "meta-shift-m": "Supprimer le format en ligne",
13861
+ "meta-b": "Gras",
13862
+ "meta-i": "Italique",
13863
+ "meta-u": "Souligner",
13864
+ "meta-h": "Exposant",
13865
+ "meta-l": "Indice",
13866
+ "meta-k": "Lien",
13867
+ "meta-alt-0": "Texte normal",
13868
+ "meta-alt-1": "Titre 1",
13869
+ "meta-alt-2": "Titre 2",
13870
+ "meta-alt-3": "Titre 3",
13871
+ "meta-alt-4": "Titre 4",
13872
+ "meta-alt-5": "Titre 5",
13873
+ "meta-alt-6": "Titre 6",
13874
+ "meta-shift-7": "Liste num\xE9rot\xE9e",
13875
+ "meta-shift-8": "Liste \xE0 puces",
13876
+ "meta-indent": "Retrait",
13877
+ "meta-outdent": "D\xE9calage n\xE9gatif",
13878
+ "meta-shift-backspace": "Supprimer le bloc",
13879
+ "meta-shift-o": "Ajouter un bloc",
13880
+ "meta-shift-d": "Dupliquer le bloc",
13881
+ "meta-shift-up": "D\xE9placer la ligne vers le haut",
13882
+ "meta-shift-down": "D\xE9placer la ligne vers le bas"
13883
+ },
13884
+ emoji: {
13885
+ emoji: "Emoji",
13886
+ favorites: "Favoris",
13887
+ smileys: "Smileys",
13888
+ gestures: "Gestes",
13889
+ animals: "Animaux",
13890
+ food: "Nourriture",
13891
+ activities: "Activit\xE9s",
13892
+ travel: "Voyages"
13893
+ },
13894
+ linkstyles: {
13895
+ label: "Styles",
13896
+ link: "Lien",
13897
+ primary: "Bouton primaire",
13898
+ secondary: "Bouton secondaire"
13899
+ }
13900
+ };
13901
+
13902
+ // app/assets/javascripts/formstrap/vendor/redactor/i18n/de.js
13903
+ Redactor.lang.de = {
13904
+ accessibility: {
13905
+ "help-label": "Texteditor"
13906
+ },
13907
+ placeholders: {
13908
+ figcaption: "Beschreibung eingeben (optional)"
13909
+ },
13910
+ modal: {
13911
+ link: "Link",
13912
+ image: "Bild",
13913
+ "add-image": "Bild hinzuf\xFCgen"
13914
+ },
13915
+ embed: {
13916
+ embed: "Einbetten",
13917
+ caption: "Beschriftung",
13918
+ description: "F\xFCgen Sie einen Einbettungscode ein oder geben Sie die URL ein (nur Vimeo- oder YouTube-Video)",
13919
+ "responsive-video": "Responsives Video"
13920
+ },
13921
+ image: {
13922
+ or: "oder",
13923
+ "alt-text": "Alternativer Text",
13924
+ link: "Link",
13925
+ width: "Breite",
13926
+ caption: "Beschriftung",
13927
+ "link-in-new-tab": "Link in neuem Tab \xF6ffnen",
13928
+ "url-placeholder": "URL des Bildes einf\xFCgen...",
13929
+ "upload-new-placeholder": "Zum Hochladen eines neuen Bildes ziehen<br>oder klicken Sie, um auszuw\xE4hlen"
13930
+ },
13931
+ link: {
13932
+ link: "Link",
13933
+ "edit-link": "Link bearbeiten",
13934
+ unlink: "Link entfernen",
13935
+ "link-in-new-tab": "Link in neuem Tab \xF6ffnen",
13936
+ text: "Text",
13937
+ url: "URL"
13938
+ },
13939
+ table: {
13940
+ width: "Breite",
13941
+ nowrap: "Kein Zeilenumbruch",
13942
+ "table-cell": "Tabellenzelle",
13943
+ "select-table": "Tabelle ausw\xE4hlen",
13944
+ "select-cell": "Zelle ausw\xE4hlen",
13945
+ "cell-setting": "Zelleinstellung",
13946
+ "add-head": "Kopfzeile hinzuf\xFCgen",
13947
+ "remove-head": "Kopfzeile entfernen",
13948
+ "add-row-below": "Zeile unten hinzuf\xFCgen",
13949
+ "add-row-above": "Zeile oben hinzuf\xFCgen",
13950
+ "remove-row": "Zeile entfernen",
13951
+ "add-column-after": "Spalte danach hinzuf\xFCgen",
13952
+ "add-column-before": "Spalte davor hinzuf\xFCgen",
13953
+ "remove-column": "Spalte entfernen",
13954
+ "delete-table": "Tabelle l\xF6schen"
13955
+ },
13956
+ buttons: {
13957
+ add: "Hinzuf\xFCgen",
13958
+ insert: "Einf\xFCgen",
13959
+ save: "Speichern",
13960
+ cancel: "Abbrechen",
13961
+ delete: "L\xF6schen",
13962
+ "ai-tools": "KI-Werkzeuge",
13963
+ "ai-image": "KI-Bild",
13964
+ html: "HTML",
13965
+ format: "Format",
13966
+ bold: "Fett",
13967
+ italic: "Kursiv",
13968
+ deleted: "Durchgestrichen",
13969
+ "more-formatting": "Weitere Formatierungen",
13970
+ link: "Link",
13971
+ "link-text": "Linktext",
13972
+ unlink: "Link entfernen",
13973
+ image: "Bild",
13974
+ unwrap: "Formatierung aufheben",
13975
+ outset: "Hervorhebung",
13976
+ "wrap-image": "Bild einrahmen",
13977
+ "move-up": "Nach oben verschieben",
13978
+ "move-down": "Nach unten verschieben",
13979
+ list: "Liste",
13980
+ "numbered-list": "Nummerierte Liste",
13981
+ "bullet-list": "Aufz\xE4hlung",
13982
+ indent: "Einr\xFCcken",
13983
+ outdent: "Ausr\xFCcken",
13984
+ "definition-list": "Definitionslite",
13985
+ hotkeys: "Tastenkombinationen",
13986
+ undo: "R\xFCckg\xE4ngig machen",
13987
+ redo: "Wiederherstellen",
13988
+ toggle: "Umschalten",
13989
+ duplicate: "Duplizieren",
13990
+ table: "Tabelle",
13991
+ embed: "Einbetten",
13992
+ quote: "Zitat",
13993
+ layout: "Layout",
13994
+ wrapper: "Umschlag",
13995
+ todo: "Aufgabe",
13996
+ "code-snippet": "Code-Schnipsel",
13997
+ line: "Linie",
13998
+ parent: "Elternteil",
13999
+ code: "Code",
14000
+ underline: "Unterstreichen",
14001
+ highlight: "Hervorheben",
14002
+ superscript: "Hochgestellt",
14003
+ subscript: "Tiefgestellt",
14004
+ "clear-all-styles": "Alle Stile l\xF6schen",
14005
+ heading: "\xDCberschrift",
14006
+ text: "Text",
14007
+ address: "Adresse"
14008
+ },
14009
+ colorpicker: {
14010
+ "remove-color": "Farbe entfernen",
14011
+ "remove-background": "Hintergrundfarbe entfernen",
14012
+ color: "Farbe",
14013
+ background: "Hintergrund",
14014
+ "set-color": "Farbe einstellen"
14015
+ },
14016
+ ai: {
14017
+ "placeholder-image": "Beschreiben Sie das Bild, das Sie generieren m\xF6chten.",
14018
+ "placeholder-text": "Sagen Sie mir, was Sie schreiben m\xF6chten.",
14019
+ send: "Senden",
14020
+ stop: "Stoppen",
14021
+ discard: "Verwerfen",
14022
+ insert: "Einf\xFCgen",
14023
+ prompt: "Aufforderung"
14024
+ },
14025
+ pathbar: {
14026
+ title: "K\xF6rper"
14027
+ },
14028
+ layout: {
14029
+ "single-column": "Eine Spalte",
14030
+ "two-columns": "Zwei Spalten",
14031
+ "three-columns": "Drei Spalten",
14032
+ "four-columns": "Vier Spalten"
14033
+ },
14034
+ outset: {
14035
+ "outset-none": "Keine Hervorhebung",
14036
+ "outset-left": "Hervorhebung links",
14037
+ "outset-both": "Hervorhebung beidseitig",
14038
+ "outset-right": "Hervorhebung rechts"
14039
+ },
14040
+ wrap: {
14041
+ "wrap-none": "Kein Einrahmen",
14042
+ "wrap-left": "Links einrahmen",
14043
+ "wrap-center": "Zentriert einrahmen",
14044
+ "wrap-right": "Rechts einrahmen"
14045
+ },
14046
+ blocks: {
14047
+ address: "Adresse",
14048
+ cell: "Zelle",
14049
+ column: "Spalte",
14050
+ dlist: "Definitionenliste",
14051
+ embed: "Einbetten",
14052
+ figcaption: "Beschriftung",
14053
+ heading: "\xDCberschrift",
14054
+ image: "Bild",
14055
+ wrapper: "Umschlag",
14056
+ layout: "Layout",
14057
+ line: "Linie",
14058
+ list: "Liste",
14059
+ listitem: "Element",
14060
+ noneditable: "Nicht bearbeitbar",
14061
+ pre: "Vorformatiert",
14062
+ quote: "Zitat",
14063
+ row: "Zeile",
14064
+ table: "Tabelle",
14065
+ text: "Text",
14066
+ todo: "Aufgabe",
14067
+ todoitem: "Element",
14068
+ mergetag: "Zusammenf\xFChrungszeichen"
14069
+ },
14070
+ hotkeys: {
14071
+ "meta-shift-a": "Text im Block ausw\xE4hlen",
14072
+ "meta-a": "Alle Bl\xF6cke ausw\xE4hlen",
14073
+ "meta-z": "R\xFCckg\xE4ngig machen",
14074
+ "meta-shift-z": "Wiederherstellen",
14075
+ "meta-shift-m": "Inline-Formatierung entfernen",
14076
+ "meta-b": "Fett",
14077
+ "meta-i": "Kursiv",
14078
+ "meta-u": "Unterstreichen",
14079
+ "meta-h": "Hochgestellt",
14080
+ "meta-l": "Tiefgestellt",
14081
+ "meta-k": "Link",
14082
+ "meta-alt-0": "Normaler Text",
14083
+ "meta-alt-1": "\xDCberschrift 1",
14084
+ "meta-alt-2": "\xDCberschrift 2",
14085
+ "meta-alt-3": "\xDCberschrift 3",
14086
+ "meta-alt-4": "\xDCberschrift 4",
14087
+ "meta-alt-5": "\xDCberschrift 5",
14088
+ "meta-alt-6": "\xDCberschrift 6",
14089
+ "meta-shift-7": "Nummerierte Liste",
14090
+ "meta-shift-8": "Ungeordnete Liste",
14091
+ "meta-indent": "Einzug",
14092
+ "meta-outdent": "Ausr\xFCckung",
14093
+ "meta-shift-backspace": "Block l\xF6schen",
14094
+ "meta-shift-o": "Block hinzuf\xFCgen",
14095
+ "meta-shift-d": "Block duplizieren",
14096
+ "meta-shift-up": "Zeile nach oben verschieben",
14097
+ "meta-shift-down": "Zeile nach unten verschieben"
14098
+ },
14099
+ emoji: {
14100
+ emoji: "Emoji",
14101
+ favorites: "Favoriten",
14102
+ smileys: "Smileys",
14103
+ gestures: "Gesten",
14104
+ animals: "Tiere",
14105
+ food: "Essen",
14106
+ activities: "Aktivit\xE4ten",
14107
+ travel: "Reisen"
14108
+ },
14109
+ linkstyles: {
14110
+ label: "Stile",
14111
+ link: "Link",
14112
+ primary: "Prim\xE4rer Button",
14113
+ secondary: "Sekund\xE4rer Button"
14114
+ }
14115
+ };
14116
+
14117
+ // app/assets/javascripts/formstrap/vendor/redactor/plugins/emoji.js
14118
+ Redactor.add("plugin", "emoji", {
14119
+ translations: {
14120
+ en: {
14121
+ emoji: {
14122
+ emoji: "Emoji",
14123
+ favorites: "Favorites",
14124
+ smileys: "Smileys",
14125
+ gestures: "Gestures",
14126
+ animals: "Animals",
14127
+ food: "Food",
14128
+ activities: "Activities",
14129
+ travel: "Travel"
14130
+ }
14131
+ }
14132
+ },
14133
+ defaults: {
14134
+ context: true,
14135
+ icon: '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.17317 2.7612C9.38642 2.25866 10.6868 2 12 2C13.3132 2 14.6136 2.25866 15.8268 2.7612C17.0401 3.26375 18.1425 4.00035 19.0711 4.92893C19.9997 5.85752 20.7362 6.95991 21.2388 8.17317C21.7413 9.38642 22 10.6868 22 12C22 13.3132 21.7413 14.6136 21.2388 15.8268C20.7362 17.0401 19.9997 18.1425 19.0711 19.0711C18.1425 19.9997 17.0401 20.7362 15.8268 21.2388C14.6136 21.7413 13.3132 22 12 22C10.6868 22 9.38642 21.7413 8.17317 21.2388C6.95991 20.7362 5.85752 19.9997 4.92893 19.0711C4.00035 18.1425 3.26375 17.0401 2.7612 15.8268C2.25866 14.6136 2 13.3132 2 12C2 10.6868 2.25866 9.38642 2.7612 8.17317C3.26375 6.95991 4.00035 5.85752 4.92893 4.92893C5.85752 4.00035 6.95991 3.26375 8.17317 2.7612ZM12 4C10.9494 4 9.90914 4.20693 8.93853 4.60896C7.96793 5.011 7.08601 5.60028 6.34315 6.34315C5.60028 7.08601 5.011 7.96793 4.60896 8.93853C4.20693 9.90914 4 10.9494 4 12C4 13.0506 4.20693 14.0909 4.60896 15.0615C5.011 16.0321 5.60028 16.914 6.34315 17.6569C7.08601 18.3997 7.96793 18.989 8.93853 19.391C9.90914 19.7931 10.9494 20 12 20C13.0506 20 14.0909 19.7931 15.0615 19.391C16.0321 18.989 16.914 18.3997 17.6569 17.6569C18.3997 16.914 18.989 16.0321 19.391 15.0615C19.7931 14.0909 20 13.0506 20 12C20 10.9494 19.7931 9.90914 19.391 8.93853C18.989 7.96793 18.3997 7.08602 17.6569 6.34315C16.914 5.60028 16.0321 5.011 15.0615 4.60896C14.0909 4.20693 13.0506 4 12 4ZM8 10C8 9.44772 8.44772 9 9 9H9.01C9.56228 9 10.01 9.44772 10.01 10C10.01 10.5523 9.56228 11 9.01 11H9C8.44772 11 8 10.5523 8 10ZM14 10C14 9.44772 14.4477 9 15 9H15.01C15.5623 9 16.01 9.44772 16.01 10C16.01 10.5523 15.5623 11 15.01 11H15C14.4477 11 14 10.5523 14 10ZM8.80015 14.2857C9.19463 13.8992 9.82777 13.9057 10.2143 14.3001C10.4471 14.5377 10.7249 14.7265 11.0315 14.8553C11.3381 14.9841 11.6674 15.0505 12 15.0505C12.3326 15.0505 12.6619 14.9841 12.9685 14.8553C13.2751 14.7265 13.5529 14.5377 13.7857 14.3001C14.1722 13.9057 14.8054 13.8992 15.1999 14.2857C15.5943 14.6722 15.6008 15.3054 15.2143 15.6999C14.7953 16.1275 14.2952 16.4672 13.7433 16.6991C13.1913 16.931 12.5987 17.0505 12 17.0505C11.4013 17.0505 10.8087 16.931 10.2567 16.6991C9.70481 16.4672 9.2047 16.1275 8.78571 15.6999C8.3992 15.3054 8.40566 14.6722 8.80015 14.2857Z"/></svg>',
14136
+ trigger: ":",
14137
+ items: {
14138
+ favorites: {
14139
+ faceTearsJoy: "\u{1F602}",
14140
+ heart: "\u2764\uFE0F",
14141
+ rollingFloorLaughing: "\u{1F923}",
14142
+ thumbsUpSign: "\u{1F44D}",
14143
+ loudlyCryingFace: "\u{1F62D}",
14144
+ foldedHands: "\u{1F64F}",
14145
+ throwingKiss: "\u{1F618}",
14146
+ smilingFaceSmilingEyesThreeHearts: "\u{1F970}",
14147
+ smilingFaceHeartShapedEyes: "\u{1F60D}",
14148
+ partyPopper: "\u{1F389}",
14149
+ grinningFaceSmilingEyes: "\u{1F601}",
14150
+ fire: "\u{1F525}",
14151
+ birthdayCake: "\u{1F382}",
14152
+ flushedFace: "\u{1F633}",
14153
+ smilingFaceSunglasses: "\u{1F60E}",
14154
+ sparkles: "\u2728",
14155
+ eyes: "\u{1F440}",
14156
+ rightPointingBackhand: "\u{1F449}",
14157
+ hundredPointsSymbol: "\u{1F4AF}",
14158
+ poutingFace: "\u{1F621}"
14159
+ },
14160
+ smileys: {
14161
+ slightlySmilingFace: "\u{1F642}",
14162
+ smile: "\u{1F604}",
14163
+ laughing: "\u{1F606}",
14164
+ wink: "\u{1F609}",
14165
+ heartEyes: "\u{1F60D}",
14166
+ tongueOut: "\u{1F61B}",
14167
+ blush: "\u{1F60A}",
14168
+ smirk: "\u{1F60F}",
14169
+ thinking: "\u{1F914}",
14170
+ sleepy: "\u{1F62A}"
14171
+ },
14172
+ gestures: {
14173
+ thumbsUp: "\u{1F44D}",
14174
+ thumbsDown: "\u{1F44E}",
14175
+ peaceSign: "\u270C\uFE0F",
14176
+ clappingHands: "\u{1F44F}",
14177
+ raisingHands: "\u{1F64C}",
14178
+ facepalm: "\u{1F926}",
14179
+ shrug: "\u{1F937}",
14180
+ fistBump: "\u{1F44A}",
14181
+ wavingHand: "\u{1F44B}",
14182
+ okHand: "\u{1F44C}"
14183
+ },
14184
+ animals: {
14185
+ dogFace: "\u{1F436}",
14186
+ catFace: "\u{1F431}",
14187
+ mouseFace: "\u{1F42D}",
14188
+ hamsterFace: "\u{1F439}",
14189
+ rabbitFace: "\u{1F430}",
14190
+ bearFace: "\u{1F43B}",
14191
+ pandaFace: "\u{1F43C}",
14192
+ lionFace: "\u{1F981}",
14193
+ pigFace: "\u{1F437}",
14194
+ frogFace: "\u{1F438}"
14195
+ },
14196
+ food: {
14197
+ greenApple: "\u{1F34F}",
14198
+ pizza: "\u{1F355}",
14199
+ hamburger: "\u{1F354}",
14200
+ fries: "\u{1F35F}",
14201
+ spaghetti: "\u{1F35D}",
14202
+ sushi: "\u{1F363}",
14203
+ iceCream: "\u{1F368}",
14204
+ donut: "\u{1F369}",
14205
+ cookie: "\u{1F36A}",
14206
+ cake: "\u{1F370}"
14207
+ },
14208
+ activities: {
14209
+ soccerBall: "\u26BD",
14210
+ basketball: "\u{1F3C0}",
14211
+ football: "\u{1F3C8}",
14212
+ baseball: "\u26BE",
14213
+ tennis: "\u{1F3BE}",
14214
+ bowling: "\u{1F3B3}",
14215
+ golf: "\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",
14216
+ fishingPole: "\u{1F3A3}",
14217
+ bicycle: "\u{1F6B4}",
14218
+ videoGame: "\u{1F3AE}"
14219
+ },
14220
+ travel: {
14221
+ airplane: "\u2708\uFE0F",
14222
+ car: "\u{1F697}",
14223
+ bicycle: "\u{1F6B2}",
14224
+ train: "\u{1F686}",
14225
+ boat: "\u26F5",
14226
+ map: "\u{1F5FA}\uFE0F",
14227
+ beachUmbrella: "\u{1F3D6}\uFE0F",
14228
+ mountain: "\u26F0\uFE0F",
14229
+ camping: "\u{1F3D5}\uFE0F",
14230
+ suitcase: "\u{1F9F3}"
14231
+ }
14232
+ }
14233
+ },
14234
+ subscribe: {
14235
+ "editor.keyup": function(event) {
14236
+ if (!this.opts.is("emoji.trigger"))
14237
+ return;
14238
+ this._handle(event);
14239
+ }
14240
+ },
14241
+ start() {
14242
+ const button = {
14243
+ title: "## emoji.emoji ##",
14244
+ icon: this.opts.get("emoji.icon"),
14245
+ command: "emoji.popup"
14246
+ };
14247
+ this.handleStr = "";
14248
+ this.handleLen = 1;
14249
+ this.app.toolbar.add("emoji", button);
14250
+ if (this.opts.is("emoji.context")) {
14251
+ this.app.context.add("emoji", button);
14252
+ }
14253
+ },
14254
+ popup(e, button) {
14255
+ const stack = this.app.create("stack");
14256
+ stack.create("emoji", { width: "372px" });
14257
+ const $modal = stack.getBody();
14258
+ this._buildEmoji($modal);
14259
+ this.app.modal.open({ name: "emoji", stack, button });
14260
+ },
14261
+ _handle(event) {
14262
+ const e = event.get("e");
14263
+ const key = e.which;
14264
+ const ctrl = e.ctrlKey || e.metaKey;
14265
+ const arrows = [37, 38, 39, 40];
14266
+ const ks = this.app.keycodes;
14267
+ if (key === ks.ESC) {
14268
+ this.app.editor.restore();
14269
+ return;
14270
+ }
14271
+ if (key === ks.DELETE || key === ks.SPACE || key === ks.SHIFT || ctrl || arrows.indexOf(key) !== -1) {
14272
+ return;
14273
+ }
14274
+ if (key === ks.BACKSPACE) {
14275
+ this.handleLen = this.handleLen - 2;
14276
+ if (this.handleLen <= 0) {
14277
+ this.handleLen = 1;
14278
+ this._hide();
14279
+ } else if (this.handleLen <= 1) {
14280
+ this._hide();
14281
+ }
14282
+ }
14283
+ this._emit();
14284
+ },
14285
+ _emit() {
14286
+ const selection = this.app.create("selection");
14287
+ const trigger = this.opts.get("emoji.trigger");
14288
+ const re = new RegExp("^" + trigger);
14289
+ this.handleStr = selection.getText("before", this.handleLen);
14290
+ this.handleStr2 = selection.getText("before", this.handleLen + 1);
14291
+ if (re.test(this.handleStr)) {
14292
+ if (this.handleStr2 && (this.handleStr2[0] === " " || this.handleStr2[0] === "" || this.handleStr2[0] === trigger)) {
14293
+ this.handleStr = this.handleStr.replace(trigger, "");
14294
+ this.handleLen++;
14295
+ if (this.handleLen - 1 > 0) {
14296
+ this._load();
14297
+ }
14298
+ }
14299
+ }
14300
+ },
14301
+ _load() {
14302
+ this._createPanel();
14303
+ const sections = this._buildEmoji(this.$panel, this.handleStr, true);
14304
+ if (sections === 0) {
14305
+ this._hide();
14306
+ }
14307
+ },
14308
+ _createPanel() {
14309
+ this.$panel = this.app.panel.build(this, "_insertFromPanel");
14310
+ this.$panel.addClass("rx-panel-emoji").css("max-width", "372px");
14311
+ const scrollTop = this.app.getDoc().scrollTop();
14312
+ const selection = this.app.create("selection");
14313
+ const pos = selection.getPosition();
14314
+ this.app.panel.open({ top: pos.bottom + scrollTop, left: pos.left });
14315
+ this.app.editor.save();
14316
+ },
14317
+ _buildEmoji($modal, filter, panel) {
14318
+ const items = this.opts.get("emoji.items");
14319
+ let sections = 0;
14320
+ const type = panel ? "panel" : "emoji";
14321
+ for (const [name, section] of Object.entries(items)) {
14322
+ const $section = this.dom('<div class="rx-' + type + '-section">');
14323
+ const $title = this.dom('<div class="rx-' + type + '-title">');
14324
+ const $box = this.dom('<div class="rx-' + type + '-box">');
14325
+ let size = 0;
14326
+ const title = this.lang.has("emoji." + name) ? this.lang.get("emoji." + name) : name.charAt(0).toUpperCase() + name.slice(1);
14327
+ $title.html(title);
14328
+ $section.append($title);
14329
+ $section.append($box);
14330
+ for (const [key, value] of Object.entries(section)) {
14331
+ if (filter && filter !== "" && key.search(filter) === -1)
14332
+ continue;
14333
+ const $item = this.dom('<span class="rx-' + type + '-item">');
14334
+ $item.html(value);
14335
+ if (panel) {
14336
+ $item.on("click", this._insertFromPanel.bind(this));
14337
+ } else {
14338
+ $item.on("click", this._insert.bind(this));
14339
+ }
14340
+ $box.append($item);
14341
+ size++;
14342
+ }
14343
+ if (size > 0) {
14344
+ sections++;
14345
+ $modal.append($section);
14346
+ }
14347
+ }
14348
+ return sections;
14349
+ },
14350
+ _insert(e) {
14351
+ this.app.modal.close();
14352
+ e.preventDefault();
14353
+ e.stopPropagation();
14354
+ const $target = this.dom(e.target);
14355
+ const value = $target.html();
14356
+ const insertion = this.app.create("insertion");
14357
+ insertion.insertText(value, "after");
14358
+ },
14359
+ _insertFromPanel(e, $el) {
14360
+ this.app.editor.restore();
14361
+ const $item = $el || this.dom(e.target);
14362
+ const replacement = $item.html();
14363
+ const trigger = this.opts.get("emoji.trigger");
14364
+ const offset2 = this.app.create("offset");
14365
+ const selection = this.app.create("selection");
14366
+ const current = selection.getCurrent();
14367
+ let currentText = current.textContent;
14368
+ const offsetObj = offset2.get();
14369
+ const leftFix = (trigger + this.handleStr).length;
14370
+ const what = trigger + this.handleStr;
14371
+ const n = currentText.lastIndexOf(what);
14372
+ if (n >= 0) {
14373
+ currentText = currentText.substring(0, n) + replacement + currentText.substring(n + what.length);
14374
+ }
14375
+ current.textContent = currentText;
14376
+ offsetObj.start = offsetObj.start - leftFix + replacement.length;
14377
+ offsetObj.end = offsetObj.end - leftFix + replacement.length;
14378
+ offset2.set(offsetObj);
14379
+ this._hideForce();
14380
+ },
14381
+ _hidePanel(e) {
14382
+ let hidable = false;
14383
+ const key = e && e.which;
14384
+ const ks = this.app.keycodes;
14385
+ if (!e) {
14386
+ hidable = true;
14387
+ } else if (e.type === "click" || key === ks.ESC || key === ks.SPACE) {
14388
+ hidable = true;
14389
+ }
14390
+ if (hidable) {
14391
+ this._hideForce();
14392
+ }
14393
+ },
14394
+ _hide() {
14395
+ this.app.panel.close();
14396
+ this._stopEvents();
14397
+ },
14398
+ _hideForce() {
14399
+ this._hide();
14400
+ this.handleStr = "";
14401
+ this.handleLen = 1;
14402
+ },
14403
+ _startEvents() {
14404
+ const name = "click.rx-plugin-emoji keydown.rx-plugin-emoji";
14405
+ this.app.getDoc().on(name, this._hidePanel.bind(this));
14406
+ this.app.editor.getEditor().on(name, this._hidePanel.bind(this));
14407
+ },
14408
+ _stopEvents() {
14409
+ const name = ".rx-plugin-emoji";
14410
+ this.app.getDoc().off(name);
14411
+ this.app.editor.getEditor().off(name);
14412
+ }
14413
+ });
14414
+
14415
+ // app/assets/javascripts/formstrap/vendor/redactor/plugins/linkstyles.js
14416
+ Redactor.add("plugin", "linkstyles", {
14417
+ translations: {
14418
+ en: {
14419
+ linkstyles: {
14420
+ label: "Styles",
14421
+ link: "Link",
14422
+ primary: "Primary",
14423
+ secondary: "Secondary"
14424
+ }
14425
+ }
14426
+ },
14427
+ defaults: {
14428
+ items: [
14429
+ { name: "link", value: "" },
14430
+ { name: "primary", value: "button button-primary" },
14431
+ { name: "secondary", value: "button button-secondary" }
14432
+ ]
14433
+ },
14434
+ subscribe: {
14435
+ "modal.before.open": function() {
14436
+ const name = this.app.modal.getName();
14437
+ if (name === "link") {
14438
+ this.setDefaultValue();
14439
+ }
14440
+ },
14441
+ "modal.open": function() {
14442
+ const name = this.app.modal.getName();
14443
+ if (name === "link") {
14444
+ this.prepareModal();
14445
+ }
14446
+ },
14447
+ "link.change": function(e) {
14448
+ const link = e.params.element.nodes[0];
14449
+ this.applyStylingToLink(link);
14450
+ },
14451
+ "link.add": function(e) {
14452
+ const link = e.params.element.nodes[0];
14453
+ this.applyStylingToLink(link);
14454
+ }
14455
+ },
14456
+ init() {
14457
+ this.selectedValue = "";
14458
+ },
14459
+ prepareModal() {
14460
+ const stack = this.app.modal.getStack();
14461
+ const item = stack.getFormItem("url");
14462
+ const box = this.dom("<div>").addClass("rx-form-item");
14463
+ box.append(this.buildLabel());
14464
+ box.append(this.buildSelect());
14465
+ item.after(box);
14466
+ },
14467
+ applyStylingToLink(link) {
14468
+ link.classList.remove(...link.classList);
14469
+ const classNames = this.selectedValue.split(" ");
14470
+ classNames.forEach((className) => {
14471
+ if (className.length === 0)
14472
+ return;
14473
+ link.classList.add(className);
14474
+ });
14475
+ },
14476
+ buildSelect() {
14477
+ const select = this.dom("<select>").addClass("rx-form-select");
14478
+ const items = this.opts.get("linkstyles.items");
14479
+ items.forEach((data, index2) => {
14480
+ const option2 = this.dom("<option>");
14481
+ option2.val(data.value);
14482
+ option2.html(this.lang.get("linkstyles." + data.name));
14483
+ select.append(option2);
14484
+ });
14485
+ select.val(this.selectedValue);
14486
+ select.on("change", (e) => {
14487
+ this.selectedValue = e.target.value;
14488
+ });
14489
+ return select;
14490
+ },
14491
+ buildLabel() {
14492
+ const label = this.dom("<label>").addClass("rx-form-label");
14493
+ label.html(this.lang.get("linkstyles.label"));
14494
+ return label;
14495
+ },
14496
+ setDefaultValue() {
14497
+ this.selectedValue = this.getLink().attr("class") || "";
14498
+ },
14499
+ getLink() {
14500
+ const links = this.getLinks();
14501
+ return links.length !== 0 ? links.eq(0) : this.dom();
14502
+ },
14503
+ getLinks() {
14504
+ const selection = this.app.create("selection");
14505
+ if (!selection.is()) {
14506
+ return this.dom();
14507
+ }
14508
+ const links = selection.getNodes({ tags: ["a"] });
14509
+ return links.length !== 0 ? this.dom(links) : this.dom();
14510
+ }
14511
+ });
14512
+
13366
14513
  // app/assets/javascripts/formstrap/index.js
13367
14514
  var Formstrap = class {
13368
14515
  static start() {
@@ -13378,7 +14525,7 @@ var Formstrap = class {
13378
14525
  Stimulus.register("nested-preview", nested_preview_controller_default);
13379
14526
  Stimulus.register("popup", popup_controller_default);
13380
14527
  Stimulus.register("preview", preview_controller_default);
13381
- Stimulus.register("redactorx", redactorx_controller_default);
14528
+ Stimulus.register("redactor", redactor_controller_default);
13382
14529
  Stimulus.register("repeater", repeater_controller_default);
13383
14530
  Stimulus.register("select", select_controller_default);
13384
14531
  Stimulus.register("textarea", textarea_controller_default);