card-mod-format 0.16.0 → 0.18.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: cab523b20f35c8ea7c8107b3d8b1cadcb9607fd100bc2141be6d7d621661c693
4
+ data.tar.gz: 827196f633de45d6c34ad8e28055f167d37ec5385fd047c40adbe30487a37d48
5
5
  SHA512:
6
- metadata.gz: c74b05756440c35fb17760bfdb5a80974928eadc8de9b3bce8e2742d44a9a148421248c6f1395b9b6951be2f3f14ecad967f38869e7c1725a93051570a56de8f
7
- data.tar.gz: 150196fe1ab672b1580059d1d7cd354532751b8ae492f76abed06d8427a4c664997d39b02f0fd6403d306eb26fa44b49a8caa5225ba36d51dd11dd17b06c7c00
6
+ metadata.gz: f1e207c0f720a853add22b1c07d82d61caa2c295793e49c960394c83fb59a92495adb61a270b1a94f3c131889fdf13f2f099d6b86f98ec1ee456e5b68c0d9cf4
7
+ data.tar.gz: 20e3f3063a4f1a108ba2a05a6cea6c62054a6794f79b673a2cdd7615b403600f7656234feeb9bfa20ebb74c37910f474a9572353c396c04dd38e26a0eb4c4fd2
@@ -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,10 @@
6
6
  position: absolute;
7
7
  right: 8px;
8
8
  top: 5px;
9
+ width: auto;
10
+ > a {
11
+ text-decoration: none !important;
12
+ }
9
13
  }
10
14
 
11
15
  .d0-card-content, .titled-view > .d0-card-header {
@@ -14,8 +18,10 @@
14
18
  }
15
19
  }
16
20
 
