card-mod-format 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 145d87510394b9aba7420406a71e248b75f4a130d361c0afe49fb77e2f9e8b4c
4
- data.tar.gz: 22fd7dd81e8565fc26cb012ba7a43632fc37573e825442146e72b069825985aa
3
+ metadata.gz: 4b0ff2d377bf5c92b381014dfde8b3ac4f2bc62567bad7a83a152fbe21b63d5a
4
+ data.tar.gz: '09619cfd84f48a855c3b18e0f126bf4b02ecaaf26f995d3930b98934357597dd'
5
5
  SHA512:
6
- metadata.gz: c74b05756440c35fb17760bfdb5a80974928eadc8de9b3bce8e2742d44a9a148421248c6f1395b9b6951be2f3f14ecad967f38869e7c1725a93051570a56de8f
7
- data.tar.gz: 150196fe1ab672b1580059d1d7cd354532751b8ae492f76abed06d8427a4c664997d39b02f0fd6403d306eb26fa44b49a8caa5225ba36d51dd11dd17b06c7c00
6
+ metadata.gz: abb03121966bc5bb5e764034547882bcfcb49b0275d5df26521fa706ece8d70f52e2125bd60e802d1c936fe9f97f932f1de5c375b55a7326c047ba082e89541e
7
+ data.tar.gz: f72af9bc82fe9ad28b41bc04ffe03f754838467f3956d0ed443940331129dfe49b91b340f0f1a69e45f8993a2b4a494315e612c96da43df10c7b07062661249a
@@ -1,7 +1,8 @@
1
1
  decko.slot =
2
2
  # returns full path with slot parameters
3
- path: (path, slot)->
3
+ path: (path, slot, slotterMode)->
4
4
  params = slotPathParams slot
5
+ params["slotter_mode"] = slotterMode if slotterMode?
5
6
  decko.path(path) + ( (if path.match /\?/ then '&' else '?') + $.param(params) )
6
7
 
7
8
  ready: (func)->
@@ -19,7 +20,6 @@ decko.slot =
19
20
  e.stopPropagation()
20
21
  func.call this, $(this)
21
22
 
22
-
23
23
  jQuery.fn.extend
24
24
  isSlot: -> $(this).hasClass "card-slot"
25
25
 
@@ -53,7 +53,7 @@ jQuery.fn.extend
53
53
  overlaySlot = @closest("[data-#{type}-origin-slot-id]")
54
54
  origin_slot_id = overlaySlot.data("#{type}-origin-slot-id")
55
55
  origin_slot = $("[data-slot-id=#{origin_slot_id}]")
56
- if origin_slot[0]?
56
+ if origin_slot.length > 0
57
57
  origin_slot
58
58
  else
59
59
  decko.warn "couldn't find origin with slot id #{origin_slot_id}"
@@ -61,12 +61,18 @@ jQuery.fn.extend
61
61
  slotReload: (url) ->
62
62
  @each -> $(this)._slotReloadSingle url
63
63
 
64
+ slotReloading: ()->
65
+ # TODO: add default spinner behavior
66
+
67
+ slotLoadingComplete: ()->
68
+ # TODO: add default spinner behavior
69
+
64
70
  slotUpdate: (newContent, mode) ->
65
71
  mode ||= "replace"
66
72
  @slotContent newContent, mode, $(this)
67
73
 
68
74
  slotContent: (newContent, mode, $slotter) ->
69
- v = $(newContent)[0] && $(newContent) || newContent
75
+ v = $(newContent).length > 0 && $(newContent) || newContent
70
76
 
71
77
  if typeof(v) == "string"
72
78
  # Needed to support "TEXT: result" pattern in success (eg deleting nested cards)
@@ -114,6 +120,7 @@ jQuery.fn.extend
114
120
  # that's where handleRemote gets the url from
115
121
  # .attr(href, url) only works for anchors
116
122
  $.rails.handleRemote $slot
123
+ $slot.slotReloading()
117
124
 
118
125
  # ~~~~~~~~~~~~~~~~~~~~~~~~
119
126
  # "private" helper methods
@@ -65,12 +65,18 @@
65
65
  #
66
66
  #
67
67
  $(window).ready ->
68
+ $('body').on 'ajax:send', '.slotter', (event, data) ->
69
+ $(this).slot().slotReloading()
70
+
68
71
  $('body').on 'ajax:success', '.slotter', (event, data) ->
69
72
  $(this).slotterSuccess event, data
70
73
 
71
74
  $('body').on 'ajax:error', '.slotter', (event, xhr) ->
72
75
  $(this).showErrorResponse xhr.status, xhr.responseText
73
76
 
77
+ $('body').on 'ajax:complete', '.slotter', (event, data) ->
78
+ $(this).slot().slotLoadingComplete()
79
+
74
80
  $('body').on 'click', 'button.slotter', ->
75
81
  return false if !$.rails.allowAction $(this)
76
82
  $.rails.handleRemote $(this)
