promethee 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -50
- data/app/assets/javascripts/promethee-editor.js +8 -0
- data/app/assets/javascripts/promethee.js +0 -59
- data/app/assets/stylesheets/promethee-editor.sass +23 -78
- data/app/assets/stylesheets/promethee-editor/_component.sass +10 -0
- data/app/assets/stylesheets/promethee-editor/_mover.sass +67 -0
- data/app/assets/stylesheets/promethee-editor/_preview.sass +25 -0
- data/app/assets/stylesheets/promethee.sass +1 -2
- data/app/controllers/promethee_controller.rb +8 -0
- data/app/views/promethee/_edit.html.erb +52 -123
- data/app/views/promethee/_show.html.erb +1 -1
- data/app/views/promethee/components/_children.html.erb +4 -0
- data/app/views/promethee/components/_children_edit.html.erb +5 -0
- data/app/views/promethee/components/_column.html.erb +1 -1
- data/app/views/promethee/components/_column_edit.html.erb +35 -33
- data/app/views/promethee/components/_image_edit.html.erb +23 -28
- data/app/views/promethee/components/_page.html.erb +1 -0
- data/app/views/promethee/components/_page_edit.html.erb +10 -0
- data/app/views/promethee/components/_row.html.erb +1 -4
- data/app/views/promethee/components/_row_edit.html.erb +19 -22
- data/app/views/promethee/components/_text_edit.html.erb +16 -20
- data/app/views/promethee/components/_video_edit.html.erb +23 -22
- data/app/views/promethee/partials/_adder.html.erb +64 -0
- data/app/views/promethee/partials/_include_components.html.erb +9 -0
- data/app/views/promethee/partials/_mover.html.erb +98 -0
- data/app/views/promethee/partials/_navbar.html.erb +26 -0
- data/app/views/promethee/partials/_page.html.erb +6 -0
- data/app/views/promethee/partials/_preview.html.erb +12 -0
- data/app/views/promethee/partials/_toolbar_buttons.html.erb +2 -2
- data/app/views/promethee/preview.html.erb +1 -0
- data/config/routes.rb +3 -0
- data/lib/promethee.rb +2 -21
- data/lib/promethee/core_ext/tags.rb +2 -5
- data/lib/promethee/rails/version.rb +1 -1
- metadata +34 -27
- data/app/assets/javascripts/promethee/controller.js +0 -22
- data/app/assets/stylesheets/promethee-editor/_mixins.sass +0 -19
- data/app/assets/stylesheets/promethee-editor/_variables.sass +0 -4
- data/app/views/promethee/components/_index.html.erb +0 -3
- data/app/views/promethee/components/_index_edit.html.erb +0 -7
- data/app/views/promethee/components/_show.html.erb +0 -4
- data/app/views/promethee/components/_show_edit.html.erb +0 -3
- data/lib/promethee/component.rb +0 -28
- data/lib/promethee/component/attribute.rb +0 -42
- data/lib/promethee/component/attribute/boolean.rb +0 -4
- data/lib/promethee/component/attribute/float.rb +0 -3
- data/lib/promethee/component/attribute/integer.rb +0 -3
- data/lib/promethee/component/attribute/string.rb +0 -3
- data/lib/promethee/component/attributes.rb +0 -50
- data/lib/promethee/component/attributes/definer.rb +0 -13
- data/lib/promethee/component/base.rb +0 -68
- data/lib/promethee/component/collection.rb +0 -17
- data/lib/promethee/component/column.rb +0 -8
- data/lib/promethee/component/image.rb +0 -6
- data/lib/promethee/component/row.rb +0 -3
- data/lib/promethee/component/text.rb +0 -5
- data/lib/promethee/component/video.rb +0 -5
- data/lib/promethee/grid.rb +0 -52
- data/vendor/assets/javascripts/angular-drag-and-drop-lists.js +0 -49
@@ -1,22 +0,0 @@
|
|
1
|
-
Promethee.Controller = function(name, initializer) {
|
2
|
-
this.name = name;
|
3
|
-
this.initializer = initializer;
|
4
|
-
};
|
5
|
-
|
6
|
-
Promethee.Controller.prototype = {
|
7
|
-
constructor: Promethee.Controller,
|
8
|
-
|
9
|
-
initialize: function(promethee) {
|
10
|
-
promethee.app.controller(this.name, this.initializer);
|
11
|
-
}
|
12
|
-
};
|
13
|
-
|
14
|
-
Promethee.Controller.controllers = {};
|
15
|
-
|
16
|
-
Promethee.Controller.for = function(name, initializer) {
|
17
|
-
this.controllers[name] = new this(name, initializer);
|
18
|
-
};
|
19
|
-
|
20
|
-
Promethee.Controller.initialize = function(promethee) {
|
21
|
-
for(var name in this.controllers) this.controllers[name].initialize(promethee);
|
22
|
-
};
|
@@ -1,19 +0,0 @@
|
|
1
|
-
=grid-builder-set-gutter-width($width)
|
2
|
-
$was: $grid-gutter-width
|
3
|
-
$grid-gutter-width: $width !global
|
4
|
-
|
5
|
-
.row
|
6
|
-
+make-row
|
7
|
-
|
8
|
-
+make-grid-columns
|
9
|
-
+make-grid(xs)
|
10
|
-
@media(min-width: 768px)
|
11
|
-
+make-grid(sm)
|
12
|
-
|
13
|
-
@media (min-width: 992px)
|
14
|
-
+make-grid(md)
|
15
|
-
|
16
|
-
@media (min-width: 1200px)
|
17
|
-
+make-grid(lg)
|
18
|
-
|
19
|
-
$grid-gutter-width: $was !global
|
@@ -1,7 +0,0 @@
|
|
1
|
-
<script type="text/ng-template" id="promethee/components/index">
|
2
|
-
<div class="promethee-editor__components" ng-init="components = component.children" dnd-list="components" dnd-allowed-types="allowedTypes">
|
3
|
-
<div ng-repeat="component in components">
|
4
|
-
<ng-include src="'promethee/components/show'"></ng-include>
|
5
|
-
</div>
|
6
|
-
</div>
|
7
|
-
</script>
|
data/lib/promethee/component.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module Promethee::Component
|
2
|
-
def self.types
|
3
|
-
Base.descendants.map &:type
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.as type
|
7
|
-
begin
|
8
|
-
class_name = "::Promethee::Component::#{type.to_s.classify}"
|
9
|
-
require "promethee/component/#{type}" unless Object.const_defined? class_name
|
10
|
-
class_name.constantize
|
11
|
-
rescue LoadError
|
12
|
-
raise "Unknown Prométhée component type \"#{type}\". Available types: \"#{types.join '", "'}\"."
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.from data
|
17
|
-
raise "Invalid data provided, expected a Hash got a #{data.class}." unless data.is_a? Hash
|
18
|
-
|
19
|
-
data = data.deep_dup
|
20
|
-
|
21
|
-
data[:attributes] = {} unless data[:attributes].is_a? Hash
|
22
|
-
data[:children] = [] unless data[:children].is_a? Array
|
23
|
-
|
24
|
-
data[:children].map! { |data| from data }
|
25
|
-
|
26
|
-
as(data[:type]).new attributes: data[:attributes], children: data[:children]
|
27
|
-
end
|
28
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Promethee::Component::Attribute
|
2
|
-
class Base
|
3
|
-
attr_reader :name, :value
|
4
|
-
|
5
|
-
def initialize name, value = default
|
6
|
-
@name = name.to_s.to_sym
|
7
|
-
self.value = value
|
8
|
-
end
|
9
|
-
|
10
|
-
def value= value
|
11
|
-
@value = value == default ? default : cast(value)
|
12
|
-
end
|
13
|
-
|
14
|
-
def default
|
15
|
-
self.class.default
|
16
|
-
end
|
17
|
-
|
18
|
-
def cast value
|
19
|
-
self.class.cast.call value
|
20
|
-
end
|
21
|
-
|
22
|
-
def dup
|
23
|
-
self.class.new name, (value.dup rescue value)
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def self.type
|
29
|
-
to_s.split('::').last.underscore
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.default value = nil
|
33
|
-
@value = value unless value.nil?
|
34
|
-
@value
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.cast &block
|
38
|
-
@cast = block if block_given?
|
39
|
-
@cast ||= -> (value) { value }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
class Promethee::Component::Attributes
|
2
|
-
def update hash
|
3
|
-
(names & hash.keys.map(&:to_sym)).each { |name| attributes[name].value = hash[name] }
|
4
|
-
|
5
|
-
self
|
6
|
-
end
|
7
|
-
|
8
|
-
def to_hash
|
9
|
-
attributes.map{ |name, attribute| [name, attribute.value] }.to_h
|
10
|
-
end
|
11
|
-
alias_method :to_h, :to_hash
|
12
|
-
alias_method :as_json, :to_hash
|
13
|
-
|
14
|
-
def [](method)
|
15
|
-
send method
|
16
|
-
end
|
17
|
-
|
18
|
-
def keys
|
19
|
-
attributes.keys
|
20
|
-
end
|
21
|
-
alias_method :names, :keys
|
22
|
-
|
23
|
-
def each &block
|
24
|
-
attributes.values.each &block
|
25
|
-
end
|
26
|
-
|
27
|
-
def << attribute
|
28
|
-
attributes[attribute.name] = attribute
|
29
|
-
|
30
|
-
define_singleton_method(attribute.name) { attribute.value }
|
31
|
-
define_singleton_method("#{attribute.name}=") { |value| attribute.value = value }
|
32
|
-
end
|
33
|
-
|
34
|
-
def dup
|
35
|
-
duplicate = self.class.new
|
36
|
-
each { |attribute| duplicate << attribute.dup }
|
37
|
-
|
38
|
-
duplicate
|
39
|
-
end
|
40
|
-
|
41
|
-
def copy hash
|
42
|
-
dup.update hash
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def attributes
|
48
|
-
@attributes ||= {}
|
49
|
-
end
|
50
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class Promethee::Component::Attributes::Definer
|
2
|
-
attr_reader :component
|
3
|
-
|
4
|
-
def initialize(component)
|
5
|
-
@component = component
|
6
|
-
end
|
7
|
-
|
8
|
-
::Promethee::Component::Attribute::Base.descendants.each do |attribute|
|
9
|
-
define_method attribute.type do |name, default: nil|
|
10
|
-
component.attributes << attribute.new(name, default)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
class Promethee::Component::Base
|
2
|
-
attr_reader :attributes, :children
|
3
|
-
|
4
|
-
def initialize(attributes: {}, children: [])
|
5
|
-
@attributes = self.class.attributes.copy attributes
|
6
|
-
@children = Promethee::Component::Collection.new children
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_hash *options
|
10
|
-
{
|
11
|
-
type: type,
|
12
|
-
attributes: attributes.to_hash,
|
13
|
-
children: children.to_ary
|
14
|
-
}
|
15
|
-
end
|
16
|
-
alias_method :to_h, :to_hash
|
17
|
-
alias_method :as_json, :to_hash
|
18
|
-
|
19
|
-
def to_html
|
20
|
-
ApplicationController.renderer.render partial: "promethee/components/#{type}", locals: { component: self }
|
21
|
-
end
|
22
|
-
|
23
|
-
def [](method)
|
24
|
-
send method
|
25
|
-
end
|
26
|
-
|
27
|
-
def class_name
|
28
|
-
"promethee__component promethee__component--#{type}"
|
29
|
-
end
|
30
|
-
|
31
|
-
def type
|
32
|
-
self.class.type
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.attributes
|
36
|
-
@attributes ||= Promethee::Component::Attributes.new
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.children
|
40
|
-
@children ||= []
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.type
|
44
|
-
to_s.split('::').last.underscore.to_sym
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.final?
|
48
|
-
children.empty?
|
49
|
-
end
|
50
|
-
|
51
|
-
# def self.class_name
|
52
|
-
# "promethee-editor__component promethee__component--#{type}#{' promethee__component--final' if final?}"
|
53
|
-
# end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def self.has_attributes
|
58
|
-
yield Promethee::Component::Attributes::Definer.new(self) if block_given?
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.has_children *components
|
62
|
-
children.concat(components.flatten.map{ |component| component.is_a?(Class) && component < self ? component : Promethee::Component.as(component) }).uniq!
|
63
|
-
end
|
64
|
-
|
65
|
-
class << self
|
66
|
-
alias_method :has_child, :has_children
|
67
|
-
end
|
68
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class Promethee::Component::Collection < Array
|
2
|
-
def to_ary
|
3
|
-
map &:to_hash
|
4
|
-
end
|
5
|
-
alias_method :to_a, :to_ary
|
6
|
-
alias_method :as_json, :to_ary
|
7
|
-
|
8
|
-
def to_html
|
9
|
-
map(&:to_html).join.html_safe
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.from data
|
13
|
-
raise "Invalid data provided, expected a Array got a #{data.class}." unless data.is_a? Array
|
14
|
-
|
15
|
-
new data.map{ |component| Promethee::Component.from component }
|
16
|
-
end
|
17
|
-
end
|
data/lib/promethee/grid.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
class Promethee::Grid
|
2
|
-
include ActionView::Helpers::FormTagHelper
|
3
|
-
|
4
|
-
attr_accessor :data, :name, :id
|
5
|
-
|
6
|
-
def initialize(data = [], name: nil, id: nil)
|
7
|
-
self.data = data
|
8
|
-
self.name = name
|
9
|
-
self.id = id.nil? ? self.class.id : id
|
10
|
-
end
|
11
|
-
|
12
|
-
def components
|
13
|
-
Promethee::Component::Collection.from data
|
14
|
-
end
|
15
|
-
|
16
|
-
# def value
|
17
|
-
# data.is_a?(String) ? data : data.to_json
|
18
|
-
# end
|
19
|
-
|
20
|
-
def input options = {}
|
21
|
-
hidden_field_tag name, '{{promethee.data}}', options
|
22
|
-
end
|
23
|
-
|
24
|
-
# def to_javascript
|
25
|
-
# <<-JAVASCRIPT.html_safe
|
26
|
-
# new Promethee(#{id.to_json}, #{data.to_json})
|
27
|
-
# JAVASCRIPT
|
28
|
-
# end
|
29
|
-
# alias_method :to_js, :to_javascript
|
30
|
-
|
31
|
-
def template(type)
|
32
|
-
ApplicationController.renderer.render partial: "/promethee/#{'components/' unless [:component, :components].include? type.to_s.to_sym }#{type}_edit", locals: { promethee: self }
|
33
|
-
end
|
34
|
-
|
35
|
-
def templates
|
36
|
-
Promethee::Component.types.map{ |type| template type }.join.html_safe
|
37
|
-
end
|
38
|
-
|
39
|
-
def edit
|
40
|
-
ApplicationController.renderer.render partial: 'promethee/edit', locals: { promethee: self }
|
41
|
-
end
|
42
|
-
|
43
|
-
def show
|
44
|
-
ApplicationController.renderer.render partial: 'promethee/show', locals: { promethee: self }
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
|
-
|
49
|
-
def self.id
|
50
|
-
"promethee-#{SecureRandom.hex 10}"
|
51
|
-
end
|
52
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* angular-drag-and-drop-lists v2.1.0
|
3
|
-
*
|
4
|
-
* Copyright (c) 2014 Marcel Juenemann marcel@juenemann.cc
|
5
|
-
* Copyright (c) 2014-2017 Google Inc.
|
6
|
-
* https://github.com/marceljuenemann/angular-drag-and-drop-lists
|
7
|
-
*
|
8
|
-
* License: MIT
|
9
|
-
*/
|
10
|
-
!function(e){function n(e,n){return"all"==n?e:e.filter(function(e){return-1!=n.toLowerCase().indexOf(e)})}var a="application/x-dnd",r="application/json",t="Text",d=["move","copy","link"]
|
11
|
-
e.directive("dndDraggable",["$parse","$timeout",function(e,i){return function(l,f,c){f.attr("draggable","true"),c.dndDisableIf&&l.$watch(c.dndDisableIf,function(e){f.attr("draggable",!e)}),f.on("dragstart",function(s){if(s=s.originalEvent||s,"false"==f.attr("draggable"))return!0
|
12
|
-
o.isDragging=!0,o.itemType=c.dndType&&l.$eval(c.dndType).toLowerCase(),o.dropEffect="none",o.effectAllowed=c.dndEffectAllowed||d[0],s.dataTransfer.effectAllowed=o.effectAllowed
|
13
|
-
var g=l.$eval(c.dndDraggable),u=a+(o.itemType?"-"+o.itemType:"")
|
14
|
-
try{s.dataTransfer.setData(u,angular.toJson(g))}catch(p){var v=angular.toJson({item:g,type:o.itemType})
|
15
|
-
try{s.dataTransfer.setData(r,v)}catch(p){var D=n(d,o.effectAllowed)
|
16
|
-
s.dataTransfer.effectAllowed=D[0],s.dataTransfer.setData(t,v)}}if(f.addClass("dndDragging"),i(function(){f.addClass("dndDraggingSource")},0),s._dndHandle&&s.dataTransfer.setDragImage&&s.dataTransfer.setDragImage(f[0],0,0),e(c.dndDragstart)(l,{event:s}),c.dndCallback){var y=e(c.dndCallback)
|
17
|
-
o.callback=function(e){return y(l,e||{})}}s.stopPropagation()}),f.on("dragend",function(n){n=n.originalEvent||n,l.$apply(function(){var a=o.dropEffect,r={copy:"dndCopied",link:"dndLinked",move:"dndMoved",none:"dndCanceled"}
|
18
|
-
e(c[r[a]])(l,{event:n}),e(c.dndDragend)(l,{event:n,dropEffect:a})}),o.isDragging=!1,o.callback=void 0,f.removeClass("dndDragging"),f.removeClass("dndDraggingSource"),n.stopPropagation(),i(function(){f.removeClass("dndDraggingSource")},0)}),f.on("click",function(n){c.dndSelected&&(n=n.originalEvent||n,l.$apply(function(){e(c.dndSelected)(l,{event:n})}),n.stopPropagation())}),f.on("selectstart",function(){this.dragDrop&&this.dragDrop()})}}]),e.directive("dndList",["$parse",function(e){return function(i,l,f){function c(e){if(!e)return t
|
19
|
-
for(var n=0;n<e.length;n++)if(e[n]==t||e[n]==r||e[n].substr(0,a.length)==a)return e[n]
|
20
|
-
return null}function s(e){return o.isDragging?o.itemType||void 0:e==t||e==r?null:e&&e.substr(a.length+1)||void 0}function g(e){return E.disabled?!1:E.externalSources||o.isDragging?E.allowedTypes&&null!==e?e&&-1!=E.allowedTypes.indexOf(e):!0:!1}function u(e,a){var r=d
|
21
|
-
return a||(r=n(r,e.dataTransfer.effectAllowed)),o.isDragging&&(r=n(r,o.effectAllowed)),f.dndEffectAllowed&&(r=n(r,f.dndEffectAllowed)),r.length?e.ctrlKey&&-1!=r.indexOf("copy")?"copy":e.altKey&&-1!=r.indexOf("link")?"link":r[0]:"none"}function p(){return T.remove(),l.removeClass("dndDragover"),!0}function v(n,a,r,t,d,l){return e(n)(i,{callback:o.callback,dropEffect:r,event:a,external:!o.isDragging,index:void 0!==d?d:D(),item:l||void 0,type:t})}function D(){return Array.prototype.indexOf.call(m.children,h)}function y(){var e
|
22
|
-
return angular.forEach(l.children(),function(n){var a=angular.element(n)
|
23
|
-
a.hasClass("dndPlaceholder")&&(e=a)}),e||angular.element("<li class='dndPlaceholder'></li>")}var T=y()
|
24
|
-
T.remove()
|
25
|
-
var h=T[0],m=l[0],E={}
|
26
|
-
l.on("dragenter",function(e){e=e.originalEvent||e
|
27
|
-
var n=f.dndAllowedTypes&&i.$eval(f.dndAllowedTypes)
|
28
|
-
E={allowedTypes:angular.isArray(n)&&n.join("|").toLowerCase().split("|"),disabled:f.dndDisableIf&&i.$eval(f.dndDisableIf),externalSources:f.dndExternalSources&&i.$eval(f.dndExternalSources),horizontal:f.dndHorizontalList&&i.$eval(f.dndHorizontalList)}
|
29
|
-
var a=c(e.dataTransfer.types)
|
30
|
-
return a&&g(s(a))?void e.preventDefault():!0}),l.on("dragover",function(e){e=e.originalEvent||e
|
31
|
-
var n=c(e.dataTransfer.types),a=s(n)
|
32
|
-
if(!n||!g(a))return!0
|
33
|
-
if(h.parentNode!=m&&l.append(T),e.target!=m){for(var r=e.target;r.parentNode!=m&&r.parentNode;)r=r.parentNode
|
34
|
-
if(r.parentNode==m&&r!=h){var d=r.getBoundingClientRect()
|
35
|
-
if(E.horizontal)var o=e.clientX<d.left+d.width/2
|
36
|
-
else var o=e.clientY<d.top+d.height/2
|
37
|
-
m.insertBefore(h,o?r:r.nextSibling)}}var i=n==t,D=u(e,i)
|
38
|
-
return"none"==D?p():f.dndDragover&&!v(f.dndDragover,e,D,a)?p():(e.preventDefault(),i||(e.dataTransfer.dropEffect=D),l.addClass("dndDragover"),e.stopPropagation(),!1)}),l.on("drop",function(e){e=e.originalEvent||e
|
39
|
-
var n=c(e.dataTransfer.types),a=s(n)
|
40
|
-
if(!n||!g(a))return!0
|
41
|
-
e.preventDefault()
|
42
|
-
try{var d=JSON.parse(e.dataTransfer.getData(n))}catch(l){return p()}if((n==t||n==r)&&(a=d.type||void 0,d=d.item,!g(a)))return p()
|
43
|
-
var y=n==t,T=u(e,y)
|
44
|
-
if("none"==T)return p()
|
45
|
-
var h=D()
|
46
|
-
return f.dndDrop&&(d=v(f.dndDrop,e,T,a,h,d),!d)?p():(o.dropEffect=T,y||(e.dataTransfer.dropEffect=T),d!==!0&&i.$apply(function(){i.$eval(f.dndList).splice(h,0,d)}),v(f.dndInserted,e,T,a,h,d),p(),e.stopPropagation(),!1)}),l.on("dragleave",function(e){e=e.originalEvent||e
|
47
|
-
var n=document.elementFromPoint(e.clientX,e.clientY)
|
48
|
-
m.contains(n)&&!e._dndPhShown?e._dndPhShown=!0:p()})}}]),e.directive("dndNodrag",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart",function(e){e=e.originalEvent||e,e._dndHandle||(e.dataTransfer.types&&e.dataTransfer.types.length||e.preventDefault(),e.stopPropagation())}),n.on("dragend",function(e){e=e.originalEvent||e,e._dndHandle||e.stopPropagation()})}}),e.directive("dndHandle",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart dragend",function(e){e=e.originalEvent||e,e._dndHandle=!0})}})
|
49
|
-
var o={}}(angular.module("dndLists",[]));
|