17
- .d0-card-content .card-menu i {
18
- font-size: 1.2em
21
+ .d0-card-content, .labeled-view {
22
+ .card-menu i {
23
+ font-size: 1.2em
24
+ }
19
25
  }
20
26
 
21
27
  .modal-menu, .overlay-menu {
@@ -33,7 +39,7 @@
33
39
  // Hover over these, and only the card menus that are immediate children will appear
34
40
  .card-slot > .d0-card-frame > .d0-card-header,
35
41
  .card-slot > .d0-card-header,
36
- .card-slot.labeled-view > .labeled-content > .d0-card-body,
42
+ .card-slot.labeled-view,
37
43
  .card-slot,
38
44
  .card > .card-body,
39
45
  .card > .card-header {
@@ -21,7 +21,9 @@
21
21
  font-weight: bold;
22
22
  font-style: italic;
23
23
  text-align: center;
24
- margin: 0 0 4px 0;
24
+ > div {
25
+ margin: 1em;
26
+ }
25
27
 
26
28
  .card-error-msg {
27
29
  text-align: left;
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,11 +2,15 @@
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
9
- "text/comma-separated-values"
9
+ if params[:disposition] == "inline"
10
+ "text/plain"
11
+ else
12
+ "text/comma-separated-values"
13
+ end
10
14
  end
11
15
 
12
16
  def self.view_caching?
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
@@ -12,7 +12,7 @@ format :html do
12
12
  end
13
13
 
14
14
  def view_list
15
- %i[content titled labeled bar box open closed content_panel]
15
+ %i[content titled labeled bar box open closed]
16
16
  end
17
17
 
18
18
  def demo_view
@@ -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/head.rb CHANGED
@@ -1,9 +1,17 @@
1
1
  basket[:head_views] =
2
2
  %i[page_title_tag meta_tags favicon_tag
3
- head_remote_stylesheets head_stylesheet
3
+ stylesheet_tags
4
4
  universal_edit_button rss_links]
5
5
  # TODO: the last two should be in mods
6
6
 
7
+ basket[:cache_seed_names] += [
8
+ %i[all head],
9
+ %i[all style],
10
+ %i[all style asset_output],
11
+ %i[all script],
12
+ %i[script right content_options]
13
+ ]
14
+
7
15
  format do
8
16
  view :page_title, unknown: true, perms: :none do
9
17
  title_parts = [Card::Rule.global_setting(:title)]
@@ -13,7 +21,7 @@ format do
13
21
  end
14
22
 
15
23
  format :html do
16
- view :head, unknown: true, perms: :none do
24
+ view :head, unknown: true, perms: :none, cache: :yes do
17
25
  basket[:head_views].map { |viewname| render viewname }.flatten.compact.join "\n"
18
26
  end
19
27
 
@@ -27,6 +35,7 @@ format :html do
27
35
  nest :favicon, view: :link_tag
28
36
  end
29
37
 
38
+ # TODO: move to mod
30
39
  view :universal_edit_button, unknown: :blank, denial: :blank, perms: :update do
31
40
  return if card.new?
32
41
 
@@ -34,61 +43,31 @@ format :html do
34
43
  title: "Edit this page!", href: path(view: :edit)
35
44
  end
36
45
 
46
+ # TODO: move to rss mod
47
+ view :rss_links, unknown: true, perms: :none do
48
+ render :rss_link_tag if rss_link?
49
+ end
50
+
37
51
  # these should render a view of the rule card
38
52
  # it would then be safe to cache if combined with param handling
39
53
  # (but note that machine clearing would need to reset card cache...)
40
- view :head_stylesheet, unknown: true, cache: :never, perms: :none do
41
- return unless (href = head_stylesheet_path)
42
-
43
- tag("link", href: href, media: "all", rel: "stylesheet", type: "text/css")
54
+ view :stylesheet_tags, cache: :never, unknown: true, perms: :none do
55
+ [nest(:style_mods, view: :remote_style_tags), head_stylesheet_path]
44
56
  end
45
57
 
46
- view :head_remote_stylesheets, unknown: true, cache: :never, perms: :none do
47
- remote_style_tags
58
+ def head_stylesheet_path
59
+ @head_stylesheet_path ||=
60
+ tag "link", media: "all",
61
+ rel: "stylesheet",
62
+ type: "text/css",
63
+ href: nest(param_or_rule_card(:style), view: :stylesheet_path)
48
64
  end
49
65
 
50
66
  def param_or_rule_card setting
51
- if params[setting]
52
- Card[params[setting]]
53
- else
54
- root.card.rule_card setting
55
- end
56
- end
57
-
58
- def debug_or_machine_path setting, debug_lambda, machine_path_lambda
59
- return unless (asset_card = param_or_rule_card setting)
60
- debug_path(setting, asset_card, &debug_lambda) ||
61
- machine_path_lambda.call(asset_card.asset_output_url)
62
- end
63
-
64
- def debug_path setting, asset_card
65
- return unless params[:debug] == setting.to_s
66
-
67
- yield asset_card
68
- end
69
-
70
- # TODO: move to rss mod
71
- view :rss_links, unknown: true, perms: :none do
72
- render :rss_link_tag if rss_link?
67
+ params[setting]&.card || root.card.rule_card(setting)
73
68
  end
74
69
 
75
70
  def rss_link?
76
71
  Card.config.rss_enabled && respond_to?(:rss_link_tag)
77
72
  end
78
-
79
- def remote_style_tags
80
- return unless (asset_card = Card[:style_mods])
81
-
82
- asset_card.item_cards.map do |mod_style_card|
83
- nest mod_style_card, view: :remote_include_tags
84
- end.select(&:present?)
85
- end
86
-
87
- def head_stylesheet_path
88
- debug_or_machine_path(
89
- :style,
90
- ->(style_card) { path mark: style_card.name, item: :import, format: :css },
91
- ->(machine_path) { machine_path }
92
- )
93
- end
94
73
  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}"
data/set/all/html/show.rb CHANGED
@@ -25,7 +25,15 @@ format :html do
25
25
  render! view, args
26
26
  end
27
27
 
28
+ def default_page_view
29
+ default_nest_view
30
+ end
31
+
28
32
  def show_method
29
33
  "show_#{show_layout? ? :with : :without}_page_layout"
30
34
  end
35
+
36
+ def show_layout?
37
+ !Env.ajax? || params[:layout]
38
+ end
31
39
  end
@@ -7,7 +7,7 @@ format :html do
7
7
 
8
8
  before(:content) { prepare_content_slot }
9
9
 
10
- view :content do
10
+ view :content, cache: :yes do
11
11
  wrap do
12
12
  [
13
13
  render_menu(optional: :hide),
@@ -52,7 +52,7 @@ format :html do
52
52
  end
53
53
  end
54
54
 
55
- view :titled do
55
+ view :titled, cache: :yes do
56
56
  @content_body = true
57
57
  wrap do
58
58
  [
@@ -64,10 +64,10 @@ format :html do
64
64
  end
65
65
 
66
66
  # unlike unknown: true, unknown: (same view) can be overridden
67
- view :labeled, unknown: :labeled do
67
+ view :labeled, unknown: :labeled, cache: :yes 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
 
@@ -76,7 +76,7 @@ format :html do
76
76
  end
77
77
 
78
78
  def labeled_field field, item_view=:name, opts={}
79
- opts[:title] ||= Card.fetch_name field
79
+ opts[:title] ||= field.cardname
80
80
  field_nest field, opts.merge(view: :labeled,
81
81
  items: (opts[:items] || {}).merge(view: item_view))
82
82
  end
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.18.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-10-31 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.108.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.108.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.18.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.18.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
@@ -205,7 +207,7 @@ files:
205
207
  - vendor/jquery_rails/vendor/assets/javascripts/jquery_ujs.js
206
208
  homepage: https://decko.org
207
209
  licenses:
208
- - GPL-3.0
210
+ - GPL-3.0-or-later
209
211
  metadata:
210
212
  source_code_uri: https://github.com/decko-commons/decko
211
213
  homepage_uri: https://decko.org
@@ -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.7
233
235
  signing_key:
234
236
  specification_version: 4
235
237
  summary: format