@@ -103,6 +109,15 @@ $(window).ready ->
103
109
  $('body').on 'ajax:beforeSend', '.slotter', (event, xhr, opt)->
104
110
  $(this).slotterBeforeSend opt
105
111
 
112
+ # NOTE: without the following two propagation checks, slotter events can propagate
113
+ # from one slot to another and cause weird problems, as with the type editor
114
+ $('body').on 'ajax:beforeSend', '.card-slot', (event)->
115
+ event.stopPropagation()
116
+
117
+ $('body').on 'ajax:send', '.card-slot', (event)->
118
+ event.stopPropagation()
119
+
120
+
106
121
  jQuery.fn.extend
107
122
  mainSuccess: ()->
108
123
  form = $(this)
@@ -204,7 +219,14 @@ jQuery.fn.extend
204
219
 
205
220
  slotterBeforeSend: (opt) ->
206
221
  # avoiding duplication. could be better test?
222
+ mode = @slotterMode()
223
+
207
224
  return if opt.noSlotParams or opt.url.match(/home_view/) or
208
- @data("slotter-mode") == "modal" or @data("slotter-mode") == "override"
225
+ mode == "modal" or mode == "override"
226
+
227
+ opt.url = decko.slot.path opt.url, @slot(), mode
209
228
 
210
- opt.url = decko.slot.path opt.url, @slot()
229
+ slotterMode: () ->
230
+ mode = @data "slotter-mode"
231
+ return if !mode? || (mode.match(/origin/) && !@slotOrigin())
232
+ mode
@@ -6,6 +6,7 @@
6
6
  position: absolute;
7
7
  right: 8px;
8
8
  top: 5px;
9
+ width: auto;
9
10
  }
10
11
 
11
12
  .d0-card-content, .titled-view > .d0-card-header {
@@ -14,8 +15,10 @@
14
15
  }
15
16
  }
16
17
 
