card-mod-edit 0.14.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a86c67c71f50c7b45836f6166ca956e80cee6877364384b95dc25038bef5241
4
- data.tar.gz: fb33b97ea23ea991791ac74b07415573a39eecae233712c126647e4b862b2ece
3
+ metadata.gz: afce63912d505d4b4bc0ab869141825249708e5e28ada92bc52b4694ab326c8a
4
+ data.tar.gz: 381d27bdb3d18ec10f272e696d33f147ed759693617fd2c27f4eb23cef38fcc5
5
5
  SHA512:
6
- metadata.gz: 59ab0b5b9fba295909a90912a7260d8cbba847eb9d403d9c9effc57a4ee9a2f77ca2b8e7385f983f0e1df9c5dbd6f0104afd32eb7fbc884daf3fe2144170f4cb
7
- data.tar.gz: 6d05d22e44ff5d9240f378337d8d612129f93e4e8f8175a91ef5c0b9db2ba1370d371bb99e666e822d792eee975293d6e1bb53f5317ced3fb340c77d423fdfcc
6
+ metadata.gz: 40bca91d72c45a04ad34fa8c4601455552c1218ce964452f679faee3f8fa73d76f263a740c833c6683c4401d270b535ef87c33027b0d4745c8801a0b43472b00
7
+ data.tar.gz: 452ed1ff6b62ffe356b753d92dce7ebb5a1270b2e47a79b8ffdbd61c6e3853eb6ef29696d4204e2713d67100389b800f09fc3e842b5889de8ff1a81f222f55c1
@@ -0,0 +1,30 @@
1
+ jQuery.fn.extend
2
+ autosave: ->
3
+ slot = @slot()
4
+ return if @attr 'no-autosave'
5
+ multi = @closest '.form-group'
6
+ if multi[0]
7
+ return unless id = multi.data 'cardId'
8
+ reportee = ': ' + multi.data 'cardName'
9
+ else
10
+ id = slot.data 'cardId'
11
+ reportee = ''
12
+
13
+ return unless id
14
+
15
+ # might be better to put this href base in the html
16
+ submit_url = decko.path 'update/~' + id
17
+ form_data = $('#edit_card_'+id).serializeArray().reduce( ((obj, item) ->
18
+ obj[item.name] = item.value
19
+ return obj
20
+ ), { 'draft' : 'true', 'success[view]' : 'blank'});
21
+ $.ajax submit_url, {
22
+ data : form_data,
23
+ type : 'POST'
24
+ }
25
+ ##{ 'card[content]' : @val() },
26
+
27
+ $(window).ready ->
28
+ $('body').on 'change', '.autosave .d0-card-content', ->
29
+ content_field = $(this)
30
+ setTimeout ( -> content_field.autosave() ), 500
@@ -0,0 +1,31 @@
1
+ decko.slot.ready (slot, slotter) ->
2
+ slot.updateBridge(false, slotter)
3
+
4
+ links = slot.find('ul._auto-single-select > li.nav-item > a.nav-link')
5
+ if links.length == 1
6
+ $(links[0]).click()
7
+
8
+ jQuery.fn.extend
9
+ # overlayClosed=true means the bridge update was
10
+ # triggered by closing an overlay
11
+ updateBridge: (overlayClosed=false, slotter) ->
12
+ return unless @closest(".bridge").length > 0
13
+ if @data("breadcrumb")
14
+ @updateBreadcrumb()
15
+ else if slotter and $(slotter).data("breadcrumb")
16
+ $(slotter).updateBreadcrumb()
17
+
18
+ if overlayClosed
19
+ $(".bridge-pills > .nav-item > .nav-link.active").removeClass("active")
20
+
21
+ updateBreadcrumb: () ->
22
+ bc_item = $(".modal-header ._bridge-breadcrumb li:last-child")
23
+ bc_item.text(this.data("breadcrumb"))
24
+ bc_item.attr("class", "breadcrumb-item active #{this.data('breadcrumb-class')}")
25
+
26
+ $(window).ready ->
27
+ $('body').on "select2:select", "._close-rule-overlay-on-select", (event) ->
28
+ $(".overlay-container > ._overlay.card-slot.overlay_rule-view.RULE").removeOverlay()
29
+
30
+ $('body').on "click", "._update-history-pills", (event) ->
31
+ $(this).closest(".slotter").data("update-foreign-slot", ".card-slot.history_tab-view")
@@ -0,0 +1,32 @@
1
+ submitAfterTyping = null
2
+
3
+ $(window).ready ->
4
+ $('body').on "change", "._submit-on-change", (event) ->
5
+ $(event.target).closest('form').submit()
6
+ false
7
+
8
+ # TODO: consider refactoring so that all of this is handled by _submit-on-change
9
+
10
+ # submit form if user stops typing for a second
11
+ $('body').on "input", "._submit-after-typing", (event) ->
12
+ form = $(event.target).closest('form')
13
+ form.slot().find(".autosubmit-success-notification").remove()
14
+ clearTimeout(submitAfterTyping) if submitAfterTyping
15
+ submitAfterTyping = setTimeout ->
16
+ $(event.target).closest('form').submit()
17
+ submitAfterTyping = null
18
+ , 1000
19
+
20
+ # if "enter/return" is pressed, submit right away
21
+ $('body').on "keydown", "._submit-after-typing", (event) ->
22
+ if event.which == 13 # enter/return
23
+ clearTimeout(submitAfterTyping) if submitAfterTyping
24
+ submitAfterTyping = null
25
+ $(event.target).closest('form').submit()
26
+ false
27
+
28
+ $('body').on "change", "._edit-item", (event) ->
29
+ cb = $(event.target)
30
+ cb.attr "name", (cb.is(":checked") && "add_item" || "drop_item")
31
+ $(event.target).closest('form').submit()
32
+ false
@@ -0,0 +1,44 @@
1
+
2
+ $(window).ready ->
3
+ doubleClickActiveMap = { off: false, on: true, signed_in: decko.currentUserId }
4
+
5
+ doubleClickActive = () ->
6
+ doubleClickActiveMap[decko.doubleClick]
7
+
8
+ if doubleClickActive()
9
+ $('body').on 'dblclick', 'div', (_event) ->
10
+ if doubleClickApplies $(this)
11
+ triggerDoubleClickEditingOn $(this)
12
+ false # don't propagate up to next slot
13
+
14
+ # else alert "illegal configuration: " + decko.doubleClick
15
+
16
+ doubleClickApplies = (el) ->
17
+ return false if ['.nodblclick', '.d0-card-header', '.card-editor'].some (klass) ->
18
+ el.closest(klass)[0]
19
+ # double click inactive inside header, editor, or tag with "nodblclick" class
20
+ !el.slot().find('.card-editor')[0]?
21
+
22
+ triggerDoubleClickEditingOn = (el)->
23
+ slot = el.slot()
24
+ edit_link = slotEditLink(slot)
25
+
26
+ if edit_link
27
+ edit_link.click()
28
+ else
29
+ edit_view = slotEditView(slot)
30
+ url = decko.path("~#{slot.data('cardId')}?view=#{edit_view}")
31
+ slot.slotReload url
32
+
33
+ slotEditLink = (slot) ->
34
+ edit_links =
35
+ slot.find(".edit-link").filter (i, el) ->
36
+ $(el).slot().data('slotId') == slot.data('slotId')
37
+
38
+ if edit_links[0] then $(edit_links[0]) else false
39
+
40
+ slotEditView = (slot) ->
41
+ switch slot.data("slot").edit
42
+ when "inline" then "edit_inline"
43
+ when "full" then "bridge"
44
+ else "edit"
@@ -0,0 +1,51 @@
1
+ decko.editors.init["textarea"] = -> $(this).autosize()
2
+
3
+ $.extend decko,
4
+ contentLoaded: (el, slotter)->
5
+ decko.initializeEditors(el)
6
+ notice = slotter.attr('notify-success')
7
+
8
+ el.notify notice, "success" if notice?
9
+ el.triggerSlotReady(slotter)
10
+
11
+ initializeEditors: (range, map) ->
12
+ map = decko.editors.init unless map?
13
+ $.each map, (selector, fn) ->
14
+ $.each range.find(selector), ->
15
+ fn.call $(this)
16
+
17
+ jQuery.fn.extend
18
+ contentField: ->
19
+ @closest('.card-editor').find '.d0-card-content'
20
+
21
+ setContentFieldsFromMap: (map) ->
22
+ map = decko.editors.content unless map?
23
+ this_form = $(this)
24
+ $.each map, (selector, fn) ->
25
+ this_form.setContentFields(selector, fn)
26
+
27
+ setContentFields: (selector, fn) ->
28
+ $.each @find(selector), ->
29
+ $(this).setContentField(fn)
30
+
31
+ setContentField: (fn) ->
32
+ field = @contentField()
33
+ init_val = field.val() # tinymce-jquery overrides val();
34
+ # that's why we're not using it.
35
+ new_val = fn.call this
36
+ field.val new_val
37
+ field.change() if init_val != new_val
38
+
39
+ $(window).ready ->
40
+ # decko.initializeEditors $('body > :not(.modal)')
41
+ setTimeout (-> decko.initializeEditors $('body > :not(.modal)')), 10
42
+ # dislike the timeout, but without this forms with multiple TinyMCE editors
43
+ # were failing to load properly
44
+ # I couldn't reproduce that problem described above -pk
45
+
46
+ $('body').on 'submit', '.card-form', ->
47
+ $(this).setContentFieldsFromMap()
48
+ $(this).find('.d0-card-content').attr('no-autosave','true')
49
+ true
50
+
51
+ setInterval (-> $('.card-form').setContentFieldsFromMap()), 20000
@@ -0,0 +1,43 @@
1
+ checkNameAfterTyping = null
2
+
3
+ $(window).ready ->
4
+ $('body').on 'keyup', '.name-editor input', (event) ->
5
+ clearTimeout(checkNameAfterTyping) if checkNameAfterTyping
6
+ input = $(this)
7
+ if event.which == 13
8
+ checkName(input)
9
+ checkNameAfterTyping = null
10
+ else
11
+ checkNameAfterTyping = setTimeout ->
12
+ checkName(input)
13
+ checkNameAfterTyping = null
14
+ , 400
15
+
16
+ decko.pingName = (name, success)->
17
+ $.getJSON decko.path(''), format: 'json', view: 'status', 'card[name]': name, success
18
+
19
+
20
+ checkName = (box) ->
21
+ name = box.val()
22
+ decko.pingName name, (data)->
23
+ return null if box.val() != name # avert race conditions
24
+ status = data['status']
25
+ if status
26
+ ed = box.parent()
27
+ leg = box.closest('fieldset').find('legend')
28
+ msg = leg.find '.name-messages'
29
+ unless msg[0]
30
+ msg = $('<span class="name-messages"></span>')
31
+ leg.append msg?
32
+ ed.removeClass 'real-name virtual-name known-name'
33
+
34
+ # use id to avoid warning when renaming to name variant
35
+ slot_id = box.slot().data 'cardId'
36
+ if status != 'unknown' and !(slot_id && parseInt(slot_id) == data['id'])
37
+ ed.addClass status + '-name known-name'
38
+ qualifier = if status == 'virtual' then 'in virtual' else 'already in'
39
+ href = decko.path(data['url_key'])
40
+ msg.html "\"<a href='#{href}'>#{name}</a>\" #{qualifier} use"
41
+ else
42
+ msg.html ''
43
+
@@ -0,0 +1,21 @@
1
+ $(window).ready ->
2
+ $('body').on "change", '._live-type-field', ->
3
+ $this = $(this)
4
+
5
+ setSlotMode($this)
6
+
7
+ $this.data 'params', $this.closest('form').serialize()
8
+ $this.data 'url', $this.attr 'href'
9
+
10
+ $('body').on 'change', '.edit-type-field', ->
11
+ $(this).closest('form').submit()
12
+
13
+ setSlotMode = ($el, mode=null) ->
14
+ $slotter = $el.closest(".slotter")
15
+ if $slotter.length
16
+ if $slotter.attr('data-slotter-mode')
17
+ $slotter.attr 'data-original-slotter-mode', $slotter.attr('data-slotter-mode')
18
+ $slotter.attr 'data-slotter-mode', mode
19
+ if $slotter.attr('data-slot-selector')
20
+ $slotter.attr 'data-original-slot-selector', $slotter.attr('data-slot-selector')
21
+ $slotter.removeAttr 'data-slot-selector'
@@ -0,0 +1,109 @@
1
+
2
+ // Bridge
3
+ ._modal-stack {
4
+ z-index: 1010;
5
+ }
6
+
7
+ .modal-header .card-title {
8
+ margin-bottom: 0;
9
+ }
10
+
11
+ .modal-dialog.no-gaps > .modal-content {
12
+ > .modal-body {
13
+ padding: 0;
14
+ }
15
+ > .modal-header > nav > ol.breadcrumb {
16
+ margin-bottom: 0;
17
+ padding: 0.2rem 0.3rem;
18
+ }
19
+ }
20
+
21
+ $bridge-line-color: $border-color;
22
+
23
+ .bridge-sidebar {
24
+ background-color: darken($body-bg, 15%);
25
+ padding-left: 0;
26
+ padding-right: 0;
27
+ min-height: calc(100vh - 90px);
28
+
29
+ .guide-text {
30
+ padding: 15px;
31
+ background-color: $body-bg;
32
+ }
33
+ }
34
+
35
+ .bg-body {
36
+ background-color: $body-bg !important;
37
+ }
38
+
39
+ .bridge-main {
40
+ border-right: 1px solid $bridge-line-color;
41
+ padding-left: 0;
42
+ padding-right: 0;
43
+ > ._overlay-container-placeholder > .bridge-view {
44
+ padding-top: 10px;
45
+ padding-left: 15px;
46
+ padding-right: 15px;
47
+ }
48
+ > .overlay-container > .bridge-view {
49
+ padding-top: 0px;
50
+ }
51
+ }
52
+
53
+
54
+
55
+ .bridge-pills {
56
+ .help-text {
57
+ font-size: 0.8rem;
58
+ }
59
+ > .nav-item {
60
+ padding: 0;
61
+ > a {
62
+ color: inherit
63
+ }
64
+ background-color: $body-bg;
65
+ border: 1px solid $nav-tabs-border-color;
66
+ border-left: 3px solid $nav-tabs-border-color;
67
+ margin-bottom: -1px;
68
+
69
+ &:hover, &.active, &:focus {
70
+ border-left-color: $nav-pills-link-active-bg;
71
+ }
72
+ }
73
+ }
74
+
75
+ .bridge {
76
+ .perm-editor {
77
+ margin-left: 0;
78
+ }
79
+
80
+ .set-editor {
81
+ ul {
82
+ background: $white;
83
+ padding-left: 0;
84
+ margin-left: 15px;
85
+
86
+ &:first-child {
87
+ margin-left: 0;
88
+ }
89
+ }
90
+ li.radio {
91
+ padding: 10px 0px 0px 15px;
92
+ border-left: 1px solid $bridge-line-color;
93
+ border-top: 1px solid $bridge-line-color;
94
+ margin-top: 10px;
95
+ }
96
+ }
97
+
98
+ .bridge-sidebar {
99
+ .history_tab-view > div {
100
+ margin: 0.5rem;
101
+ }
102
+ .d0-card-header-title > .card-title {
103
+ font-size: 1rem;
104
+ }
105
+ .nav-link {
106
+ padding: 0.5rem 0.5rem;
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,34 @@
1
+ .card-editor {
2
+ white-space: normal;
3
+ padding-bottom: 15px;
4
+ }
5
+
6
+ .button-form-group {
7
+ display: flex
8
+ }
9
+ .rename-button-form-group .btn {
10
+ margin-right: 1rem;
11
+ }
12
+
13
+ .d0-card-header a {
14
+ color: $body-color;
15
+ &.edit-link, &.bridge-link, &.help-link {
16
+ color: $text-muted;
17
+ }
18
+ }
19
+
20
+ //
21
+ ///*-------------------- */
22
+ ///*- EDIT INTERFACE - */
23
+ ///*-------------------- */
24
+ //
25
+ //textarea,
26
+ //.content-editor > input[type=text],
27
+ //.content-editor > input[type=password],
28
+ //.name-editor input {
29
+ // width: 97.5%;
30
+ //}
31
+ ///* width + padding = 99.5%, which leaves 0.5% for the borders. This is imprecise, but borders can't be specified as a percentage */
32
+ //textarea {
33
+ // max-height: 500px;
34
+ //}
@@ -0,0 +1,14 @@
1
+ // autosave.js.coffee
2
+ (function(){jQuery.fn.extend({autosave:function(){var t,a,e,r,n;if(r=this.slot(),!this.attr("no-autosave")){if((e=this.closest(".form-group"))[0]){if(!(a=e.data("cardId")))return;": "+e.data("cardName")}else a=r.data("cardId"),"";if(a)return n=decko.path("update/~"+a),t=$("#edit_card_"+a).serializeArray().reduce(function(t,a){return t[a.name]=a.value,t},{draft:"true","success[view]":"blank"}),$.ajax(n,{data:t,type:"POST"})}}}),$(window).ready(function(){return $("body").on("change",".autosave .d0-card-content",function(){var t;return t=$(this),setTimeout(function(){return t.autosave()},500)})})}).call(this);
3
+ // bridge.js.coffee
4
+ (function(){decko.slot.ready(function(e,t){var r;if(e.updateBridge(!1,t),1===(r=e.find("ul._auto-single-select > li.nav-item > a.nav-link")).length)return $(r[0]).click()}),jQuery.fn.extend({updateBridge:function(e,t){if(null==e&&(e=!1),this.closest(".bridge").length>0)return this.data("breadcrumb")?this.updateBreadcrumb():t&&$(t).data("breadcrumb")&&$(t).updateBreadcrumb(),e?$(".bridge-pills > .nav-item > .nav-link.active").removeClass("active"):void 0},updateBreadcrumb:function(){var e;return(e=$(".modal-header ._bridge-breadcrumb li:last-child")).text(this.data("breadcrumb")),e.attr("class","breadcrumb-item active "+this.data("breadcrumb-class"))}}),$(window).ready(function(){return $("body").on("select2:select","._close-rule-overlay-on-select",function(){return $(".overlay-container > ._overlay.card-slot.overlay_rule-view.RULE").removeOverlay()}),$("body").on("click","._update-history-pills",function(){return $(this).closest(".slotter").data("update-foreign-slot",".card-slot.history_tab-view")})})}).call(this);
5
+ // components.js.coffee
6
+ (function(){var t;t=null,$(window).ready(function(){return $("body").on("change","._submit-on-change",function(t){return $(t.target).closest("form").submit(),!1}),$("body").on("input","._submit-after-typing",function(e){return $(e.target).closest("form").slot().find(".autosubmit-success-notification").remove(),t&&clearTimeout(t),t=setTimeout(function(){return $(e.target).closest("form").submit(),t=null},1e3)}),$("body").on("keydown","._submit-after-typing",function(e){if(13===e.which)return t&&clearTimeout(t),t=null,$(e.target).closest("form").submit(),!1}),$("body").on("change","._edit-item",function(t){var e;return(e=$(t.target)).attr("name",e.is(":checked")?"add_item":"drop_item"),$(t.target).closest("form").submit(),!1})})}).call(this);
7
+ // doubleclick.js.coffee
8
+ (function(){var t,n,i,r;$(window).ready(function(){var n;if(n={off:!1,on:!0,signed_in:decko.currentUserId},function(){return n[decko.doubleClick]}())return $("body").on("dblclick","div",function(){return t($(this))&&r($(this)),!1})}),t=function(t){return![".nodblclick",".d0-card-header",".card-editor"].some(function(n){return t.closest(n)[0]})&&null==t.slot().find(".card-editor")[0]},r=function(t){var r,e,d,o;return d=t.slot(),(r=n(d))?r.click():(e=i(d),o=decko.path("~"+d.data("cardId")+"?view="+e),d.slotReload(o))},n=function(t){var n;return!!(n=t.find(".edit-link").filter(function(n,i){return $(i).slot().data("slotId")===t.data("slotId")}))[0]&&$(n[0])},i=function(t){switch(t.data("slot").edit){case"inline":return"edit_inline";case"full":return"bridge";default:return"edit"}}}).call(this);
9
+ // editor.js.coffee
10
+ (function(){decko.editors.init.textarea=function(){return $(this).autosize()},$.extend(decko,{contentLoaded:function(t,n){var e;return decko.initializeEditors(t),null!=(e=n.attr("notify-success"))&&t.notify(e,"success"),t.triggerSlotReady(n)},initializeEditors:function(t,n){return null==n&&(n=decko.editors.init),$.each(n,function(n,e){return $.each(t.find(n),function(){return e.call($(this))})})}}),jQuery.fn.extend({contentField:function(){return this.closest(".card-editor").find(".d0-card-content")},setContentFieldsFromMap:function(t){var n;return null==t&&(t=decko.editors.content),n=$(this),$.each(t,function(t,e){return n.setContentFields(t,e)})},setContentFields:function(t,n){return $.each(this.find(t),function(){return $(this).setContentField(n)})},setContentField:function(t){var n,e,i;if(e=(n=this.contentField()).val(),i=t.call(this),n.val(i),e!==i)return n.change()}}),$(window).ready(function(){return setTimeout(function(){return decko.initializeEditors($("body > :not(.modal)"))},10),$("body").on("submit",".card-form",function(){return $(this).setContentFieldsFromMap(),$(this).find(".d0-card-content").attr("no-autosave","true"),!0})}),setInterval(function(){return $(".card-form").setContentFieldsFromMap()},2e4)}).call(this);
11
+ // name_editor.js.coffee
12
+ (function(){var n,e;e=null,$(window).ready(function(){return $("body").on("keyup",".name-editor input",function(a){var t;return e&&clearTimeout(e),t=$(this),13===a.which?(n(t),e=null):e=setTimeout(function(){return n(t),e=null},400)})}),decko.pingName=function(n,e){return $.getJSON(decko.path(""),{format:"json",view:"status","card[name]":n},e)},n=function(n){var e;return e=n.val(),decko.pingName(e,function(a){var t,r,l,u,i,s,o;return n.val()!==e?null:(o=a.status)?(t=n.parent(),(u=(l=n.closest("fieldset").find("legend")).find(".name-messages"))[0]||(u=$('<span class="name-messages"></span>'),l.append(null!=u)),t.removeClass("real-name virtual-name known-name"),s=n.slot().data("cardId"),"unknown"===o||s&&parseInt(s)===a.id?u.html(""):(t.addClass(o+"-name known-name"),i="virtual"===o?"in virtual":"already in",r=decko.path(a.url_key),u.html("\"<a href='"+r+"'>"+e+'</a>" '+i+" use"))):void 0})}}).call(this);
13
+ // type_editor.js.coffee
14
+ (function(){var t;$(window).ready(function(){return $("body").on("change","._live-type-field",function(){var a;return a=$(this),t(a),a.data("params",a.closest("form").serialize()),a.data("url",a.attr("href"))}),$("body").on("change",".edit-type-field",function(){return $(this).closest("form").submit()})}),t=function(t,a){var e;if(null==a&&(a=null),(e=t.closest(".slotter")).length&&(e.attr("data-slotter-mode")&&(e.attr("data-original-slotter-mode",e.attr("data-slotter-mode")),e.attr("data-slotter-mode",a)),e.attr("data-slot-selector")))return e.attr("data-original-slot-selector",e.attr("data-slot-selector")),e.removeAttr("data-slot-selector")}}).call(this);
data/data/real.yml ADDED
@@ -0,0 +1,14 @@
1
+ - :name: "*input type"
2
+ :type: :setting
3
+ :codename: input_type
4
+
5
+ - :name:
6
+ - :input_type
7
+ - :right
8
+ :fields:
9
+ # TODO: refactor so that we don't need a compound card to have a codename
10
+ :content_options:
11
+ :type: :pointer
12
+ :codename: input_options
13
+ :content: overridden
14
+ :input_type: radio
@@ -19,7 +19,7 @@ format :html do
19
19
  end
20
20
 
21
21
  def bridge_pill_item_opts breadcrumb, extra_opts, text
22
- opts = bridge_link_opts.merge("data-toggle": "pill")
22
+ opts = bridge_link_opts.merge("data-bs-toggle": "pill")
23
23
  opts.merge! breadcrumb_data(breadcrumb)
24
24
 
25
25
  if extra_opts
@@ -39,7 +39,7 @@ format :html do
39
39
  end
40
40
 
41
41
  def bridge_pill_section tab_name, title, items
42
- wrap_with(:h6, title, class: "ml-1 mt-3") +
42
+ wrap_with(:h6, title, class: "ms-1 mt-3") +
43
43
  wrap_each_with(:li, class: BRIDGE_PILL_LI_CLASSES) do
44
44
  bridge_pill_items(items, tab_name)
45
45
  end.html_safe
@@ -31,7 +31,7 @@ format :html do
31
31
  def followers_bridge_link
32
32
  cnt = card.followers_count
33
33
  link_to_card card.name.field(:followers), "#{cnt} follower#{'s' unless cnt == 1}",
34
- bridge_link_opts(class: "btn btn-sm ml-2 btn-secondary slotter",
34
+ bridge_link_opts(class: "btn btn-sm ms-2 btn-secondary slotter",
35
35
  remote: true, "data-cy": "followers")
36
36
  end
37
37
  end
@@ -18,9 +18,13 @@ format :html do
18
18
  end
19
19
 
20
20
  view :rules_tab, unknown: true do
21
+ set_list_type = :related
21
22
  class_up "card-slot", "flex-column"
22
23
  wrap do
23
- nest current_set_card, view: :bridge_rules_tab
24
+ [
25
+ set_select(set_list_type),
26
+ # set_alert(set_list_type)
27
+ ]
24
28
  end
25
29
  end
26
30
 
data/set/all/bridge.rb CHANGED
@@ -5,6 +5,8 @@ BRIDGE_TABS = { "Account" => :account_tab,
5
5
  "Related" => :related_tab,
6
6
  "Rules" => :rules_tab }.freeze
7
7
 
8
+ BRIDGE_TAB_NAMES = BRIDGE_TABS.invert.freeze
9
+
8
10
  format :html do
9
11
  wrapper :bridge do
10
12
  class_up "modal-dialog", "no-gaps"
@@ -16,7 +18,9 @@ format :html do
16
18
 
17
19
  def bridge_tabs
18
20
  wrap do
19
- tabs(visible_bridge_tabs, bridge_tab, load: :lazy) { _render bridge_tab }
21
+ tabs(visible_bridge_tabs, BRIDGE_TAB_NAMES[bridge_tab], load: :lazy) do
22
+ _render bridge_tab
23
+ end
20
24
  end
21
25
  end
22
26
 
@@ -16,8 +16,8 @@ format :html do
16
16
  # home_view is necessary for cancel to work correctly.
17
17
  # it seems a little strange to have to think about home_view here,
18
18
  # but the issue is that something currently has to happen prior to the
19
- # render to get voo.slot_options to have the write home view in
20
- # the slot wrap. Id think this would probably best be handled as an
19
+ # render to get voo.slot_options to have the right home view in
20
+ # the slot wrap. I'd think this would probably best be handled as an
21
21
  # option to #wrap that triggers a new heir voo
22
22
  _render_content_formgroups,
23
23
  _render(voo.buttons_view || :edit_buttons)
@@ -34,12 +34,7 @@ format :html do
34
34
  with_nest_mode :edit do
35
35
  voo.show :help
36
36
  voo.hide :save_button
37
- wrap true do
38
- [
39
- frame_help,
40
- _render_edit_form
41
- ]
42
- end
37
+ wrap(true) { [frame_help, _render_edit_form] }
43
38
  end
44
39
  end
45
40
 
@@ -35,16 +35,16 @@ format :html do
35
35
  end
36
36
 
37
37
  def edit_row_fixed_width title, content, edit_view, width=50
38
- class_up "card-slot", "d-flex"
38
+ class_up "card-slot", "d-flex form-group"
39
39
  wrap do
40
- ["<label class='w-#{width}px'>#{title}</label>",
40
+ ["<label style='width: #{width}px'>#{title}</label>",
41
41
  content,
42
42
  edit_inline_link(edit_view, align: :right)]
43
43
  end
44
44
  end
45
45
 
46
46
  def edit_inline_link view=:edit_inline, align: :left
47
- align = align == :left ? "ml-2" : "ml-auto"
47
+ align = align == :left ? "ms-2" : "ms-auto"
48
48
  link_to_view view, menu_icon, class: "#{align} edit-link", "data-cy": "edit-link"
49
49
  end
50
50
 
@@ -1,4 +1,4 @@
1
1
  .skip-referers.pb-2
2
2
  = check_box_tag "card[skip]", :update_referer_content
3
- %label.pl-1
3
+ %label.ps-1
4
4
  = t :skip_update_referer_content
data/set/all/editor.rb CHANGED
@@ -29,7 +29,7 @@ format :html do
29
29
  nil
30
30
  end
31
31
 
32
- view :input, unknown: true do
32
+ view :input, unknown: true, cache: :never do
33
33
  try(input_method(input_type)) ||
34
34
  input_defined_by_card ||
35
35
  send(input_method(default_input_type))
@@ -51,4 +51,8 @@ format :html do
51
51
  def text_field_input
52
52
  text_field :content, class: classy("d0-card-content")
53
53
  end
54
+
55
+ def hidden_input
56
+ hidden_field :content, class: classy("d0-card-content")
57
+ end
54
58
  end
data/set/all/form.rb CHANGED
@@ -2,7 +2,7 @@ format :html do
2
2
  # FIELDSET VIEWS
3
3
 
4
4
  # sometimes multiple card formgroups, sometimes just one
5
- view :content_formgroups, cache: :never do
5
+ view :content_formgroups, unknown: true, cache: :never do
6
6
  wrap_with :fieldset, edit_slot, class: classy("card-editor", "editor")
7
7
  end
8
8
 
@@ -99,12 +99,19 @@ format :html do
99
99
 
100
100
  def editor_in_multi_card
101
101
  add_junction_class
102
- formgroup render_title,
103
- input: "content", help: true, class: classy("card-editor") do
102
+ wrap_editor_in_multi_card do
104
103
  [content_field, (form.hidden_field(:type_id) if card.new_card?)]
105
104
  end
106
105
  end
107
106
 
107
+ def wrap_editor_in_multi_card &block
108
+ return yield if input_type == :hidden
109
+
110
+ formgroup render_title,
111
+ input: "content", help: true, class: classy("card-editor"),
112
+ &block
113
+ end
114
+
108
115
  def multi_card_edit fields_only=false
109
116
  field_configs = edit_field_configs fields_only
110
117
  return structure_link if field_configs.empty?
@@ -121,18 +128,18 @@ format :html do
121
128
  "<p><em>Uneditable; content is #{structured} without nests</em></p>"
122
129
  end
123
130
 
124
- # @param [Hash|Array] fields either an array with field names and/or field
125
- # cards or a hash with the fields as keys and a hash with nest options as
126
- # values
127
- def process_edit_fields fields
128
- fields.map do |field, opts|
129
- field_nest field, opts
130
- end.join "\n"
131
- end
132
- ###
131
+ # # @param [Hash|Array] fields either an array with field names and/or field
132
+ # # cards or a hash with the fields as keys and a hash with nest options as
133
+ # # values
134
+ # def process_edit_fields fields
135
+ # fields.map do |field, opts|
136
+ # field_nest field, opts
137
+ # end.join "\n"
138
+ # end
139
+ # ###
133
140
 
134
- # If you use subfield cards to render a form for a new card
135
- # then the subfield cards should be created on the new card not the existing
141
+ # If you use field cards to render a form for a new card
142
+ # then the field cards should be created on the new card not the existing
136
143
  # card that build the form
137
144
 
138
145
  def form
@@ -6,7 +6,7 @@ format :html do
6
6
  def standard_save_button opts={}
7
7
  return if voo&.hide?(:save_button)
8
8
 
9
- add_class opts, "submit-button btn-sm mr-3 _update-history-pills"
9
+ add_class opts, "submit-button btn-sm me-3 _update-history-pills"
10
10
  opts[:text] ||= "Save"
11
11
  opts["data-cy"] = "save"
12
12
  submit_button opts
@@ -18,7 +18,7 @@ format :html do
18
18
  def standard_save_and_close_button opts={}
19
19
  close = opts.delete(:close) || :modal
20
20
  text = opts[:text] || "Save and Close"
21
- add_class opts, "submit-button btn-sm mr-3 _close-on-success"
21
+ add_class opts, "submit-button btn-sm me-3 _close-on-success"
22
22
  add_class opts, "_update-origin" unless opts[:no_origin_update]
23
23
  opts.reverse_merge! text: text, "data-cy": "submit-#{close}"
24
24
 
@@ -26,7 +26,7 @@ format :html do
26
26
  end
27
27
 
28
28
  def standard_cancel_button args={}
29
- args.reverse_merge! class: "cancel-button ml-4", href: path, "data-cy": "cancel"
29
+ args.reverse_merge! class: "cancel-button ms-4", href: path, "data-cy": "cancel"
30
30
  cancel_button args
31
31
  end
32
32
 
@@ -49,7 +49,7 @@ format :html do
49
49
  end
50
50
 
51
51
  def delete_button_opts opts={}
52
- add_class opts, "slotter btn btn-outline-danger ml-auto btn-sm"
52
+ add_class opts, "slotter btn btn-outline-danger ms-auto btn-sm"
53
53
  opts["data-confirm"] = delete_confirm opts
54
54
  opts[:path] = { action: :delete }
55
55
  opts[:path][:success] = delete_success(opts)
data/set/all/formgroup.rb CHANGED
@@ -1,11 +1,15 @@
1
1
  format :html do
2
2
  view :read_form do
3
- edit_field_configs.map do |field, args|
3
+ read_field_configs.map do |field, args|
4
4
  args[:view] = :read_formgroup
5
5
  nest field, args
6
6
  end
7
7
  end
8
8
 
9
+ def read_field_configs
10
+ edit_field_configs
11
+ end
12
+
9
13
  view :read_formgroup, template: :haml, unknown: true, wrap: :slot
10
14
 
11
15
  # a formgroup has a label (with helptext) and an input
@@ -1,7 +1,7 @@
1
1
  %div
2
- .d-flex.ml-2
3
- .ml-auto
4
- = link_to fa_icon(:close), path: "#", "data-dismiss": "overlay", class: "text-dark p-1 ml-1"
2
+ .d-flex.ms-2
3
+ .ms-auto
4
+ = link_to fa_icon(:close), path: "#", "data-bs-dismiss": "overlay", class: "text-dark p-1 ms-1"
5
5
 
6
6
  = guide
7
7
 
@@ -1,5 +1,5 @@
1
- .form-group
1
+ .form-group.read-form-group
2
2
  %label
3
3
  = render_title
4
4
  .read-formgroup-content
5
- = render_core
5
+ = render_core
@@ -1,4 +1,10 @@
1
+ assign_type :pointer
2
+
1
3
  format :html do
4
+ def default_item_view
5
+ :name
6
+ end
7
+
2
8
  def quick_editor
3
9
  @submit_on_change = true
4
10
  super
@@ -31,5 +37,5 @@ def option_names
31
37
  end
32
38
 
33
39
  def supports_content_option_view?
34
- item_name.in? ["checkbox", "radio", "filtered list"]
40
+ first_name.in? %w[checkbox radio]
35
41
  end
@@ -0,0 +1 @@
1
+ assign_type :phrase
data/set/type/list.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  def input_type_content_options
2
- ["multiselect", "checkbox", "list", "filtered list"]
2
+ %w[multiselect checkbox list]
3
3
  end
4
4
 
5
5
  def show_content_options?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card-mod-edit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ethan McCutchen
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-01-04 00:00:00.000000000 Z
13
+ date: 2023-01-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: card
@@ -18,28 +18,42 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.104.1
21
+ version: 1.105.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 1.104.1
28
+ version: 1.105.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: card-mod-rules
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - '='
34
34
  - !ruby/object:Gem::Version
35
- version: 0.14.1
35
+ version: 0.15.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - '='
41
41
  - !ruby/object:Gem::Version
42
- version: 0.14.1
42
+ version: 0.15.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: card-mod-list
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '='
48
+ - !ruby/object:Gem::Version
49
+ version: 0.15.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - '='
55
+ - !ruby/object:Gem::Version
56
+ version: 0.15.0
43
57
  description: ''
44
58
  email:
45
59
  - info@decko.org
@@ -47,6 +61,17 @@ executables: []
47
61
  extensions: []
48
62
  extra_rdoc_files: []
49
63
  files:
64
+ - assets/script/autosave.js.coffee
65
+ - assets/script/bridge.js.coffee
66
+ - assets/script/components.js.coffee
67
+ - assets/script/doubleclick.js.coffee
68
+ - assets/script/editor.js.coffee
69
+ - assets/script/name_editor.js.coffee
70
+ - assets/script/type_editor.js.coffee
71
+ - assets/style/bridge.scss
72
+ - assets/style/edit.scss
73
+ - data/files/mod_edit_script_asset_output/file.js
74
+ - data/real.yml
50
75
  - set/all/bridge.rb
51
76
  - set/all/bridge/bridge.haml
52
77
  - set/all/bridge/bridge_pills.rb
@@ -71,6 +96,7 @@ files:
71
96
  - set/all/read_formgroup.haml
72
97
  - set/all/template_nest.rb
73
98
  - set/right/input_type.rb
99
+ - set/right/thanks.rb
74
100
  - set/self/input_type.rb
75
101
  - set/type/list.rb
76
102
  - set/type/plain_text.rb
@@ -85,6 +111,7 @@ metadata:
85
111
  wiki_uri: https://decko.org
86
112
  documentation_url: http://docs.decko.org/
87
113
  card-mod: edit
114
+ card-mod-group: gem-defaults
88
115
  post_install_message:
89
116
  rdoc_options: []
90
117
  require_paths:
@@ -100,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
127
  - !ruby/object:Gem::Version
101
128
  version: '0'
102
129
  requirements: []
103
- rubygems_version: 3.2.15
130
+ rubygems_version: 3.3.11
104
131
  signing_key:
105
132
  specification_version: 4
106
133
  summary: Edit handling