card-mod-format 0.16.0 → 0.17.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: 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