17
- .d0-card-content .card-menu i {
18
- font-size: 1.2em
18
+ .d0-card-content, .labeled-view {
19
+ .card-menu i {
20
+ font-size: 1.2em
21
+ }
19
22
  }
20
23
 
21
24
  .modal-menu, .overlay-menu {
@@ -33,7 +36,7 @@
33
36
  // Hover over these, and only the card menus that are immediate children will appear
34
37
  .card-slot > .d0-card-frame > .d0-card-header,
35
38
  .card-slot > .d0-card-header,
36
- .card-slot.labeled-view > .labeled-content > .d0-card-body,
39
+ .card-slot.labeled-view,
37
40
  .card-slot,
38
41
  .card > .card-body,
39
42
  .card > .card-header {
data/config/admin.yml ADDED
@@ -0,0 +1,30 @@
1
+ configurations:
2
+ basic:
3
+ - title
4
+ - head
5
+ - credit
6
+ cardtypes:
7
+ text:
8
+ - basic
9
+ - plain_text
10
+ - html
11
+ - phrase
12
+ scripting:
13
+ - json
14
+ data:
15
+ - number
16
+ - toggle
17
+ - uri
18
+ views:
19
+ - name
20
+ - link
21
+ - url_link
22
+ - content
23
+ - short_content
24
+ - core
25
+ - raw
26
+ - titled
27
+ - labeled
28
+ - smart_label
29
+ - title
30
+ - title_link
@@ -22,3 +22,4 @@ en:
22
22
  format_toggle_yes: "yes"
23
23
  format_too_deep: Man, you're too deep. (Too many levels of nests at a time)
24
24
  format_unsupported_view: view (%{view}) not supported for %{cardname}
25
+ format_mod_description: Format mod
@@ -57,9 +57,9 @@ i.call(this)}),!1!==this._start(e)&&this._repeat(null,t(e.currentTarget).hasClas
57
57
  // decko_jquery.js.coffee
58
58
  (function(){jQuery.fn.extend({findCard:function(n){return this.find("[data-card-id='"+n+"']")},isMain:function(){return this.slot().parent("#main")[0]},cardMark:function(){return this.data("cardId")?"~"+this.data("cardId"):this.data("cardName")},isMainOrMainModal:function(){var n;return(n=$(this)).closest(".modal")[0]&&(n=n.slotOrigin("modal")),n&&n.isMain()},notify:function(n,i){var a,t,d;return(t=(d=this.slot(i)).find(".card-notice"))[0]||(t=$('<div class="card-notice"></div>'),(a=d.find(".card-form"))[0]?$(a[0]).append(t):d.append(t)),t.html(n),t.show("blind")}})}).call(this);
59
59
  // slot.js.coffee
60
- (function(){var t,o,s;decko.slot={path:function(t,s){var e;return e=o(s),decko.path(t)+(t.match(/\?/)?"&":"?")+$.param(e)},ready:function(t){return $("document").ready(function(){return $("body").on("decko.slot.ready",".card-slot",function(o,s){return o.stopPropagation(),null!=s?t.call(this,$(this),$(s)):t.call(this,$(this))})})},destroy:function(t){return $("document").ready(function(){return $("body").on("decko.slot.destroy",".card-slot, ._modal-slot",function(o){return o.stopPropagation(),t.call(this,$(this))})})}},jQuery.fn.extend({isSlot:function(){return $(this).hasClass("card-slot")},triggerSlotReady:function(t){return this.isSlot()&&this.trigger("decko.slot.ready",t),this.find(".card-slot").trigger("decko.slot.ready",t)},slot:function(t,o){return null==t&&(t="success"),null==o&&(o="replace"),"modal"===o?this.modalSlot():this._slotSelect("slot-"+t+"-selector")||this._slotSelect("slot-selector")||this.closest(".card-slot")},slotUrl:function(){var t;return t=$(this),decko.slot.path(t.cardMark()+"/"+t.data("slot").view)},slotFind:function(t){switch(t){case"modal-origin":return this.slotOrigin("modal");case"overlay-origin":return this.slotOrigin("overlay");default:return s(this.closest(t),this.closest(".card-slot"),t)}},slotClear:function(){return this.trigger("decko.slot.destroy"),this.empty()},slotOrigin:function(t){var o,s;return s=this.closest("[data-"+t+"-origin-slot-id]").data(t+"-origin-slot-id"),null!=(o=$("[data-slot-id="+s+"]"))[0]?o:decko.warn("couldn't find origin with slot id "+s)},slotReload:function(t){return this.each(function(){return $(this)._slotReloadSingle(t)})},slotUpdate:function(t,o){return o||(o="replace"),this.slotContent(t,o,$(this))},slotContent:function(t,o,s){var e;return"string"==typeof(e=$(t)[0]&&$(t)||t)?this.slot("success",o)._slotFillOrReplace(e,s):(e.hasClass("_overlay")?o="overlay":e.hasClass("_modal")&&(o="modal"),this.slot("success",o)._slotContentFromElement(e,o,s)),e},_slotContentFromElement:function(t,o,s){var e;return"overlay"===o?this.addOverlay(t,s):t.hasClass("_modal-slot")||"modal"===o?t.showAsModal(s):((e=this.data("slot-id"))&&t.attr("data-slot-id",e),this.trigger("decko.slot.destroy"),this._slotFillOrReplace(t,s),decko.contentLoaded(t,s))},_slotFillOrReplace:function(t,o){return this.hasClass("_fixed-slot")?this.html(t):this.replaceWith(t),decko.contentLoaded(this,o)},_slotSelect:function(t){var o,s;if(o=this.data(t))return(s=this.slotFind(o))&&s[0]&&s},_slotReloadSingle:function(t){var o;return o=$(this),null==t&&(t=o.slotUrl()),o.addClass("slotter"),o.data("url",t),o.data("remote",!0),o.attr("href",t),this[0].href=t,$.rails.handleRemote(o)}}),o=function(o){var s,e,l;return e={},null!=(s=$("#main").children(".card-slot").data("cardName"))&&(e.main=s),o&&(o.isMain()&&(e.is_main=!0),null!=(l=o.data("slot"))&&(t(l,e,"slot"),l.type&&(e.type=l.type))),e},t=function(o,s,e){return $.each(o,function(o,l){var r;return r=e+"["+decko.snakeCase(o)+"]","items"===o?t(l,s,r):s[r]=l})},s=function(t,o,s){for(;0===t.length&&o.length>0;)t=$(o).find(s),o=$(o).parent().closest(".card-slot");return 0===t.length?$(s):t}}).call(this);
60
+ (function(){var t,o,s;decko.slot={path:function(t,s,l){var e;return e=o(s),null!=l&&(e.slotter_mode=l),decko.path(t)+(t.match(/\?/)?"&":"?")+$.param(e)},ready:function(t){return $("document").ready(function(){return $("body").on("decko.slot.ready",".card-slot",function(o,s){return o.stopPropagation(),null!=s?t.call(this,$(this),$(s)):t.call(this,$(this))})})},destroy:function(t){return $("document").ready(function(){return $("body").on("decko.slot.destroy",".card-slot, ._modal-slot",function(o){return o.stopPropagation(),t.call(this,$(this))})})}},jQuery.fn.extend({isSlot:function(){return $(this).hasClass("card-slot")},triggerSlotReady:function(t){return this.isSlot()&&this.trigger("decko.slot.ready",t),this.find(".card-slot").trigger("decko.slot.ready",t)},slot:function(t,o){return null==t&&(t="success"),null==o&&(o="replace"),"modal"===o?this.modalSlot():this._slotSelect("slot-"+t+"-selector")||this._slotSelect("slot-selector")||this.closest(".card-slot")},slotUrl:function(){var t;return t=$(this),decko.slot.path(t.cardMark()+"/"+t.data("slot").view)},slotFind:function(t){switch(t){case"modal-origin":return this.slotOrigin("modal");case"overlay-origin":return this.slotOrigin("overlay");default:return s(this.closest(t),this.closest(".card-slot"),t)}},slotClear:function(){return this.trigger("decko.slot.destroy"),this.empty()},slotOrigin:function(t){var o,s;return s=this.closest("[data-"+t+"-origin-slot-id]").data(t+"-origin-slot-id"),(o=$("[data-slot-id="+s+"]")).length>0?o:decko.warn("couldn't find origin with slot id "+s)},slotReload:function(t){return this.each(function(){return $(this)._slotReloadSingle(t)})},slotReloading:function(){},slotLoadingComplete:function(){},slotUpdate:function(t,o){return o||(o="replace"),this.slotContent(t,o,$(this))},slotContent:function(t,o,s){var l;return"string"==typeof(l=$(t).length>0&&$(t)||t)?this.slot("success",o)._slotFillOrReplace(l,s):(l.hasClass("_overlay")?o="overlay":l.hasClass("_modal")&&(o="modal"),this.slot("success",o)._slotContentFromElement(l,o,s)),l},_slotContentFromElement:function(t,o,s){var l;return"overlay"===o?this.addOverlay(t,s):t.hasClass("_modal-slot")||"modal"===o?t.showAsModal(s):((l=this.data("slot-id"))&&t.attr("data-slot-id",l),this.trigger("decko.slot.destroy"),this._slotFillOrReplace(t,s),decko.contentLoaded(t,s))},_slotFillOrReplace:function(t,o){return this.hasClass("_fixed-slot")?this.html(t):this.replaceWith(t),decko.contentLoaded(this,o)},_slotSelect:function(t){var o,s;if(o=this.data(t))return(s=this.slotFind(o))&&s[0]&&s},_slotReloadSingle:function(t){var o;return o=$(this),null==t&&(t=o.slotUrl()),o.addClass("slotter"),o.data("url",t),o.data("remote",!0),o.attr("href",t),this[0].href=t,$.rails.handleRemote(o),o.slotReloading()}}),o=function(o){var s,l,e;return l={},null!=(s=$("#main").children(".card-slot").data("cardName"))&&(l.main=s),o&&(o.isMain()&&(l.is_main=!0),null!=(e=o.data("slot"))&&(t(e,l,"slot"),e.type&&(l.type=e.type))),l},t=function(o,s,l){return $.each(o,function(o,e){var n;return n=l+"["+decko.snakeCase(o)+"]","items"===o?t(e,s,n):s[n]=e})},s=function(t,o,s){for(;0===t.length&&o.length>0;)t=$(o).find(s),o=$(o).parent().closest(".card-slot");return 0===t.length?$(s):t}}).call(this);
61
61
  // slotter.js.coffee
62
- (function(){$(window).ready(function(){return $("body").on("ajax:success",".slotter",function(t,s){return $(this).slotterSuccess(t,s)}),$("body").on("ajax:error",".slotter",function(t,s){return $(this).showErrorResponse(s.status,s.responseText)}),$("body").on("click","button.slotter",function(){return!!$.rails.allowAction($(this))&&$.rails.handleRemote($(this))}),$("body").on("click",'[data-bs-dismiss="overlay"]',function(){return $(this).slotFind(".card-slot._overlay").removeOverlay()}),$("body").on("click","._close-overlay-on-success",function(){return $(this).closeOnSuccess("overlay")}),$("body").on("click","._close-modal-on-success",function(){return $(this).closeOnSuccess("modal")}),$("body").on("click","._close-on-success",function(){return $(this).closeOnSuccess()}),$("body").on("click","._update-origin",function(){return $(this).closest(".slotter").data("slotter-mode","update-origin")}),$("body").on("submit","form.slotter",function(){var t;if((t=$(this)).data("main-success")&&t.isMainOrMainModal())return t.mainSuccess()}),$("body").on("ajax:beforeSend",".slotter",function(t,s,o){return $(this).slotterBeforeSend(o)})}),jQuery.fn.extend({mainSuccess:function(){var t;return t=$(this),$.each(t.data("main-success"),function(s,o){var e,i;return i="[name=success\\["+s+"\\]]",(e=t.find(i))[0]||(e=$('<input type="hidden" name="success['+s+']"/>'),t.append(e)),e.val(o)})},slotterSuccess:function(t,s){var o,e,i;if(this.hasClass("slotter")){if(!t.slotSuccessful)return this.showSuccessResponse(s,this.data("slotter-mode")),this.hasClass("_close-overlay")&&this.removeOverlay(),this.hasClass("_close-modal")&&this.closest(".modal").modal("hide"),this.hasClass("card-paging-link")&&(i=this.slot().offset().top,$("body").scrollTop(i)),this.data("update-foreign-slot")&&(o=this.slotFind(this.data("update-foreign-slot")),e=this.data("update-foreign-slot-url"),o.slotReload(e)),this.data("original-slotter-mode")&&this.attr("data-slotter-mode",this.data("original-slotter-mode")),this.data("original-slot-selector")&&this.attr("data-slot-selector",this.data("original-slot-selector")),t.slotSuccessful=!0}else console.log("warning: slotterSuccess called on non-slotter element "+this)},showSuccessResponse:function(t,s){if(t.redirect)return window.location=t.redirect;if(t.reload)return window.location.reload(!0);switch(s){case"silent-success":break;case"update-modal-origin":return this.updateModalOrigin();case"update-origin":return this.updateOrigin();default:return this.slotUpdate(t,s)}},showErrorResponse:function(t,s){return 403===t?$(s).showAsModal($(this)):900===t?$(s).showAsModal($(this)):(this.notify(s,"error"),409===t?this.slot().find(".current_revision_id").val(this.slot().find(".new-current-revision-id").text()):void 0)},updateModalOrigin:function(){return this.overlaySlot()?this.slotOrigin("overlay").updateOrigin():this.closest("#modal-container")[0]?this.updateOrigin():void 0},updateOrigin:function(){var t,s;if(null!=(s=this.overlaySlot()?"overlay":this.closest("#modal-container")[0]?"modal":void 0))return(t=this.slotOrigin(s))&&null!=t[0]?t.slotReload():void 0},registerAsOrigin:function(t,s){return s.hasClass("_modal-slot")&&(s=s.find(".modal-body")),s.attr("data-"+t+"-origin-slot-id",this.slot().data("slot-id"))},closeOnSuccess:function(t){var s;return s=this.closest(".slotter"),null==t&&(t=this.isInOverlay()?"overlay":"modal"),s.addClass("_close-"+t)},slotterBeforeSend:function(t){if(!t.noSlotParams&&!t.url.match(/home_view/)&&"modal"!==this.data("slotter-mode")&&"override"!==this.data("slotter-mode"))return t.url=decko.slot.path(t.url,this.slot())}})}).call(this);
62
+ (function(){$(window).ready(function(){return $("body").on("ajax:send",".slotter",function(){return $(this).slot().slotReloading()}),$("body").on("ajax:success",".slotter",function(t,o){return $(this).slotterSuccess(t,o)}),$("body").on("ajax:error",".slotter",function(t,o){return $(this).showErrorResponse(o.status,o.responseText)}),$("body").on("ajax:complete",".slotter",function(){return $(this).slot().slotLoadingComplete()}),$("body").on("click","button.slotter",function(){return!!$.rails.allowAction($(this))&&$.rails.handleRemote($(this))}),$("body").on("click",'[data-bs-dismiss="overlay"]',function(){return $(this).slotFind(".card-slot._overlay").removeOverlay()}),$("body").on("click","._close-overlay-on-success",function(){return $(this).closeOnSuccess("overlay")}),$("body").on("click","._close-modal-on-success",function(){return $(this).closeOnSuccess("modal")}),$("body").on("click","._close-on-success",function(){return $(this).closeOnSuccess()}),$("body").on("click","._update-origin",function(){return $(this).closest(".slotter").data("slotter-mode","update-origin")}),$("body").on("submit","form.slotter",function(){var t;if((t=$(this)).data("main-success")&&t.isMainOrMainModal())return t.mainSuccess()}),$("body").on("ajax:beforeSend",".slotter",function(t,o,s){return $(this).slotterBeforeSend(s)}),$("body").on("ajax:beforeSend",".card-slot",function(t){return t.stopPropagation()}),$("body").on("ajax:send",".card-slot",function(t){return t.stopPropagation()})}),jQuery.fn.extend({mainSuccess:function(){var t;return t=$(this),$.each(t.data("main-success"),function(o,s){var e,i;return i="[name=success\\["+o+"\\]]",(e=t.find(i))[0]||(e=$('<input type="hidden" name="success['+o+']"/>'),t.append(e)),e.val(s)})},slotterSuccess:function(t,o){var s,e,i;if(this.hasClass("slotter")){if(!t.slotSuccessful)return this.showSuccessResponse(o,this.data("slotter-mode")),this.hasClass("_close-overlay")&&this.removeOverlay(),this.hasClass("_close-modal")&&this.closest(".modal").modal("hide"),this.hasClass("card-paging-link")&&(i=this.slot().offset().top,$("body").scrollTop(i)),this.data("update-foreign-slot")&&(s=this.slotFind(this.data("update-foreign-slot")),e=this.data("update-foreign-slot-url"),s.slotReload(e)),this.data("original-slotter-mode")&&this.attr("data-slotter-mode",this.data("original-slotter-mode")),this.data("original-slot-selector")&&this.attr("data-slot-selector",this.data("original-slot-selector")),t.slotSuccessful=!0}else console.log("warning: slotterSuccess called on non-slotter element "+this)},showSuccessResponse:function(t,o){if(t.redirect)return window.location=t.redirect;if(t.reload)return window.location.reload(!0);switch(o){case"silent-success":break;case"update-modal-origin":return this.updateModalOrigin();case"update-origin":return this.updateOrigin();default:return this.slotUpdate(t,o)}},showErrorResponse:function(t,o){return 403===t?$(o).showAsModal($(this)):900===t?$(o).showAsModal($(this)):(this.notify(o,"error"),409===t?this.slot().find(".current_revision_id").val(this.slot().find(".new-current-revision-id").text()):void 0)},updateModalOrigin:function(){return this.overlaySlot()?this.slotOrigin("overlay").updateOrigin():this.closest("#modal-container")[0]?this.updateOrigin():void 0},updateOrigin:function(){var t,o;if(null!=(o=this.overlaySlot()?"overlay":this.closest("#modal-container")[0]?"modal":void 0))return(t=this.slotOrigin(o))&&null!=t[0]?t.slotReload():void 0},registerAsOrigin:function(t,o){return o.hasClass("_modal-slot")&&(o=o.find(".modal-body")),o.attr("data-"+t+"-origin-slot-id",this.slot().data("slot-id"))},closeOnSuccess:function(t){var o;return o=this.closest(".slotter"),null==t&&(t=this.isInOverlay()?"overlay":"modal"),o.addClass("_close-"+t)},slotterBeforeSend:function(t){var o;if(o=this.slotterMode(),!t.noSlotParams&&!t.url.match(/home_view/)&&"modal"!==o&&"override"!==o)return t.url=decko.slot.path(t.url,this.slot(),o)},slotterMode:function(){var t;if(null!=(t=this.data("slotter-mode"))&&(!t.match(/origin/)||this.slotOrigin()))return t}})}).call(this);
63
63
  // slot_ready.js.coffee
64
64
  (function(){decko.slot.ready(function(a){return a.find("card-view-placeholder").each(function(){var a;if(!(a=$(this)).data("loading"))return a.data("loading",!0),$.get(a.data("url"),function(e){return a.replaceWith(e)})}),a.find("._disappear").delay(5e3).animate({height:0},1e3,function(){return $(this).hide()})})}).call(this);
65
65
  // clicks_and_hovers.js.coffee
@@ -2,7 +2,7 @@
2
2
 
3
3
  class Card
4
4
  class Format
5
- class CsvFormat < TextFormat
5
+ class CsvFormat < Format
6
6
  register :csv
7
7
 
8
8
  def mime_type
data/set/all/csv.rb CHANGED
@@ -20,10 +20,10 @@ format :csv do
20
20
 
21
21
  view :titled do
22
22
  voo.items[:view] ||= :row
23
- (render_header + render_core).map { |row| CSV.generate_line row }.join
23
+ (render_header + render_body).map { |row| CSV.generate_line row }.join
24
24
  end
25
25
 
26
- view :core do
26
+ view :body do
27
27
  item_cards.map { |item_card| nest item_card }
28
28
  end
29
29
 
data/set/all/demo.rb CHANGED
@@ -28,11 +28,15 @@ format :html do
28
28
  def view_select
29
29
  card_form :get, success: { view: :demo } do
30
30
  select_tag :demo_view,
31
- options_for_select(all_views, demo_view),
31
+ options_for_select(all_views_from_admin_config, demo_view),
32
32
  class: "_submit-on-select"
33
33
  end
34
34
  end
35
35
 
36
+ def all_views_from_admin_config
37
+ card.all_admin_configs_of_category("views").map(&:codename)
38
+ end
39
+
36
40
  def all_views
37
41
  Card::Set::Format::AbstractFormat::ViewDefinition
38
42
  .views.slice(*self.class.ancestors).values.map(&:keys).flatten.uniq.sort
@@ -147,14 +147,14 @@ format :html do
147
147
 
148
148
  def signin_link
149
149
  link_to_card :signin, t(:account_sign_in)&.downcase,
150
- class: "signin-link", slotter: true, path: { view: :open }
150
+ class: "signin-link", path: { view: :titled }
151
151
  end
152
152
 
153
153
  def signup_link
154
154
  return unless signup_ok?
155
155
 
156
156
  link_to_card :signup, t(:account_sign_up)&.downcase,
157
- class: "signup-link", slotter: true, path: { action: :new }
157
+ class: "signup-link", path: { action: :new }
158
158
  end
159
159
 
160
160
  def signup_ok?
@@ -36,14 +36,16 @@ format :html do
36
36
  end
37
37
  end
38
38
 
39
+ def panel &block
40
+ wrap_with :div, class: classy("d0-card-frame"), &block
41
+ end
42
+
43
+ private
44
+
39
45
  def frame_and_form action, form_opts={}, &block
40
46
  form_opts ||= {}
41
47
  frame do
42
48
  card_form action, form_opts, &block
43
49
  end
44
50
  end
45
-
46
- def panel &block
47
- wrap_with :div, class: classy("d0-card-frame"), &block
48
- end
49
51
  end
data/set/all/html/menu.rb CHANGED
@@ -1,4 +1,10 @@
1
1
  format :html do
2
+ view :menu_block do
3
+ wrap_with :div, class: "menu-block position-relative py-2" do
4
+ [render_menu, "&nbsp;"]
5
+ end
6
+ end
7
+
2
8
  view :menu, denial: :blank, unknown: true do
3
9
  return "" unless card.known?
4
10
  # would be preferable to do this with unknown: :blank, but that fails with view
@@ -6,6 +12,29 @@ format :html do
6
12
  wrap_with(:div, class: "card-menu #{menu_link_classes}") { menu_items }
7
13
  end
8
14
 
15
+ view :edit_link, unknown: true, denial: :blank do
16
+ edit_link edit_link_view
17
+ end
18
+
19
+ view :edit_button do
20
+ view = voo.edit == :inline ? :edit_inline : :edit
21
+ link_to_view view, "Edit", class: "btn btn-sm btn-outline-primary me-2"
22
+ end
23
+
24
+ view :full_page_link do
25
+ full_page_link
26
+ end
27
+
28
+ view :board_link, unknown: true do
29
+ board_link
30
+ end
31
+
32
+ # no caching because help_text view doesn't cache, and we can't have a
33
+ # stub in the data-content attribute or it will get html escaped.
34
+ view :help_link, cache: :never, unknown: true do
35
+ help_link render_help_text, help_title
36
+ end
37
+
9
38
  def menu_edit_link
10
39
  case voo.edit
11
40
  when :inline
@@ -36,40 +65,34 @@ format :html do
36
65
  end
37
66
  end
38
67
 
39
- view :edit_link, unknown: true, denial: :blank do
40
- edit_link edit_link_view
41
- end
42
-
43
- view :edit_button do
44
- view = voo.edit == :inline ? :edit_inline : :edit
45
- link_to_view view, "Edit", class: "btn btn-sm btn-outline-primary me-2"
46
- end
47
-
48
68
  def edit_link_view
49
69
  :edit
50
70
  end
51
71
 
52
- view :full_page_link do
53
- full_page_link
54
- end
55
-
56
- view :board_link, unknown: true do
57
- board_link
58
- end
59
-
72
+ # Generates a link to a board with optional parameters.
73
+ #
74
+ # @param [String] text The text displayed on the link.
75
+ # @param [Boolean] in_modal (true) Indicates whether the board
76
+ # link should open in a modal.
77
+ # @param [Boolean] confirm (false) Indicates whether to show a
78
+ # confirmation for potential data loss.
79
+ #
80
+ # @return [String] The HTML code for the board link.
81
+ #
82
+ # @example
83
+ # board_link(text: "Advanced", in_modal: true, confirm: true)
60
84
  def board_link text: "", in_modal: true, confirm: false
61
- opts = { class: "board-link" }
85
+ opts = {
86
+ class: "board-link",
87
+ title: "Advanced",
88
+ "data-bs-toggle": "tooltip",
89
+ "data-bs-placement": "bottom"
90
+ }
62
91
  opts["data-slotter-mode"] = "modal-replace" if in_modal
63
92
  confirm_edit_loss opts if confirm
64
93
  link_to_view :board, "#{board_icon} #{text}", opts
65
94
  end
66
95
 
67
- # no caching because help_text view doesn't cache, and we can't have a
68
- # stub in the data-content attribute or it will get html escaped.
69
- view :help_link, cache: :never, unknown: true do
70
- help_link render_help_text, help_title
71
- end
72
-
73
96
  def help_link text=nil, title=nil
74
97
  opts = help_popover_opts text, title
75
98
  add_class opts, "_card-menu-popover"
@@ -129,9 +152,24 @@ format :html do
129
152
  edit_link_opts(modal: (modal || :lg))
130
153
  end
131
154
 
132
- # @param modal [Symbol] modal size
155
+ # Generates options hash for an edit link with optional parameters.
156
+ #
157
+ # @param [Symbol] modal (nil) The modal class to use for the edit link.
158
+ #
159
+ # @return [Hash] The options hash for the edit link.
160
+ #
161
+ # @example
162
+ # edit_link_opts(modal: "custom-modal")
163
+ # #=> { class: 'edit-link', title: 'Edit', 'data-bs-toggle': 'tooltip',
164
+ # 'data-bs-placement': 'bottom', 'data-slotter-mode': 'modal',
165
+ # 'data-modal-class': 'modal-custom-modal' }
133
166
  def edit_link_opts modal: nil
134
- opts = { class: classy("edit-link") }
167
+ opts = {
168
+ class: classy("edit-link"),
169
+ title: "Edit",
170
+ "data-bs-toggle": "tooltip",
171
+ "data-bs-placement": "bottom"
172
+ }
135
173
  if modal
136
174
  opts[:"data-slotter-mode"] = "modal"
137
175
  opts[:"data-modal-class"] = "modal-#{modal}"
@@ -67,7 +67,7 @@ format :html do
67
67
  view :labeled, unknown: :labeled do
68
68
  @content_body = true
69
69
  wrap(true, class: "row") do
70
- labeled(render_title, wrap_body { "#{render_menu}#{render_labeled_content}" })
70
+ [labeled(render_title, wrap_body { render_labeled_content }), render_menu]
71
71
  end
72
72
  end
73
73
 
data/set/all/html/wrap.rb CHANGED
@@ -40,6 +40,7 @@ format :html do
40
40
  "card-id": card.id,
41
41
  "card-name": slot_cardname,
42
42
  "card-type-id": card.type_id,
43
+ "card-type-name": card.type_name,
43
44
  "card-link-name": card.name.url_key,
44
45
  "slot-id": SecureRandom.hex(10)
45
46
  }
data/set/all/links.rb CHANGED
@@ -26,9 +26,10 @@ format do
26
26
  end
27
27
 
28
28
  # link to a card other than the current card.
29
- # @param cardish [Integer, Symbol, String, Card] a card identifier
30
- # @param text [String]
31
- # @param opts [Hash]
29
+ # @param cardish [Integer, Symbol, String, Card]: A card identifier
30
+ # @param text [String], optional: The text content of the link.
31
+ # @param opts [Hash], optional: Additional options for the link.
32
+ # @return [String] HTML markup for the generated link.
32
33
  def link_to_card cardish, text=nil, opts={}
33
34
  add_to_path opts, mark: Card::Name[cardish]
34
35
  link_to text, opts
@@ -79,6 +80,12 @@ format do
79
80
  end
80
81
  end
81
82
 
83
+ # Adds key-value pairs from a new hash to the 'path' key
84
+ # in the given options dictionary.
85
+ # @params opts [dict]: The options dictionary to be modified.
86
+ # @params new_hash [dict]: The new hash containing
87
+ # key-value pairs to be added to the 'path'.
88
+ # @return [Hash] The value of opts[:path]
82
89
  def add_to_path opts, new_hash
83
90
  opts[:path] = (opts[:path] || {}).merge new_hash
84
91
  end
data/set/all/yaml.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  format :yaml do
2
2
  def show view, args={}
3
- view ||= :export
4
3
  render!(view, args).to_yaml
5
4
  end
5
+
6
+ view :core do
7
+ render_pod
8
+ end
6
9
  end
data/set/type/cardtype.rb CHANGED
@@ -85,3 +85,7 @@ format :html do
85
85
  end
86
86
  end
87
87
  end
88
+
89
+ def scoping_rule_card
90
+ Card.fetch([self, :type, :update], new: {})
91
+ end
data/set/type/mod.rb ADDED
@@ -0,0 +1,15 @@
1
+ format :html do
2
+ view :admin do
3
+ render_core
4
+ end
5
+
6
+ view :bar_right do
7
+ %w[settings configurations tasks cardtypes scripts styles].filter do |name|
8
+ card.send("#{name}?")
9
+ end.join ", "
10
+ end
11
+
12
+ def before_bar
13
+ voo.show :bar_middle
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card-mod-format
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.17.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: 2023-11-18 00:00:00.000000000 Z
13
+ date: 2024-06-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: card
@@ -18,28 +18,28 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.106.0
21
+ version: 1.107.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.106.0
28
+ version: 1.107.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: card-mod-content
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - '='
34
34
  - !ruby/object:Gem::Version
35
- version: 0.16.0
35
+ version: 0.17.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.16.0
42
+ version: 0.17.0
43
43
  description: ''
44
44
  email:
45
45
  - info@decko.org
@@ -65,6 +65,7 @@ files:
65
65
  - assets/style/messaging.scss
66
66
  - assets/style/misc.scss
67
67
  - assets/style/open_and_closed.scss
68
+ - config/admin.yml
68
69
  - config/locales/de.yml
69
70
  - config/locales/en.yml
70
71
  - data/files/credit_image.svg
@@ -123,6 +124,7 @@ files:
123
124
  - set/type/cardtype.rb
124
125
  - set/type/html.rb
125
126
  - set/type/json.rb
127
+ - set/type/mod.rb
126
128
  - set/type/number.rb
127
129
  - set/type/phrase.rb
128
130
  - set/type/plain_text.rb
@@ -222,14 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
222
224
  requirements:
223
225
  - - ">="
224
226
  - !ruby/object:Gem::Version
225
- version: '2.5'
227
+ version: '3.0'
226
228
  required_rubygems_version: !ruby/object:Gem::Requirement
227
229
  requirements:
228
230
  - - ">="
229
231
  - !ruby/object:Gem::Version
230
232
  version: '0'
231
233
  requirements: []
232
- rubygems_version: 3.4.10
234
+ rubygems_version: 3.5.10
233
235
  signing_key:
234
236
  specification_version: 4
235
237
  summary: format